Browse Source

added Informationwindow, delete all Folder option

Simon Hammer 3 years ago
parent
commit
eef8a8148b
22 changed files with 361 additions and 380 deletions
  1. 36 15
      app/src/main/java/com/noahvogt/miniprojekt/DataBase/EmailRepository.java
  2. 0 52
      app/src/main/java/com/noahvogt/miniprojekt/DataBase/EmailRoomDatabase.java
  3. 28 14
      app/src/main/java/com/noahvogt/miniprojekt/DataBase/MessageDao.java
  4. 59 87
      app/src/main/java/com/noahvogt/miniprojekt/MainActivity.java
  5. 1 0
      app/src/main/java/com/noahvogt/miniprojekt/data/CustomAdapter.java
  6. 23 0
      app/src/main/java/com/noahvogt/miniprojekt/data/DeleteThread.java
  7. 63 2
      app/src/main/java/com/noahvogt/miniprojekt/data/EmailViewModel.java
  8. 10 1
      app/src/main/java/com/noahvogt/miniprojekt/data/MailFunctions.java
  9. 2 1
      app/src/main/java/com/noahvogt/miniprojekt/ui/archive/ArchiveFragment.java
  10. 2 0
      app/src/main/java/com/noahvogt/miniprojekt/ui/gallery/GalleryFragment.java
  11. 2 0
      app/src/main/java/com/noahvogt/miniprojekt/ui/home/HomeFragment.java
  12. 1 0
      app/src/main/java/com/noahvogt/miniprojekt/ui/show/MessageShowFragment.java
  13. 2 0
      app/src/main/java/com/noahvogt/miniprojekt/ui/slideshow/DraftFragment.java
  14. 2 0
      app/src/main/java/com/noahvogt/miniprojekt/ui/spam/SpamFragment.java
  15. 41 30
      app/src/main/java/com/noahvogt/miniprojekt/workers/DownloadWorker.java
  16. 15 33
      app/src/main/python/mailFunctions.py
  17. 46 0
      app/src/main/res/layout/welcome.xml
  18. 6 2
      app/src/main/res/menu/main.xml
  19. 1 0
      app/src/main/res/values/dimens.xml
  20. 21 1
      app/src/main/res/values/strings.xml
  21. 0 32
      patches/intent.patch
  22. 0 110
      tests/mailFunctions.py

+ 36 - 15
app/src/main/java/com/noahvogt/miniprojekt/DataBase/EmailRepository.java

