فهرست منبع

prepare to merge

Simon Hammer 3 سال پیش
والد
کامیت
d8f588139b

+ 11 - 1
app/src/main/java/com/noahvogt/miniprojekt/DataBase/Message.java

@@ -5,6 +5,8 @@ import androidx.room.ColumnInfo;
 import androidx.room.Entity;
 import androidx.room.PrimaryKey;
 
+import com.google.gson.annotations.SerializedName;
+
 /* @Embedded to express entitys together
  *  https://developer.android.com/training/data-storage/room/relationships
  * to learn more */
@@ -18,34 +20,42 @@ public class Message {
     /* name of Columm */
     @NonNull
     @ColumnInfo(name = "to")
+    @SerializedName("to")
     private String mTo ;
 
-
     @ColumnInfo(name = "cc")
+    @SerializedName("cc")
     private String mCc;
 
     @ColumnInfo(name = "bcc")
+    @SerializedName("bcc")
     private String mBcc; //blind carpet copy, not see who sees mails
 
     @NonNull
     @ColumnInfo(name = "fromEmail")
+    @SerializedName("from")
     private String mFrom;
 
     @NonNull
     @ColumnInfo(name = "date")
+    @SerializedName("date")
     private String mDate;
 
     @ColumnInfo(name = "subject")
+    @SerializedName("subject")
     private String mSubject;
 
     @ColumnInfo(name = "textContent")
+    @SerializedName("content")
     private String mTextContent;
 
     @NonNull
     @ColumnInfo(name = "folder")
+    @SerializedName("folder")
     private String mFolder;
 
     @ColumnInfo(name = "seen")
+    @SerializedName("seen")
     private boolean mSeen;
 
     public String getTo(){return this.mTo;}

+ 4 - 1
app/src/main/java/com/noahvogt/miniprojekt/MailServerCredentials.java

@@ -6,6 +6,7 @@ public class MailServerCredentials {
     private String mUsername;
     private String mPassword;
     private int mImapPort;
+    private int mSmtpPort;
     private String mName;
     private String mSignature;
 
@@ -14,16 +15,18 @@ public class MailServerCredentials {
     public String getUsername () {return this.mUsername;}
     public String getPassword () {return this.mPassword;}
     public int getImapPort () {return this.mImapPort;}
+    public int getSmtpPort () {return  this.mSmtpPort;}
     public String getName () {return this.mName;}
     public String getSignature () {return this.mSignature;}
 
-    public MailServerCredentials(String name, String username, String password, String imapHost, String smtpHost, int imapPort, String signature) {
+    public MailServerCredentials(String name, String username, String password, String imapHost, String smtpHost, int imapPort, int smtpPort, String signature) {
         mName = name;
         mUsername = username;
         mPassword = password;
 
         mImapHost = imapHost;
         mImapPort = imapPort;
+        mSmtpPort = smtpPort;
         mSmtpHost = smtpHost;
 
         mSignature = signature;

+ 69 - 30
app/src/main/java/com/noahvogt/miniprojekt/MainActivity.java

@@ -21,6 +21,8 @@ import androidx.fragment.app.DialogFragment;
 
 
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
 import com.noahvogt.miniprojekt.DataBase.Message;
 
 import androidx.fragment.app.Fragment;
@@ -46,7 +48,9 @@ import com.noahvogt.miniprojekt.data.EmailViewModel;
 import com.noahvogt.miniprojekt.data.MailFunctions;
 import com.noahvogt.miniprojekt.workers.DownloadWorker;
 import com.noahvogt.miniprojekt.ui.show.MessageShowFragment;
+import com.noahvogt.miniprojekt.data.BooleanTypeAdapter;
 
+import java.lang.reflect.Type;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
@@ -72,7 +76,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
 
     SharedPreferences preferences, mailServerCredentials;
 
-    /* empty descriptor */
+    /* leave descriptor empty */
     public MainActivity() {}
 
 
@@ -170,7 +174,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         });
 
 
-
         /* Start email Writer*/
         FloatingActionButton message_create_button = findViewById(R.id.messageButton);
         message_create_button.setOnClickListener(new View.OnClickListener() {
@@ -211,9 +214,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                         MessageCreateFragment.replyIntent.getStringExtra(MessageCreateFragment.EXTRA_MESSAGE),
                         "Draft",false);
                 mEmailViewModel.insert(word);
-
-
-
         }
 
 
@@ -238,7 +238,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     public void onClick(View view) { }
 
     public void changeMailServerSettingsDialog(String name, String email, String password) {
-        // define View window
+        /* define View window */
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
         final View changeMailServerSettingsView = getLayoutInflater().inflate(R.layout.mail_credentials_customizer, null);
 
@@ -249,6 +249,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         EditText serverUsernameObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_username_text);
         EditText passwordObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_password_text);
 
+        /* set assumed input in corresponding fields */
         incomingServerObject.setText(MailFunctions.getImapHostFromEmail(email));
         outgoingServerObject.setText(MailFunctions.getSmtpHostFromEmail(email));
         incomingPortObject.setText("993");
@@ -256,6 +257,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         serverUsernameObject.setText(email);
         passwordObject.setText(password);
 
+        /* TODO: add save and cancel button functionality */
+
         /* open View window */
         dialogBuilder.setView(changeMailServerSettingsView);
         dialog = dialogBuilder.create();
@@ -336,6 +339,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                 if (MailFunctions.canConnect(MailFunctions.getImapHostFromEmail(email), email, password) == Boolean.TRUE) {
                     showToast("was able to connect");
 
+<<<<<<< HEAD
                     dialog.dismiss();
                     /*makes request to worker and gives data to it*/
                     mEmailViewModel.applyDownload(builder.build());
@@ -363,41 +367,68 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                         System.out.println(folders.get(i).toString());
                         System.out.println(p);
                     }
-
-                        */
-
-
-
-
+=======
+                    // Intent intent = new Intent(getBaseContext(), ReadInMailsActivity.class);
+                    // intent.putExtra("Email", email);
+                    // intent.putExtra("Password", password);
+                    // startActivity(intent);
+                    // startActivityForResult(intent, MainActivity.NEW_WORD_ACTIVITY_REQUEST_CODE);
+>>>>>>> 5f6a1c7705d3f893ac179bbc5641f5813f31fb08
+
+
+                    // List folders =  MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(MailFunctions.getImapHostFromEmail(email), email, password));
+                    // for (int i = 0; i < folders.size(); i++) {
+                    //     showToast(folders.get(i).toString());
+                    //     // TODO: select right folder to store, Synchronization
+                    //     /*gives list of Message Objects/dictionaries
+                    // List p = MailFunctions.fetchMailsFromBox(
+                    //             MailFunctions.getIMAPConnection(
+                    //                     MailFunctions.getImapHostFromEmail(email), email, password),
+                    //             folders.get(i).toString(), "list");
+                    //     System.out.println(folders.get(i).toString());
+                    //     System.out.println(p);
+                    // }
+
+
+
+                    /* TODO: replace legacy strings down below completely with serialized settings json string */
                     preferencesEditor.putString("name", name);
                     preferencesEditor.putString("email", email);
                     preferencesEditor.putString("password", password);
                     preferencesEditor.apply();
 
-                    /* ArrayList<String> newUserSettings = new ArrayList<String>();
-                    newUserSettings.add(name);
-                    newUserSettings.add(email);
-                    newUserSettings.add(password);
-                    System.out.println("newUserSettings: " + newUserSettings);
-
+                    /* init custom gson with hook to parse booleans correctly */
+                    GsonBuilder builder = new GsonBuilder();
+                    builder.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter());
+                    Gson gson = builder.create();
 
-                    //Retrieve the values
-                    Set<String> oldSet = mailServerCredentials.getStringSet("UserSettings", null);
-
-                    //Set the values
-                    Set<String> newSet = new HashSet<String>();
-                    newSet.addAll(newUserSettings);
-                    credentialsEditor.putStringSet("UserSettings", newSet);
-                    credentialsEditor.commit();*/
-
-                    Gson gson = new Gson();
+                    /* safe mail server login credentials */
                     MailServerCredentials newMailServerCredentials = new MailServerCredentials(
-                            name, password, email, MailFunctions.getImapHostFromEmail(email), MailFunctions.getSmtpHostFromEmail(email), 993, "");
+                            name, email, password, MailFunctions.getImapHostFromEmail(email), MailFunctions.getSmtpHostFromEmail(email), 993, 587, "");
                     String newCredentialsJson = gson.toJson(newMailServerCredentials);
                     System.out.println(newCredentialsJson);
                     credentialsEditor.putString("data", newCredentialsJson);
                     credentialsEditor.apply();
 