@@ -9,11 +9,14 @@ import java.util.List;
 public class EmailRepository {
 
     private MessageDao messageDao;
-    private final LiveData<List<Message>> mDraftMessage;
-    private LiveData<List<Message>> mInboxMessage;
-    private LiveData<List<Message>> mSentMessage;
-    private LiveData<List<Message>> mArchiveMessage;
-    private LiveData<List<Message>> mSpamMessage;
+    private final LiveData<List<Message>> mDraftLiveMessage;
+    private LiveData<List<Message>> mInboxLiveMessage;
+    private LiveData<List<Message>> mSentLiveMessage;
+    private LiveData<List<Message>> mArchiveLiveMessage;
+    private LiveData<List<Message>> mSpamLiveMessage;
+
+    private List<Message> mAllMessages;
+
 
 
     // Note that in order to unit test the WordRepository, you have to remove the Application
@@ -24,34 +27,40 @@ public class EmailRepository {
     public EmailRepository(Application application) {
         EmailRoomDatabase db = EmailRoomDatabase.getDatabase(application);
         messageDao = db.messageDao();
-        mInboxMessage = messageDao.getInboxMessages();
-        mDraftMessage = messageDao.getDraftMessages();
-        mArchiveMessage = messageDao.getArchiveMessages();
-        mSentMessage = messageDao.getSentMessages();
-        mSpamMessage = messageDao.getSpamMessages();
+        mInboxLiveMessage = messageDao.getLiveInboxMessages();
+        mDraftLiveMessage = messageDao.getLiveDraftMessages();
+        mArchiveLiveMessage = messageDao.getLiveArchiveMessages();
+        mSentLiveMessage = messageDao.getLiveSentMessages();
+        mSpamLiveMessage = messageDao.getLiveSpamMessages();
+        //mAllMessages = messageDao.getAllMessages();
     }
 
     // Room executes all queries on a separate thread.
     // Observed LiveData will notify the observer when the data has changed.
     /* returns all messages of with tag Draft */
     public LiveData<List<Message>> getDraftMessages() {
-        return mDraftMessage;
+        return mDraftLiveMessage;
     }
 
-    public LiveData<List<Message>> getSpamMessage(){return mSpamMessage;}
+    public LiveData<List<Message>> getSpamMessage(){return mSpamLiveMessage;}
 
     public LiveData<List<Message>> getInboxMessages() {
-        return mInboxMessage;
+        return mInboxLiveMessage;
     }
 
     public LiveData<List<Message>> getSentMessages() {
-        return mSentMessage;
+        return mSentLiveMessage;
     }
 
     public LiveData<List<Message>> getArchiveMessages() {
-        return mArchiveMessage;
+        return mArchiveLiveMessage;
     }
 
+    /* problems with main Thread
+    public List<Message> getAllMessages(){ return mAllMessages;}
+
+     */
+
     // You must call this on a non-UI thread or your app will throw an exception. Room ensures
     // that you're not doing any long running operations on the main thread, blocking the UI.
     public void insert(Message message) {
@@ -66,6 +75,18 @@ public class EmailRepository {
         });
     }
 
+    public void deleteFolder(final String folder){
+        EmailRoomDatabase.databaseWriteExecutor.execute(() -> {
+            messageDao.deleteFolder(folder);
+        });
+    }
+
+    public void deleteAll(final String folder){
+        EmailRoomDatabase.databaseWriteExecutor.execute(() -> {
+            messageDao.deleteAll(folder);
+        });
+    }
+
     public void updateMessage(final int id, String folder){
         EmailRoomDatabase.databaseWriteExecutor.execute(() -> {
             messageDao.updateMessage(id ,folder);

+ 0 - 52
app/src/main/java/com/noahvogt/miniprojekt/DataBase/EmailRoomDatabase.java

@@ -65,58 +65,6 @@ public abstract class EmailRoomDatabase extends RoomDatabase{
                 // Populate the database in the background.
                 // If you want to start with more words, just add them.
                 MessageDao dao = INSTANCE.messageDao();
-                dao.deleteAll();
-
-
-                Message word = new Message("Noah", null , null,
-                        "Samuel", "31.09.21", "inboxTest", "I Try my best", "Inbox",
-                        true);
-                dao.insert(word);
-
-                word = new Message("Pueblo", "my Man, your Girl", null,
-                        "Escobar", "31.02.21", "DateSortTest", "I hope the Sorting works", "Inbox",
-                        true);
-                dao.insert(word);
-
-                word = new Message("Pueblo", "my Man, your Girl", null,
-                        "Escobar", "31.02.21", "VariableTest", "I hope the Sorting works", "Inbox",
-                        true);
-                dao.insert(word);
-
-                word = new Message("Again", null, null, "Again", "31.09.21", "DateTest",
-                        "Does this Date work know?", "Inbox", true);
-                dao.insert(word);
-
-
-                word = new Message("Noah", null, null,
-                       "arldemeier", "bobo", "sentTest", "i could cry", "Sent",
-                       true);
-                dao.insert(word);
-
-
-
-               /*
-               for (int i = 1; i < 20; i++){
-                   word = new Message("Simon", null, null,
-                           "Hans", "tomorrow", "inbox20", "lets goo","Inbox",
-                           true);
-                   dao.insert(word);
-               }
-
-
-                word = new Message("Simon", null, null,
-                        "Maurice", "yesterday", "ArchiveTest", "lets goo","Archive",
-                        true);
-                dao.insert(word);
-
-                word = new Message("Simon", null, null,
-                        "Lenny", "tomorrow", "SpamTest", "lets goo","Spam",
-                        true);
-                dao.insert(word);
-
-
-                */
-
 
             });
         }

+ 28 - 14
app/src/main/java/com/noahvogt/miniprojekt/DataBase/MessageDao.java

@@ -19,46 +19,60 @@ public interface MessageDao {
     @Insert(onConflict = OnConflictStrategy.IGNORE)
     void insert(Message message);
 
-    @Query("DELETE FROM message_table")
-    void deleteAll();
+    @Query("DELETE FROM message_table WHERE folder = :folder")
+    void deleteFolder(String folder);
 
     @Delete(entity = Message.class)
     void delete(Message message);
 
+    @Delete(entity = Message.class)
+    void deleteAll(String folder);
+
     @Query("UPDATE message_table SET folder = :folder WHERE id = :id")
     void updateMessage(int id, String folder);
 
-    @Query("DELETE FROM message_table WHERE subject='DELETE'")
-    void deleteNewMessage();
 
+    @Query("SELECT * FROM message_table ORDER BY id ASC")
+    List<Message> getAllMessages();
 
-    @Query("SELECT * FROM message_table")
-    LiveData<List<Message>> getAllMessages();
-
-    /*gets messages all messages ordered by date
-    * !IMPORTANT I don't know in which direction */
+    /*gets messages all messages ordered by date */
     @Query("SELECT * FROM message_table ORDER BY date ASC")
     LiveData<List<Message>> getDateMessages();
 
     /* get Draft messages*/
     @Query("SELECT * FROM message_table WHERE folder LIKE 'Draft' ORDER BY date DESC")
-    LiveData<List<Message>> getDraftMessages();
+    LiveData<List<Message>> getLiveDraftMessages();
+
+    @Query("SELECT * FROM message_table WHERE folder LIKE 'Draft' ORDER BY date DESC")
+    List<Message> getDraftMessages();
 
     /* get Inbox messages*/
     @Query("SELECT * FROM message_table WHERE folder LIKE 'Inbox' ORDER BY date DESC")
-    LiveData<List<Message>> getInboxMessages();
+    LiveData<List<Message>> getLiveInboxMessages();
+
+    @Query("SELECT * FROM message_table WHERE folder LIKE 'Inbox' ORDER BY date DESC")
+    List<Message> getInboxMessages();
 
     /* get Sent messages*/
     @Query("SELECT * FROM message_table WHERE folder LIKE 'Sent' ORDER BY date DESC")
-    LiveData<List<Message>> getSentMessages();
+    LiveData<List<Message>> getLiveSentMessages();
+
+    @Query("SELECT * FROM message_table WHERE folder LIKE 'Sent' ORDER BY date DESC")
+    List<Message> getSentMessages();
 
     /* get Archive messages*/
     @Query("SELECT * FROM message_table WHERE folder LIKE 'Archive' ORDER BY date DESC")
-    LiveData<List<Message>> getArchiveMessages();
+    LiveData<List<Message>> getLiveArchiveMessages();
+
+    @Query("SELECT * FROM message_table WHERE folder LIKE 'Archive' ORDER BY date DESC")
+    List<Message> getArchiveMessages();
 
     /* get Spam messages*/
     @Query("SELECT * FROM message_table WHERE folder LIKE 'Spam' ORDER BY date DESC")
-    LiveData<List<Message>> getSpamMessages();
+    LiveData<List<Message>> getLiveSpamMessages();
+
+    @Query("SELECT * FROM message_table WHERE folder LIKE 'Spam' ORDER BY date DESC")
+    List<Message> getSpamMessages();
 
 
 }

+ 59 - 87
app/src/main/java/com/noahvogt/miniprojekt/MainActivity.java

@@ -11,6 +11,7 @@ import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.PopupMenu;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import androidx.appcompat.app.AlertDialog;
@@ -44,6 +45,7 @@ import com.chaquo.python.Python;
 import com.chaquo.python.android.AndroidPlatform;
 import com.google.android.material.snackbar.Snackbar;
 import com.noahvogt.miniprojekt.data.CustomAdapter;
+import com.noahvogt.miniprojekt.data.DeleteThread;
 import com.noahvogt.miniprojekt.data.EmailViewModel;
 import com.noahvogt.miniprojekt.data.MailFunctions;
 import com.noahvogt.miniprojekt.workers.DownloadWorker;
@@ -62,7 +64,7 @@ import com.google.gson.Gson;
 
 import static com.noahvogt.miniprojekt.R.id.drawer_layout;
 
-public class MainActivity extends AppCompatActivity implements View.OnClickListener, CustomAdapter.SelectedMessage, PopupMenu.OnMenuItemClickListener {
+public class MainActivity extends AppCompatActivity implements View.OnClickListener, CustomAdapter.SelectedMessage {
 
     private AppBarConfiguration mAppBarConfiguration;
 
@@ -72,6 +74,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     public static final String nameData = "Name";
     public static EmailViewModel mEmailViewModel;
     public static RecyclerView recyclerView;
+    private Boolean clicked = false;
 
     private AlertDialog dialog;
     private EditText newemail_name, newemail_email, newemail_password; /* may not be private */
@@ -106,11 +109,20 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
 
         /* define button listeners */
 
+        final Boolean[] clicked = {false};
         Button add_email_button = (Button) findViewById(R.id.addEmailButton);
         add_email_button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                createNewEmailDialog();
+                if (!clicked[0]){
+
+                    createInformation(true);
+                    clicked[0] = true;
+
+
+                } else {
+                    createNewEmailDialog();
+                }
             }
         });
 
@@ -291,8 +303,36 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         dialog.show();
     }
 