+                    /* download all messages from mail server */
+
+                    /* read login credentials from SharedPreferences */
+                    SharedPreferences credentialsReader = getSharedPreferences("UserPreferences", Context.MODE_PRIVATE);
+                    String readJsonData = credentialsReader.getString("data", "");
+                    MailServerCredentials readMailServerCredentials = gson.fromJson(readJsonData, MailServerCredentials.class);
+
+                    /* fetch and print draft messages */
+                    String fetchedMails = MailFunctions.fetchMailsFromBox(MailFunctions.getIMAPConnection(newMailServerCredentials.getImapHost(),
+                            newMailServerCredentials.getUsername(), newMailServerCredentials.getPassword(), newMailServerCredentials.getImapPort()), "Drafts");
+                    System.out.println(fetchedMails);
+
+                    /* parse messages in arraylist of Message class and loop through it */
+                    Type messageType = new TypeToken<ArrayList<Message>>(){}.getType();
+                    ArrayList<Message> messages = gson.fromJson(fetchedMails, messageType);
+                    for (int i = 0; i < messages.size(); i++) {
+                        System.out.println("Message #" + i);
+                        System.out.println(messages.get(i).toString());
+                    }
                 } else {
                     askForChangeMailServerSettingsDialog(name, email, password);
                 }
@@ -405,8 +436,17 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         });
 
 
+<<<<<<< HEAD
         newemail_cancel_button.setOnClickListener(v -> dialog.dismiss());
 
+=======
+        newemail_cancel_button.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dialog.dismiss();
+            }
+        });
+>>>>>>> 5f6a1c7705d3f893ac179bbc5641f5813f31fb08
     }
 
 
@@ -424,7 +464,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
 
     @Override
     public void selectedMessage(Message messages, EmailViewModel emailViewModel) {
-
         DialogFragment dialog = MessageShowFragment.newInstance(messages, mEmailViewModel);
         dialog.show(getSupportFragmentManager(), "tag");
 

+ 1 - 3
app/src/main/java/com/noahvogt/miniprojekt/MessageCreateFragment.java

@@ -117,7 +117,7 @@ public class MessageCreateFragment extends DialogFragment implements PopupMenu.O
 
         /* TODO: add cc + bcc functionality */
 
-        /* dosen't wotk cause Activity is not extendet and used as variable */
+        /* doesn't work cause Activity is not extended and used as variable */
 
 
 
@@ -228,8 +228,6 @@ public class MessageCreateFragment extends DialogFragment implements PopupMenu.O
                 } else {
                     Toast.makeText(getActivity(), "Please check your input", Toast.LENGTH_SHORT).show();
                 }
-
-                /* TODO: implement actual sending functionality */
             }
         });
 

+ 26 - 0
app/src/main/java/com/noahvogt/miniprojekt/data/BooleanTypeAdapter.java

@@ -0,0 +1,26 @@
+package com.noahvogt.miniprojekt.data;
+
+import java.lang.reflect.Type;
+import com.google.gson.*;
+public class BooleanTypeAdapter implements JsonDeserializer<Boolean> {
+    public Boolean deserialize(JsonElement json, Type typeOfT,
+                               JsonDeserializationContext context) throws JsonParseException {
+        if (((JsonPrimitive) json).isBoolean()) {
+            return json.getAsBoolean();
+        }
+        if (((JsonPrimitive) json).isString()) {
+            String jsonValue = json.getAsString();
+            if (jsonValue.equalsIgnoreCase("true")) {
+                return true;
+            } else if (jsonValue.equalsIgnoreCase("false")) {
+                return false;
+            } else {
+                return null;
+            }
+        }
+
+        int code = json.getAsInt();
+        return code == 0 ? false :
+                code == 1 ? true : null;
+    }
+}

+ 9 - 2
app/src/main/java/com/noahvogt/miniprojekt/data/MailFunctions.java

@@ -22,10 +22,10 @@ public class MailFunctions {
         pythonMailFunctions.callAttr("sendStarttls", host, sendingMail, receivingMail, password, message, subject, 587, cc, bcc);
     }
 