+    public void createInformation(boolean button){
+        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
+        final View emailPopupView = getLayoutInflater().inflate(R.layout.welcome, null);
+
+        /* init text field variables */
+        TextView shedText = emailPopupView.findViewById(R.id.backgroun);
+        Button okayButton = emailPopupView.findViewById(R.id.okay_button);
+
+        /* open View window */
+        dialogBuilder.setView(emailPopupView);
+        dialog = dialogBuilder.create();
+        dialog.show();
+
+        okayButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dialog.dismiss();
+                if (button){
+                    createNewEmailDialog();
+                }
+            }
+        });
+    }
+
     public static MailServerCredentials newMailServerCredentials;
     public static SharedPreferences.Editor credentialsEditor;
+    String name;
+    String email;
+    String password;
+    Data.Builder builder;
 
     public void createNewEmailDialog(){
         /* define View window */
@@ -328,11 +368,11 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
             public void onClick(View v) {
 
                 /* store user input (only needed for DEBUGGING) */
-                String name = newemail_name.getText().toString();
-                String email = newemail_email.getText().toString();
-                String password = newemail_password.getText().toString();
+                name = newemail_name.getText().toString();
+                email = newemail_email.getText().toString();
+                password = newemail_password.getText().toString();
 
-                Data.Builder builder = new Data.Builder();
+                builder = new Data.Builder();
                 builder.putString(emailData, email)
                         .putString(passwordData, password)
                         .putString(nameData, name);
@@ -345,96 +385,16 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                 if (MailFunctions.canConnect(MailFunctions.getImapHostFromEmail(email), email, password) == Boolean.TRUE) {
                     showToast("was able to connect");
 
-
-                    /*
-                    Intent intent = new Intent(getBaseContext(), DownloadWorker.class);
-                    intent.putExtra("Email", email);
-                    intent.putExtra("Password", password);
-                    startActivity(intent);
-
-                     */
-                    //startActivityForResult(intent, MainActivity.NEW_WORD_ACTIVITY_REQUEST_CODE);
-
-
-                    /*
-                    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);
-                    }
-=======
-                    // 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();
 
-                    /* init custom gson with hook to parse booleans correctly */
-                    GsonBuilder gsonBuilder = new GsonBuilder();
-                    gsonBuilder.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter());
-                    Gson gson = gsonBuilder.create();
-
-                    /* safe mail server login credentials */
-                    newMailServerCredentials = new MailServerCredentials(
-                            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);
-
                     dialog.dismiss();
                     /*makes request to worker and gives data to it*/
                     mEmailViewModel.applyDownload(builder.build());
 
-                    /* 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);
                 }
@@ -467,9 +427,21 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     }
 
     @Override
-    public boolean onMenuItemClick(MenuItem item) {
+    public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()){
+            case R.id.action_information:
+                createInformation(false);
+                return true;
             case R.id.action_refresh:
+                mEmailViewModel.applyDownload(builder.build());
+                return true;
+            case R.id.action_deletefolder:
+                showToast("clicked delete all");
+                mEmailViewModel.getAll(false);
+                for (int delete = 0; delete < mEmailViewModel.getAll(false).size(); delete++){
+                    mEmailViewModel.deleteMessage(mEmailViewModel.getAll(false).get(delete));
+                }
+                mEmailViewModel.getAll(true);
 
                 return true;
         }

+ 1 - 0
app/src/main/java/com/noahvogt/miniprojekt/data/CustomAdapter.java

@@ -39,6 +39,7 @@ public class CustomAdapter extends ListAdapter<Message, EmailViewHolder> {
 
     /*get List from adapter which is shown*/
     public void getList(List<Message> messageList){
+        System.out.println("GetList Adapter Loop");
         this.messageList = messageList;
     }
 

+ 23 - 0
app/src/main/java/com/noahvogt/miniprojekt/data/DeleteThread.java

@@ -0,0 +1,23 @@
+package com.noahvogt.miniprojekt.data;
+
+import android.os.AsyncTask;
+
+import static com.noahvogt.miniprojekt.MainActivity.mEmailViewModel;
+
+public class DeleteThread extends AsyncTask<Boolean, Void, Void> implements Runnable {
+
+    @Override
+    public void run() {
+       /* for (int delete = 0; delete <= mEmailViewModel.getAllMessages().size(); delete++){
+            mEmailViewModel.deleteMessage(mEmailViewModel.getAllMessages().get(delete));
+        }
+
+        */
+    }
+
+    @Override
+    protected Void doInBackground(Boolean... booleans) {
+
+        return null;
+    }
+}

+ 63 - 2
app/src/main/java/com/noahvogt/miniprojekt/data/EmailViewModel.java

@@ -12,6 +12,7 @@ import com.noahvogt.miniprojekt.DataBase.EmailRepository;
 import com.noahvogt.miniprojekt.DataBase.Message;
 import com.noahvogt.miniprojekt.workers.DownloadWorker;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class EmailViewModel extends AndroidViewModel {
@@ -19,12 +20,19 @@ public class EmailViewModel extends AndroidViewModel {
     private EmailRepository mEmailRepository;
     private WorkManager mWorkManager;
 
+    public List<Message> all =  new ArrayList<>();
     private LiveData<List<Message>> mDraftMessage;
     private LiveData<List<Message>> mInboxMessage;
     private LiveData<List<Message>> mSentMessage;
     private LiveData<List<Message>> mArchiveMessage;
     private LiveData<List<Message>> mSpamMessage;
 
+    String sent;
+    String spam;
+    String archive;
+    String inbox;
+    String drafts;
+
     public EmailViewModel(Application application) {
         super(application);
         mWorkManager = WorkManager.getInstance(application);
@@ -46,10 +54,61 @@ public class EmailViewModel extends AndroidViewModel {
         mWorkManager.enqueue(downloadRequest);
     }
 
-    public LiveData<List<Message>> getDraftMessage(){
-        return mDraftMessage;
+    public void setListAll(List<Message> messageListAll, String fragment){
+        System.out.println("setListAll: size messageListAll: " + messageListAll.size());
+        if (sent == null && fragment.equals("Sent")){
+            for (int i = 0; i < messageListAll.size(); i++) {
+                this.all.add(messageListAll.get(i));
+            }
+            sent = fragment;
+        }
+
+        if (drafts == null && fragment.equals("Drafts")){
+            for (int i = 0; i < messageListAll.size(); i++) {
+                this.all.add(messageListAll.get(i));
+            }
+            drafts = fragment;
+        }
+
+        if (archive == null && fragment.equals("Archive")){
+            for (int i = 0; i < messageListAll.size(); i++) {
+                this.all.add(messageListAll.get(i));
+            }
+            archive = fragment;
+        }
+        if (inbox == null && fragment.equals("Inbox")){
+            for (int i = 0; i < messageListAll.size(); i++) {
+                this.all.add(messageListAll.get(i));
+            }
+            inbox = fragment;
+        }
+        if (spam == null && fragment.equals("Spam")){
+            for (int i = 0; i < messageListAll.size(); i++) {
+                this.all.add(messageListAll.get(i));
+            }
+            spam = fragment;
+        }
+        System.out.println("SetListAll: List of All: " + all);
+        System.out.println("setListAll: size all: " + all.size());
+    }
+
+    public List<Message> getAll(boolean status){
+        System.out.println("getAll: Size of all Lists " + all.size());
+        for (int i = 0; i < all.size(); i++) {
+            System.out.println("EmailModel all list " + all.get(i) + "\n Size: " + all.size());
+        }
+        if (status){
+            List<Message> emptyAll;
+            emptyAll = all;
+            all.clear();
+            System.out.println("Size cleared list:" + all.size());
+            return emptyAll;
+        }
+        return all;
     }
 
+    public LiveData<List<Message>> getDraftMessage(){ return mDraftMessage; }
+
     public LiveData<List<Message>> getSpamMessage(){return mSpamMessage;}
 
     public LiveData<List<Message>> getInboxMessage(){ return mInboxMessage;}
@@ -58,6 +117,8 @@ public class EmailViewModel extends AndroidViewModel {
 
     public LiveData<List<Message>> getArchiveMessage(){ return mArchiveMessage;}
 
+    //public List<Message> getAllMessages(){return mAllMessages;}
+
     public void insert(Message message){mEmailRepository.insert(message);}
 
     public void deleteMessage(Message message){mEmailRepository.deleteMessage(message);}

+ 10 - 1
app/src/main/java/com/noahvogt/miniprojekt/data/MailFunctions.java

@@ -65,7 +65,12 @@ public class MailFunctions {
         }else if (topLevelHost.endsWith("yahoo.com")){
             return "imap.mail.yahoo.com";
 
-        } else {
+        } else if (topLevelHost.endsWith("gmx.ch")){
+            return "imap.gmx.net";
+        } else if (topLevelHost.endsWith("gmx.de")){
+            return "imap.gmx.net";
+        }
+        else {
             return "imap." + topLevelHost;
         }
     }
@@ -77,6 +82,10 @@ public class MailFunctions {
 
         } else if (topLevelHost.endsWith("yahoo.com")){
             return "smtp.mail.yahoo.com";
+        }else if (topLevelHost.endsWith("gmx.ch")){
+            return  "mail.gmx.net";
+        }else if (topLevelHost.endsWith("gmx.de")) {
+            return "mail.gmx.net";
         }
         else {
             return "smtp." + topLevelHost;

+ 2 - 1
app/src/main/java/com/noahvogt/miniprojekt/ui/archive/ArchiveFragment.java

@@ -49,7 +49,8 @@ public class ArchiveFragment extends Fragment implements CustomAdapter.SelectedM
             adapter.submitList(messages);
             /*get List of Message to show them onClick */
             adapter.getList(messages);
-
+            /*gives list of messages to EmailViewModel */
+            MainActivity.mEmailViewModel.setListAll(messages, "Archive");
         });
 
 

+ 2 - 0
app/src/main/java/com/noahvogt/miniprojekt/ui/gallery/GalleryFragment.java

@@ -64,6 +64,8 @@ public class GalleryFragment extends Fragment implements CustomAdapter.SelectedM
             adapter.submitList(messages);
             /*get List of Message to show them onClick */
             adapter.getList(messages);
+            /*gives list of messages to EmailViewModel */
+            MainActivity.mEmailViewModel.setListAll(messages, "Sent");
         });
 
         return root;

+ 2 - 0
app/src/main/java/com/noahvogt/miniprojekt/ui/home/HomeFragment.java

@@ -53,6 +53,8 @@ public class HomeFragment extends Fragment implements CustomAdapter.SelectedMess
             adapter.submitList(messages);
             /*get List of Message to show them onClick */
             adapter.getList(messages);
+            /*gives list of messages to EmailViewModel */
+            MainActivity.mEmailViewModel.setListAll(messages, "Inbox");
 
         });
 

+ 1 - 0
app/src/main/java/com/noahvogt/miniprojekt/ui/show/MessageShowFragment.java

@@ -145,6 +145,7 @@ public class MessageShowFragment extends DialogFragment implements PopupMenu.OnM
         switch (item.getItemId()) {
             case R.id.create_message_delete:
                 Toast.makeText(getActivity(), "item delete clicked", Toast.LENGTH_LONG).show();
+                //mEmailViewModel.deleteFolder("Inbox");
                 mEmailViewModel.deleteMessage(mCurrent);
                 return true;
             case R.id.create_message_spam:

+ 2 - 0
app/src/main/java/com/noahvogt/miniprojekt/ui/slideshow/DraftFragment.java

@@ -50,6 +50,8 @@ public class  DraftFragment extends Fragment implements CustomAdapter.SelectedMe
             adapter.submitList(messages);
             /*get List of Message to show them onClick */
             adapter.getList(messages);
+            /*gives list of messages to EmailViewModel */
+            MainActivity.mEmailViewModel.setListAll(messages, "Drafts");
 
         });
 