-    public static PyObject getIMAPConnection(String host, String email, String password) {
+    public static PyObject getIMAPConnection(String host, String email, String password, int port) {
         Python python = Python.getInstance();
         PyObject pythonMailFunctions = python.getModule("mailFunctions");
-        return pythonMailFunctions.callAttr("connect", host, email, password, 993);
+        return pythonMailFunctions.callAttr("connect", host, email, password, port);
     }
 
     public static List listMailboxes(PyObject IMAPConnection) {
@@ -34,12 +34,19 @@ public class MailFunctions {
         return pythonMailFunctions.callAttr("listMailboxes", IMAPConnection).asList();
     }
 
+<<<<<<< HEAD
     public static PyObject fetchMailsFromBox(PyObject IMAPConnection, String Folder) {
         Python python = Python.getInstance();
         PyObject pythonMailFunctions = python.getModule("mailFunctions");
         System.out.println(pythonMailFunctions);
         System.out.println("YAAAAAAYYYY " + pythonMailFunctions.callAttr("fetchMails", IMAPConnection, Folder).toString() + "\n For REAAALLL");
         return pythonMailFunctions.callAttr("fetchMails", IMAPConnection, Folder);
+=======
+    public static String fetchMailsFromBox(PyObject IMAPConnection, String Folder) {
+        Python python = Python.getInstance();
+        PyObject pythonMailFunctions = python.getModule("mailFunctions");
+        return pythonMailFunctions.callAttr("fetchMails", IMAPConnection, Folder).toString();
+>>>>>>> 5f6a1c7705d3f893ac179bbc5641f5813f31fb08
     }
 
 

+ 47 - 0
app/src/main/java/com/noahvogt/miniprojekt/data/ReadInMailsActivity.java

@@ -0,0 +1,47 @@
+package com.noahvogt.miniprojekt.data;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.noahvogt.miniprojekt.R;
+
+import java.util.List;
+
+public class ReadInMailsActivity extends AppCompatActivity {
+
+    String mEmail;
+    String mPassword;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState){
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        Intent intent = getIntent();
+        mEmail = intent.getStringExtra("Email");
+        mPassword = intent.getStringExtra("Password");
+
+        Toast.makeText(getBaseContext(),"Probe Connection ...", Toast.LENGTH_SHORT).show();
+        if (MailFunctions.canConnect(MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword) == Boolean.TRUE) {
+            //showToast("was able to connect");
+
+            List folders = MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword, 993));
+            for (int i = 0; i < folders.size(); i++) {
+                //showToast(folders.get(i).toString());
+                // TODO: select right folder to store, Synchronization
+                /*gives list of Message Objects/dictionaries */
+                //List p = MailFunctions.fetchMailsFromBox(
+                //        MailFunctions.getIMAPConnection(
+                //                MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword),
+                //        folders.get(i).toString());
+                //System.out.println(folders.get(i).toString());
+                //System.out.println(p);
+            }
+        }
+
+    }
+}

+ 4 - 18
app/src/main/python/mailFunctions.py

@@ -1,8 +1,6 @@
 import imaplib, smtplib, ssl, email, os, json
 from itertools import chain
 
-
-
 # format raw string you get from fetching mails
 def stringCompiling(inputIterable):
     # remove first nested iterables
@@ -81,6 +79,7 @@ def listMailboxes(connection):
     connection.logout()
     return formatted_mailbox_list
 
+
     # check that there are no bytes anymore that cannot be dumped into a json
 def verifyNoBytes(messages, output_list):
     for messages in output_list:
@@ -112,7 +111,7 @@ def fetchMails(connection, inbox):
     #N = 3
     # total number of emails
     messages_int = int(messages[0])
-    #print("message_int------\n" + str(messages_int))
+    print("message_int------\n" + str(messages_int))
 
     output_list = []
 
@@ -169,21 +168,7 @@ def fetchMails(connection, inbox):
             output_dict['to'] = stringCompiling(raw_to)
             output_dict['date'] = stringCompiling(raw_date)
             output_dict['content'] = primitive_body
-            if seentype == '(SEEN)':
-                output_dict['seen'] = "True"
-            else:
-                output_dict['seen'] = "False"
-                # make sure the fetch command doesn't add a SEEN flag
-                connection.store(num, '-FLAGS', '(\Seen)')
-
-
-            output_dict['subject'] = subject
-            output_dict['from'] = stringCompiling(raw_from)
-            output_dict['cc'] = stringCompiling(raw_cc)
-            output_dict['bcc'] = stringCompiling(raw_bcc)
-            output_dict['to'] = stringCompiling(raw_to)
-            output_dict['date'] = stringCompiling(raw_date)
-            output_dict['content'] = primitive_body
+            output_dict['folder'] = inbox
             if seentype == '(SEEN)':
                 output_dict['seen'] = "True"
             else:
@@ -203,6 +188,7 @@ def fetchMails(connection, inbox):
 
     return json.dumps(output_list)
 
+
 def sendStarttls(host, sendingMail, receivingMail, password, message="", subject="", port=587, cc=[], bcc=[]):
     context = ssl.create_default_context()