+ 2 - 0
app/src/main/java/com/noahvogt/miniprojekt/ui/spam/SpamFragment.java

@@ -49,6 +49,8 @@ public class SpamFragment extends Fragment implements CustomAdapter.SelectedMess
             adapter.submitList(messages);
             /*get List of Message to show them onClick */
             adapter.getList(messages);
+            /*gives list of messages to EmailViewModel */
+            MainActivity.mEmailViewModel.setListAll(messages, "Spam");
 
         });
 

+ 41 - 30
app/src/main/java/com/noahvogt/miniprojekt/workers/DownloadWorker.java

@@ -3,8 +3,10 @@ package com.noahvogt.miniprojekt.workers;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.util.Log;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
 import androidx.work.Worker;
 import androidx.work.WorkerParameters;
 
@@ -16,11 +18,13 @@ import com.noahvogt.miniprojekt.DataBase.Message;
 import com.noahvogt.miniprojekt.MailServerCredentials;
 import com.noahvogt.miniprojekt.MainActivity;
 import com.noahvogt.miniprojekt.data.BooleanTypeAdapter;
+import com.noahvogt.miniprojekt.data.DeleteThread;
 import com.noahvogt.miniprojekt.data.MailFunctions;
 
 import org.jetbrains.annotations.NotNull;
 
 import java.lang.reflect.Type;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -29,6 +33,8 @@ import static com.noahvogt.miniprojekt.MainActivity.newMailServerCredentials;
 
 public class DownloadWorker extends Worker {
 
+    //TODO: upload every data to server
+
     public DownloadWorker(
             @NonNull Context appContext,
             @NonNull WorkerParameters workerParameters){
@@ -47,21 +53,6 @@ public class DownloadWorker extends Worker {
                 String mPassword = getInputData().getString(MainActivity.passwordData);
                 String mName = getInputData().getString(MainActivity.nameData);
 
-                    /*List folders = MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword, 993));
-                    System.out.println(folders);
-                    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 */
-                        /*String messages = MailFunctions.fetchMailsFromBox(
-                                MailFunctions.getIMAPConnection(
-                                        MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword, 993),
-                                folders.get(i).toString());
-                        System.out.println(folders.get(i).toString());
-                        System.out.println(messages);
-
-                         */
-
                 /* init custom gson with hook to parse booleans correctly */
                 GsonBuilder gsonBuilder = new GsonBuilder();
                 gsonBuilder.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter());
@@ -83,21 +74,41 @@ public class DownloadWorker extends Worker {
                 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()), "INBOX");
-                System.out.println("Yaaay" + fetchedMails + "\n MAANCBJC");
-
-                /* 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++) {
-                    Message message = messages.get(i);
-                    mEmailViewModel.insert(message);
-                    System.out.println("Message #" + i);
-                    System.out.println("Date: " + message.getDate());
-                    System.out.println("Subject: " + message.getSubject());
-                    System.out.println(messages.get(i).toString());
+                List folders =  MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(newMailServerCredentials.getImapHost(),
+                        newMailServerCredentials.getUsername(), newMailServerCredentials.getPassword(), newMailServerCredentials.getImapPort()));
+
+                if (mEmailViewModel.getAll(false).size() > 0) {
+                    for (int delete = 0; delete < mEmailViewModel.getAll(false).size(); delete++) {
+                        mEmailViewModel.deleteMessage(mEmailViewModel.getAll(false).get(delete));
+                    }
+                }
+                mEmailViewModel.getAll(true);
+
+                for (int i = 0; i < folders.size(); i++) {
+
+                    //mEmailViewModel.deleteFolder(folders.get(i).toString());
+                    //TODO: insert right foldername
+                    /* fetch and print draft messages */
+                    String fetchedMails = MailFunctions.fetchMailsFromBox(MailFunctions.getIMAPConnection(newMailServerCredentials.getImapHost(),
+                            newMailServerCredentials.getUsername(), newMailServerCredentials.getPassword(), newMailServerCredentials.getImapPort()), folders.get(i).toString());
+                    System.out.println("Folder: " + folders.get(i).toString()+ "\n Foldersize: " + folders.size());
+                    System.out.println("Fetched Mails from Folder " + folders.get(i).toString() + ": \n"+ fetchedMails + "\n MAANCBJC");
+
+                    /* 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 k = 0; k < messages.size(); k++) {
+                        Message message = messages.get(k);
+                        System.out.println("Date: " + message.getDate());
+                        SimpleDateFormat date = new SimpleDateFormat("dd.MM.yy");
+                        date.format(message.getDate());
+                        System.out.println("New Date: " + date.format(message.getDate()));
+                        mEmailViewModel.insert(message);
+                        System.out.println("Folder: " + folders.get(i).toString() + "\n IMPORTANT FOLDERS");
+                        System.out.println("Size of this Folder: " + messages.size());
+
+                    }
                 }
 
 

+ 15 - 33
app/src/main/python/mailFunctions.py

@@ -20,10 +20,10 @@ def stringCompiling(inputIterable):
                     except UnicodeDecodeError:
                         nonNoneList.append(str(item.decode("iso-8859-1")))
                     except AttributeError:
-                        print(item)
-                        print(type(item))
-                        print(inputIterable)
-                        print(nonNoneList)
+                        #print(item)
+                        #print(type(item))
+                        #print(inputIterable)
+                        #print(nonNoneList)
                         exit()
                 else:
                     nonNoneList.append(item)
@@ -47,7 +47,7 @@ def checkConnection(host, username, password, port):
         connection.logout()
         return True
     except Exception as e:
-        print(str(e))
+        #print(str(e))
         return False
 
 def connect(host, username, password, port):
@@ -84,9 +84,9 @@ def listMailboxes(connection):
 def verifyNoBytes(messages, output_list):
     for messages in output_list:
         for item in messages:
-            print(type(item))
-            print(item)
-            print(messages["{}".format(item)])
+            #print(type(item))
+            #print(item)
+            #print(messages["{}".format(item)])
             if type(messages["{}".format(item)]) is not str:
                 print("ERROREXIT: .format failed")
                 print(messages["{}".format(item)])
@@ -102,16 +102,18 @@ def fetchMails(connection, inbox):
     #print(type(inbox))
     try:
         status, messages = connection.select(inbox)
+
     except:
         return []
 
+
     #print("status-------\n" + status)
     #print("messages-------\n" + str(messages))
     # number of top emails to fetch
     #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,6 +171,10 @@ def fetchMails(connection, inbox):
             output_dict['date'] = stringCompiling(raw_date)
             output_dict['content'] = primitive_body
             output_dict['folder'] = inbox
+            print('Folder: ' + inbox)
+            print('From: ' + stringCompiling(raw_from))
+            print('Outputdictionary: ' + str(output_dict))
+
             if seentype == '(SEEN)':
                 output_dict['seen'] = "True"
             else:
@@ -203,27 +209,3 @@ def sendStarttls(host, sendingMail, receivingMail, password, message="", subject
         serverConnection.starttls(context=context)
         serverConnection.login(sendingMail, password)
         serverConnection.sendmail(sendingMail, receivingMail, decoded)
-
-def afetchMails(con):
-    con.select("Sent")
-    status, email_ids = con.search(None, "ALL")
-    if status != 'OK':
-        raise Exception("Error running imap search for spinvox messages: "
-                        "%s" % status)
-
-    print(email_ids[0])
-    fetch_ids = ','.join(str(email_ids[0]).split())
-    status, data = con.fetch(3, '(RFC822)')
-    if status != 'OK':
-        raise Exception("Error running imap fetch for spinvox message: "
-                        "%s" % status)
-    for i in range(3,4):
-        header_msg = email.message_from_string(data[i * 3 + 0][1])
-        subject = header_msg['Subject'],
-        print(subject)
-        date = header_msg['Date'],
-        print(date)
-        body = data[i * 3 + 1][1]
-        print(body)
-    connection.close()
-    connection.logout()

+ 46 - 0
app/src/main/res/layout/welcome.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+
+    <TextView
+        android:id="@+id/backgroun"
+        android:layout_width="321dp"
+        android:layout_height="596dp"
+        android:gravity="center_horizontal"
+
+        android:text="@string/text_welcome"
+        android:textAlignment="center"
+        android:textAppearance="@style/TextAppearance.AppCompat.Body1"
+        android:textSize="@dimen/text_size_welcome"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.495"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="0.142" />
+
+    <Button
+        android:id="@+id/okay_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+
+        android:layout_marginEnd="16dp"
+
+        android:layout_marginRight="16dp"
+        android:layout_marginBottom="36dp"
+        android:text="@string/text_ok"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.524"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/backgroun"
+        app:layout_constraintVertical_bias="0.937"
+        tools:ignore="MissingConstraints" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 2
app/src/main/res/menu/main.xml

@@ -2,11 +2,15 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
     <item
-        android:id="@+id/action_settings"
+        android:id="@+id/action_information"
+        android:title="@string/action_information"/>
+    <item
+        android:id="@+id/action_deletefolder"
         android:orderInCategory="100"
-        android:title="@string/action_settings"
+        android:title="@string/action_deleteFolder"
         app:showAsAction="never" />
     <item
         android:id="@+id/action_refresh"
         android:title="@string/action_refresh"/>
+
 </menu>

+ 1 - 0
app/src/main/res/values/dimens.xml

@@ -8,4 +8,5 @@
 
     <dimen name="list_item_height">45dp</dimen>
     <dimen name="margin_medium">30dp</dimen>
+    <dimen name="text_size_welcome">22sp</dimen>
 </resources>

+ 21 - 1
app/src/main/res/values/strings.xml

@@ -6,8 +6,9 @@
     <string name="nav_header_subtitle">max@mustermann.com</string>
     <string name="nav_header_desc">Navigation header</string>
 
-    <string name="action_settings">Settings</string>
+    <string name="action_deleteFolder">Delete all Folders</string>
     <string name="action_refresh">Refresh</string>
+    <string name="action_information">Information</string>
 
     <string name="drawer_inbox">Inbox</string>
     <string name="drawer_sent">Sent</string>
@@ -46,6 +47,25 @@
     <string name="text_save">Save</string>
     <string name="text_cancel">Cancel</string>
     <string name="text_create_message">Create Message</string>
+    <string name="text_ok">Okay</string>
+
+    <string name="text_welcome">
+        Hello friendly user. \n
+        When creating an account,
+        all your messages will be downloaded and
+        \n  you may experience slower performance of the app.
+        When you create a new account, \n
+        you need to open all your folders once \n
+        in order to not find any emails
+        from the old account
+        \n afterwards.
+        \n It is the same for the option "Delete All Folders".
+        \n This is a bug which could not be fixed yet.
+        We wish you a lot of fun with our app.
+        \n \n
+        This app is in alpha version and created as part of a school project.
+        Our app is fully available on Github.
+    </string>
 
     <!--  hint -->
     <string name="hint_email_from">From (Email)</string>

+ 0 - 32
patches/intent.patch

@@ -1,32 +0,0 @@
-diff --git a/app/src/main/java/com/noahvogt/miniprojekt/messageCreateFragment.java b/app/src/main/java/com/noahvogt/miniprojekt/messageCreateFragment.java
-index e36c97e..3afc5e5 100644
---- a/app/src/main/java/com/noahvogt/miniprojekt/messageCreateFragment.java
-+++ b/app/src/main/java/com/noahvogt/miniprojekt/messageCreateFragment.java
-@@ -6,6 +6,7 @@ import android.content.SharedPreferences;
- 
- import android.content.DialogInterface;
- import android.content.Intent;
-+import android.net.Uri;
- import android.os.Bundle;
- import android.os.Message;
- import android.text.TextUtils;
-@@ -21,6 +22,7 @@ import android.widget.Toast;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.appcompat.app.AlertDialog;
-+import androidx.appcompat.widget.ActivityChooserView;
- import androidx.fragment.app.DialogFragment;
- 
- import java.util.concurrent.ExecutorService;
-@@ -194,6 +196,11 @@ public class messageCreateFragment extends DialogFragment implements PopupMenu.O
-                 if (mailFunctions.validateMessageBody(messageBodyObject) && mailFunctions.validateSubject(subjectObject) &&
-                 mailFunctions.validateEmail(receivingAddressObject) && mailFunctions.validateEmail(sendingAddressObject) &&
-                 !mailFunctions.checkForSameEmail(sendingAddressObject, receivingAddressObject)) {
-+                    /* send email */
-+                    Intent intent = new Intent(Intent.ACTION_VIEW,
-+                            Uri.parse("mailto:" + receivingAddress));
-+                    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
-+                    intent.putExtra(Intent.EXTRA_TEXT, messageBody);
-                     Toast.makeText(getActivity(), "sending ... ", Toast.LENGTH_SHORT).show();
-                     dismiss();
-                 } else {

+ 0 - 110
tests/mailFunctions.py

@@ -1,110 +0,0 @@
-import imaplib, email, os
-
-def errorMsgExit(error_msg):
-    print("Error: " + error_msg)
-
-def checkConnection(host, username, password, port):
-    try:
-        connection = imaplib.IMAP4_SSL(host, port)
-        connection.login(username, password)
-        connection.logout()
-        return True
-    except Exception as e:
-        print(str(e))
-        return False
-
-def connect(host, username, password, port):
-    connect = imaplib.IMAP4_SSL(host, port)
-    connect.login(username, password)
-    connect.enable("UTF8=ACCEPT")
-    return connect
-
-def listMailboxes(connection):
-    mailboxes = connection.list()
-    formatted_mailbox_list = []
-
-    for items in mailboxes:
-        if type(items) == list:
-            for raw_box_string in items:
-                box_string = str(raw_box_string)
-                # TODO: handle cases when folder contains subfolders
-                modified_box_string = (box_string[box_string.find('"/" ')+4:-1])
-
-                # strip unneeded "'s surrounding the folder name
-                if modified_box_string.startswith('"') and modified_box_string.endswith('"'):
-                    modified_box_string = modified_box_string[1:-1]
-
-                formatted_mailbox_list.append(modified_box_string)
-
-    connection.logout()
-    return formatted_mailbox_list
-
-def fetchMails(connection, inbox):
-    status, messages = connection.select(inbox)
-    print("status-------\n" + status)
-    print("messages-------\n" + str(messages))
-    # number of top emails to fetch
-    N = 3
-    # total number of emails
-    messages_int = int(messages[0])
-    print("message_int------\n" + str(messages_int))
-
-    typ, data = connection.search(None, 'ALL')
-    output_list = []
-    for num in data[0].split():
-        typ, data = connection.fetch(num, '(RFC822)')
-        msg = email.message_from_bytes(data[0][1])
-        #print(type(msg))
-        #print(msg)
-        raw_subject = email.header.decode_header(msg['Subject'])[0]
-        #raw_body = email.header.decode_header(msg['Body'])[0][0]
-        '''
-        if decode[1] == 'utf-8':
-            subject = decode[0].decode('utf-8')
-        else:
-            subject = decode[0]
-        '''
-        #print("subject: {}".format(subject))
-        #input()
-        #print('Message %s\n%s\n' % (num, data[0][1]))
-        #print('Message %s\n%s\n' % (num, data[0][1].split()))
-        #print('%s\n' % (len(data[0][1].split())))
-        '''
-        j = 0
-        for i in range(len(str(msg))):
-            if str(msg)[i] == "\n":
-                print(str(msg)[j:i])
-                j = int(i)
-        '''
-
-
-        output_list.append(str(raw_subject))
-
-    connection.close()
-    connection.logout()
-
-    return output_list
-
-def afetchMails(con):
-    con.select("Sent")
-    status, email_ids = con.search(None, "ALL")
-    if status != 'OK':
-        raise Exception("Error running imap search for spinvox messages: "
-                        "%s" % status)
-
-    print(email_ids[0])
-    fetch_ids = ','.join(str(email_ids[0]).split())
-    status, data = con.fetch(3, '(RFC822)')
-    if status != 'OK':
-        raise Exception("Error running imap fetch for spinvox message: "
-                        "%s" % status)
-    for i in range(3,4):
-        header_msg = email.message_from_string(data[i * 3 + 0][1])
-        subject = header_msg['Subject'],
-        print(subject)
-        date = header_msg['Date'],
-        print(date)
-        body = data[i * 3 + 1][1]
-        print(body)
-    connection.close()
-    connection.logout()