Ver Fonte

merged accountmanager

Simon Hammer há 3 anos atrás
pai
commit
443a2810e6

+ 10 - 9
app/src/main/java/com/noahvogt/miniprojekt/MailServerCredentials.java

@@ -19,16 +19,17 @@ public class MailServerCredentials {
     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, int smtpPort, String signature) {
-        mName = name;
-        mUsername = username;
-        mPassword = password;
+    public MailServerCredentials(String name, String username, String password, String imapHost, String smtpHost, int imapPort,
+                                 int smtpPort, String signature) {
+        this.mName = name;
+        this.mUsername = username;
+        this.mPassword = password;
 
-        mImapHost = imapHost;
-        mImapPort = imapPort;
-        mSmtpPort = smtpPort;
-        mSmtpHost = smtpHost;
+        this.mImapHost = imapHost;
+        this.mImapPort = imapPort;
+        this.mSmtpPort = smtpPort;
+        this.mSmtpHost = smtpHost;
 
-        mSignature = signature;
+        this.mSignature = signature;
     }
 }

+ 372 - 104
app/src/main/java/com/noahvogt/miniprojekt/MainActivity.java

@@ -6,9 +6,13 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.PopupMenu;
@@ -65,6 +69,9 @@ import com.google.gson.Gson;
 
 
 import static com.noahvogt.miniprojekt.R.id.drawer_layout;
+import static com.noahvogt.miniprojekt.R.id.exitButton;
+
+import org.w3c.dom.Text;
 
 public class MainActivity extends AppCompatActivity implements View.OnClickListener, CustomAdapter.SelectedMessage {
 
@@ -81,7 +88,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     private AlertDialog dialog;
     private EditText newemail_name, newemail_email, newemail_password; /* may not be private */
 
-    SharedPreferences preferences, mailServerCredentials;
+    SharedPreferences mailServerCredentials;
 
     /* leave descriptor empty */
     public MainActivity() {}
@@ -109,38 +116,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
-        /* 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) {
-                if (!clicked[0]){
-
-                    createInformation(true);
-                    clicked[0] = true;
-
-
-                } else {
-                    createNewEmailDialog();
-                }
-            }
-        });
-
-        /*creates accountmanager by clicking on profil */
-        View accountView = findViewById(R.id.accountView);
-        accountView.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                createNewEmailDialog();
-            }
-        });
-
-        /* invoke preferences */
-        preferences = getSharedPreferences("UserPreferences", Context.MODE_PRIVATE);
-
-        mailServerCredentials = getSharedPreferences("Credentials", Context.MODE_PRIVATE);
 
         /* invoke toolbar */
         Toolbar toolbar = findViewById(R.id.toolbar);
@@ -149,6 +124,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         /* invoke drawer */
         DrawerLayout drawer = findViewById(drawer_layout);
         NavigationView navigationView = findViewById(R.id.nav_view);
+        View headerView = navigationView.getHeaderView(0);
+
         /*
          Passing each menu ID as a set of Ids because each
          menu should be considered as top level destinations.
@@ -161,13 +138,175 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
         NavigationUI.setupWithNavController(navigationView, navController);
 
+        /* show account manager when clicking on profile */
+        View accountView = findViewById(R.id.accountView);
+        accountView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View onClickView) {
+                /* define dialog */
+                AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
+                final View accountManagerView = getLayoutInflater().inflate(R.layout.account_manager, null);
+
+                AutoCompleteTextView accountSelectorObject =
+                        (AutoCompleteTextView) accountManagerView.findViewById(R.id.accountSelectorTextView);
+
+                /* get string data for drop down menu */
+                SharedPreferences credReader = getSharedPreferences("Credentials", Context.MODE_PRIVATE);
+                String currentUser = credReader.getString("currentUser", "");
+
+                TextView showCurrentUserObject = (TextView) accountManagerView.findViewById(R.id.showCurrentUser);
+                Button switchAccountObject = (Button) accountManagerView.findViewById(R.id.switchToAccountButton);
+                Button deleteAccountObject = (Button) accountManagerView.findViewById(R.id.deleteAccountButton);
+                Button changeServerSettingsObject = (Button) accountManagerView.findViewById(R.id.changeServerSettingsButton);
+                Button exit = (Button) accountManagerView.findViewById(R.id.exitButton);
+
+                if (currentUser == null) {
+                    showCurrentUserObject.setText("current user:\nNone");
+                } else {
+                    showCurrentUserObject.setText(String.format("current user:\n%s", currentUser));
+                }
+
+                SharedPreferences.Editor credEditor = credReader.edit();
+
+                Gson gson = new Gson();
+
+                String jsonCredData = credReader.getString("data", "");
+                Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>() {
+                }.getType();
+                ArrayList<MailServerCredentials> currentUsersCredentials = gson.fromJson(jsonCredData, credentialsType);
+                String[] userArray = new String[0];
+                try {
+                    if (!currentUsersCredentials.isEmpty()) {
+                        userArray = new String[currentUsersCredentials.size()];
+                        for (int i = 0; i < currentUsersCredentials.size(); i++) {
+                            userArray[i] = currentUsersCredentials.get(i).getUsername();
+                        }
+                    }
+                } catch (NullPointerException ignored) {}
+
+                ArrayAdapter<String> dropDownAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.dropdown_item,
+                        R.id.textViewDropDownItem, userArray);
+                accountSelectorObject.setAdapter(dropDownAdapter);
+
+                /* open dialog */
+                dialogBuilder.setView(accountManagerView);
+                AlertDialog rootAccountManagerDialog = dialogBuilder.create();
+                rootAccountManagerDialog.show();
+
+                switchAccountObject.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        String userInput = accountSelectorObject.getText().toString();
+                        String jsonCredData = credReader.getString("data", "");
+                        Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
+                        ArrayList<MailServerCredentials> currentUsersCredentials = gson.fromJson(jsonCredData, credentialsType);
+
+                        try {
+                            for (int i = 0; i < currentUsersCredentials.size(); i++) {
+                                if (currentUsersCredentials.get(i).getUsername().equals(userInput)) {
+                                    credEditor.putString("currentUser", userInput).apply();
+                                    showCurrentUserObject.setText(String.format("current user:\n%s", userInput));
+                                    showToast("switched account");
+                                    updateNavHeaderText(headerView);
+                                    break;
+                                }
+                            }
+                        } catch (NullPointerException ignored) {}
+                    }
+                });
+
+                /* needed to use array in inner method later */
+                String[] finalUserArray = userArray;
+
+                deleteAccountObject.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        String userInput = accountSelectorObject.getText().toString();
+                        String jsonCredData = credReader.getString("data", "");
+                        Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
+                        ArrayList<MailServerCredentials> currentUserCredentials = gson.fromJson(jsonCredData, credentialsType);
+
+                        try {
+                            for (int i = 0; i < currentUserCredentials.size(); i++) {
+                                if (currentUserCredentials.get(i).getUsername().equals(userInput)) {
+                                    currentUserCredentials.remove(i);
+
+                                    /* live update adapter for dropdown menu */
+
+                                    int k = 0;
+                                    String[] newUserArray = new String[finalUserArray.length - 1];
+                                    for (String s : finalUserArray) {
+                                        if (!s.contains(userInput)) {
+                                            newUserArray[k] = s;
+                                            k++;
+                                        }
+                                    }
+
+                                    ArrayAdapter<String> newDropDownAdapter = new ArrayAdapter<String>(getApplicationContext(),
+                                            R.layout.dropdown_item, R.id.textViewDropDownItem, newUserArray);
+                                    accountSelectorObject.setAdapter(newDropDownAdapter);
+
+                                    showCurrentUserObject.setText(R.string.NoEmailsInDropDownMenuAvailable);
+
+                                    /* update credentials strings */
+                                    credEditor.putString("data", gson.toJson(currentUserCredentials, credentialsType)).apply();
+                                    if (!currentUserCredentials.isEmpty()) {
+                                        String usernameZero = currentUserCredentials.get(0).getUsername();
+                                        credEditor.putString("currentUser", usernameZero).apply();
+                                        showCurrentUserObject.setText(String.format("current user:\n%s", usernameZero));
+                                    } else {
+                                        credEditor.putString("currentUser", "").apply();
+                                        showCurrentUserObject.setText("current user:\n None");
+                                    }
+                                    showToast("account removed");
+                                    updateNavHeaderText(headerView);
+                                    break;
+                                }
+                            }
+                        } catch (NullPointerException ignored) {}
+                    }
+                });
+
+                changeServerSettingsObject.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        String userInput = accountSelectorObject.getText().toString();
+                        String jsonCredData = credReader.getString("data", "");
+                        Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>() {
+                        }.getType();
+                        ArrayList<MailServerCredentials> currentUserCredentials = gson.fromJson(jsonCredData, credentialsType);
+
+                        String email, name, password, smtpHost, imapHost = null;
+                        int smtpPort, imapPort = 0;
+                        try {
+                            for (int i = 0; i < currentUserCredentials.size(); i++) {
+                                if (currentUserCredentials.get(i).getUsername().equals(userInput)) {
+                                    email = currentUserCredentials.get(i).getUsername();
+                                    name = currentUserCredentials.get(i).getName();
+                                    password = currentUserCredentials.get(i).getPassword();
+                                    smtpHost = currentUserCredentials.get(i).getSmtpHost();
+                                    imapHost = currentUserCredentials.get(i).getImapHost();
+                                    smtpPort = currentUserCredentials.get(i).getSmtpPort();
+                                    imapPort = currentUserCredentials.get(i).getImapPort();
+                                    changeMailServerSettingsDialog(name, email, password, headerView, imapHost, smtpHost, imapPort,
+                                            smtpPort, false);
+                                    break;
+                                }
+                            }
+                        } catch (NullPointerException ignored) {}
+                    }
+                });
+
+                exit.setOnClickListener(v -> rootAccountManagerDialog.dismiss());
+            }
+        });
+
+
         /* Lookup the recyclerview in activity layout */
         recyclerView = findViewById(R.id.recyclerView);
 
         final CustomAdapter adapter = new CustomAdapter(new CustomAdapter.EmailDiff(),this);
 
-
-
         /* Attach the adapter to the recyclerview to populate items */
         recyclerView.setAdapter(adapter);
         recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -179,6 +318,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
             adapter.submitList(messages);
         });
 
+        updateNavHeaderText(headerView);
 
         Button settingButton = findViewById(R.id.settingsButton);
         settingButton.setOnClickListener(new View.OnClickListener() {
@@ -189,16 +329,31 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
             }
         });
 
+        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) {
+                if (!clicked[0]){
+
+                    createInformation(true,headerView);
+                    clicked[0] = true;
+
+
+                } else {
+                    createNewEmailDialog(headerView);
+                }
+            }
+        });
+
 
         /* Start email Writer*/
         FloatingActionButton message_create_button = findViewById(R.id.messageButton);
         message_create_button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-
-                DialogFragment dialog = MessageCreateFragment.newInstance();
-                dialog.show(getSupportFragmentManager(), "tag");
-
+                DialogFragment dialogFragment = MessageCreateFragment.newInstance();
+                dialogFragment.show(getSupportFragmentManager(), "tag");
             }
         });
 
@@ -208,7 +363,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         }
     }
 
-
         /* gets the data from the Email writer and adds it to the Database */
         public void onActivityResult(int requestCode, int resultCode, Intent data) {
             super.onActivityResult(requestCode, resultCode, MessageCreateFragment.replyIntent);
@@ -232,6 +386,34 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                 mEmailViewModel.insert(word);
         }
 
+    /* set nav header name + email to current user data */
+    public void updateNavHeaderText(View headerView) {
+        mailServerCredentials = getSharedPreferences("Credentials", Context.MODE_PRIVATE);
+
+        TextView navHeaderNameObject = (TextView) headerView.findViewById(R.id.navHeaderName);
+        TextView navHeaderEmailObject = (TextView) headerView.findViewById(R.id.navHeaderEmail);
+
+        String startupUser = mailServerCredentials.getString("currentUser","");
+
+        if (!startupUser.isEmpty()) {
+            Gson gson = new Gson();
+
+            String startupJsonData = mailServerCredentials.getString("data", "");
+            Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
+            ArrayList<MailServerCredentials> startupUsersCredentials = gson.fromJson(startupJsonData, credentialsType);
+
+            for (int i = 0; i < startupUsersCredentials.size(); i++) {
+                if (startupUsersCredentials.get(i).getUsername().equals(startupUser)) {
+                    navHeaderNameObject.setText(startupUser);
+                    navHeaderEmailObject.setText(startupUsersCredentials.get(i).getName());
+                    break;
+                }
+            }
+        } else {
+            navHeaderEmailObject.setText(R.string.noAccountsAddedNavHeaderMessageEmail);
+            navHeaderNameObject.setText(R.string.noAccountsAddedNavHeaderMessageName);
+        }
+    }
 
 
     @Override
@@ -251,37 +433,58 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
 
 
     /* better leave empty to avoid any listener disambiguity */
-    public void onClick(View view) { }
+    public void onClick(View view) {}
 
-    public void changeMailServerSettingsDialog(String name, String email, String password) {
+    public void changeMailServerSettingsDialog(String name, String email, String password, View headerView, String imapHost,
+                                               String smtpHost, int imapPort, int smtpPort, boolean wantToAddNew) {
         /* define View window */
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
         final View changeMailServerSettingsView = getLayoutInflater().inflate(R.layout.mail_credentials_customizer, null);
 
+        /* access objects */
         EditText incomingServerObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_incoming_server_text);
         EditText outgoingServerObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_outgoing_server_text);
         EditText incomingPortObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_incoming_port_text);
         EditText outgoingPortObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_outgoing_port_text);
         EditText serverUsernameObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_username_text);
         EditText passwordObject = (EditText) changeMailServerSettingsView.findViewById(R.id.custom_mail_server_password_text);
+        Button saveButton = (Button) changeMailServerSettingsView.findViewById(R.id.saveCustomizeButton);
+        Button cancelButton = (Button) changeMailServerSettingsView.findViewById(R.id.cancelCustomizeButton);
 
         /* set assumed input in corresponding fields */
-        incomingServerObject.setText(MailFunctions.getImapHostFromEmail(email));
-        outgoingServerObject.setText(MailFunctions.getSmtpHostFromEmail(email));
-        incomingPortObject.setText("993");
-        outgoingPortObject.setText("587");
+        incomingServerObject.setText(imapHost);
+        outgoingServerObject.setText(smtpHost);
+        incomingPortObject.setText(String.valueOf(imapPort));
+        outgoingPortObject.setText(String.valueOf(smtpPort));
         serverUsernameObject.setText(email);
         passwordObject.setText(password);
 
-        /* TODO: add save and cancel button functionality */
-
         /* open View window */
         dialogBuilder.setView(changeMailServerSettingsView);
-        dialog = dialogBuilder.create();
-        dialog.show();
+        AlertDialog rootChangeServerSettingsDialog = dialogBuilder.create();
+        rootChangeServerSettingsDialog.show();
+
+        saveButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (wantToAddNew) {
+                    addNewAccountCredentials(name, serverUsernameObject.getText().toString(), passwordObject.getText().toString(),
+                            Integer.parseInt(incomingPortObject.getText().toString()), Integer.parseInt(outgoingPortObject.getText().toString()),
+                            incomingServerObject.getText().toString(), outgoingServerObject.getText().toString(), rootChangeServerSettingsDialog, false,
+                            headerView);
+                } else {
+                    changeAccountCredentials(name, serverUsernameObject.getText().toString(),
+                            passwordObject.getText().toString(), Integer.parseInt(incomingPortObject.getText().toString()),
+                            Integer.parseInt(outgoingPortObject.getText().toString()), incomingServerObject.getText().toString(),
+                            outgoingServerObject.getText().toString(), rootChangeServerSettingsDialog, headerView, email);
+                }
+            }
+        });
+
+        cancelButton.setOnClickListener(v -> rootChangeServerSettingsDialog.dismiss());
     }
 
-    public void askForChangeMailServerSettingsDialog(String name, String email, String password) {
+    public void askForChangeMailServerSettingsDialog(String name, String email, String password, View headerView) {
         /* define View window */
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
 
@@ -292,20 +495,22 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                 .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int id) {
                         /*if this button is clicked, close the whole fragment */
-                        changeMailServerSettingsDialog(name, email, password);
+                        changeMailServerSettingsDialog(name, email, password, headerView,
+                                MailFunctions.getImapHostFromEmail(email), MailFunctions.getSmtpHostFromEmail(email), 993, 587,
+                                true);
                     }
                 })
                 .setNegativeButton("No",new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog,int id) {
+                    public void onClick(DialogInterface dialogInput, int id) {
                         /* if this button is clicked, close the hole fragment */
-                        dialog.dismiss();
+                        dialogInput.dismiss();
                     }
                 });
-        dialog = dialogBuilder.create();
-        dialog.show();
+        AlertDialog rootAskForChangeServerDialog = dialogBuilder.create();
+        rootAskForChangeServerDialog.show();
     }
 
-    public void createInformation(boolean button){
+    public void createInformation(boolean button, View view){
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
         final View emailPopupView = getLayoutInflater().inflate(R.layout.welcome, null);
 
@@ -322,8 +527,10 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
             @Override
             public void onClick(View v) {
                 dialog.dismiss();
-                if (button){
-                    createNewEmailDialog();
+                if (view!=null) {
+                    if (button) {
+                        createNewEmailDialog(view);
+                    }
                 }
             }
         });
@@ -336,7 +543,97 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     String password;
     Data.Builder builder = new Data.Builder();
 
-    public void createNewEmailDialog(){
+    public void addNewAccountCredentials(String name, String email, String password, int imapPort,
+                                         int smtpPort, String imapHost, String smtpHost, DialogInterface dialogContext,
+                                         boolean wantConnectionFailedDialog, View headerView) {
+        credentialsEditor = mailServerCredentials.edit();
+
+        /* connect to mail server */
+        showToast("Probe Connection ...");
+        if (MailFunctions.canConnect(imapHost, email, password) == Boolean.TRUE) {
+            showToast("was able to connect");
+
+            Gson gson = new Gson();
+
+            /* read login credentials from SharedPreferences */
+            SharedPreferences initialCredentialsReader = getSharedPreferences(
+                    "Credentials", Context.MODE_PRIVATE);
+            String initialReadJsonData = initialCredentialsReader.getString("data", "");
+            Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
+            ArrayList<MailServerCredentials> allUsersCredentials = gson.fromJson(initialReadJsonData, credentialsType);
+
+            /* check for unique email */
+            boolean newEmailIsUnique = true;
+            try {
+                for (int i = 0; i < allUsersCredentials.size(); i++) {
+                    if (allUsersCredentials.get(i).getUsername().equals(email)) {
+                        newEmailIsUnique = false;
+                        break;
+                    }
+                }
+            } catch (NullPointerException e) {
+                System.out.println("creating new arraylist for user credentials, as it seems to be empty");
+                allUsersCredentials = new ArrayList<>();
+            }
+
+            /* add new email account if the email hasn't been entered before */
+            if (newEmailIsUnique) {
+                allUsersCredentials.add(new MailServerCredentials(name, email, password, imapHost, smtpHost, imapPort,
+                        smtpPort, ""));
+                credentialsEditor.putString("data", gson.toJson(allUsersCredentials, credentialsType));
+                credentialsEditor.putString("currentUser", email);
+                credentialsEditor.apply();
+                showToast("Success: added new email account");
+                updateNavHeaderText(headerView);
+                dialogContext.dismiss();
+            } else {
+                showToast("Error: cannot add the same email twice");
+            }
+        } else {
+            if (wantConnectionFailedDialog)
+                askForChangeMailServerSettingsDialog(name, email, password, headerView);
+            else
+                showToast("Error: failed to get connection");
+        }
+    }
+
+    /* use 'initialMail' variable so that the program knows which email entry is has to change */
+    public void changeAccountCredentials(String name, String email, String password, int imapPort,
+                                         int smtpPort, String imapHost, String smtpHost, DialogInterface dialogContext,
+                                         View headerView, String initialEmail) {
+        credentialsEditor = mailServerCredentials.edit();
+
+        /* connect to mail server */
+        showToast("Probe Connection ...");
+        if (MailFunctions.canConnect(imapHost, email, password) == Boolean.TRUE) {
+            showToast("was able to connect");
+
+            Gson gson = new Gson();
+
+            /* read login credentials from SharedPreferences */
+            SharedPreferences initialCredentialsReader = getSharedPreferences(
+                    "Credentials", Context.MODE_PRIVATE);
+            String initialReadJsonData = initialCredentialsReader.getString("data", "");
+            Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
+            ArrayList<MailServerCredentials> allUsersCredentials = gson.fromJson(initialReadJsonData, credentialsType);
+
+            for (int i = 0; i < allUsersCredentials.size(); i++) {
+                if (allUsersCredentials.get(i).getUsername().equals(initialEmail)) {
+                    String signature = allUsersCredentials.get(i).getSignature();
+                    allUsersCredentials.set(i, new MailServerCredentials(name, email, password, imapHost, smtpHost, imapPort,
+                            smtpPort, signature));
+                    credentialsEditor.putString("data", gson.toJson(allUsersCredentials, credentialsType)).apply();
+                    showToast("changed account credentials");
+                    dialogContext.dismiss();
+                    break;
+                }
+            }
+        } else {
+                showToast("Error: failed to get connection");
+        }
+    }
+
+    public void createNewEmailDialog(View headerView){
         /* define View window */
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
         final View emailPopupView = getLayoutInflater().inflate(R.layout.popup, null);
@@ -354,68 +651,40 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
 
         /* open View window */
         dialogBuilder.setView(emailPopupView);
-        dialog = dialogBuilder.create();
-        dialog.show();
+        AlertDialog rootCreateNewEmailPopupDialog = dialogBuilder.create();
+        rootCreateNewEmailPopupDialog.show();
 
-        SharedPreferences.Editor preferencesEditor = preferences.edit();
         credentialsEditor = mailServerCredentials.edit();
 
-        if (! Python.isStarted()) {
-            Python.start(new AndroidPlatform(this));
-        }
-
         /* store user input */
         newemail_save_button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-
-                /* store user input (only needed for DEBUGGING) */
-                name = newemail_name.getText().toString();
-                email = newemail_email.getText().toString();
-                password = newemail_password.getText().toString();
+                /* store user input */
+                String name = newemail_name.getText().toString();
+                String email = newemail_email.getText().toString();
+                String password = newemail_password.getText().toString();
 
                 builder = new Data.Builder();
                 builder.putString(emailData, email)
                         .putString(passwordData, password)
                         .putString(nameData, name);
 
+
                 if (!MailFunctions.validateEmail(newemail_email) | !MailFunctions.validateName(newemail_name) | !MailFunctions.validatePassword(newemail_password)) {
                     return;
                 }
-                /* connect to mail server and print various debugging output */
-                showToast("Probe Connection ...");
-                if (MailFunctions.canConnect(MailFunctions.getImapHostFromEmail(email), email, password) == Boolean.TRUE) {
-                    showToast("was able to connect");
-
-                    /* 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();
-
-                    dialog.dismiss();
-                    /*makes request to worker and gives data to it*/
-                    mEmailViewModel.applyDownload(builder.build());
-
-                } else {
-                    askForChangeMailServerSettingsDialog(name, email, password);
-                }
-            }
-        });
-
-
-        newemail_cancel_button.setOnClickListener(v -> dialog.dismiss());
-
-    }
 
+                addNewAccountCredentials(name, email, password, 993, 587, MailFunctions.getImapHostFromEmail(email),
+                        MailFunctions.getSmtpHostFromEmail(email), rootCreateNewEmailPopupDialog, true, headerView);
+                mEmailViewModel.applyDownload(builder.build());
+                dialog.dismiss();
+        }});
 
-    /* show debug output in  specific view */
-    private void showSnackbar(View View, String text) {
-        Snackbar.make(View, text, Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show();
+        newemail_cancel_button.setOnClickListener(v -> rootCreateNewEmailPopupDialog.dismiss());
     }
 
-    /* like showSnackbar(), but global and uglier */
+    /* print relatively globally messages at the bottom of the screen */
     private void showToast(String text) {
         Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
     }
@@ -425,7 +694,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     public void selectedMessage(Message messages, EmailViewModel emailViewModel) {
         DialogFragment dialog = MessageShowFragment.newInstance(messages, mEmailViewModel);
         dialog.show(getSupportFragmentManager(), "tag");
-
     }
 
     private static final String TAG = DownloadWorker.class.getSimpleName();
@@ -443,7 +711,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                     Log.e(TAG, "Error formating date", throwable );
                 }
 
-                createInformation(false);
+                createInformation(false,null);
                 return true;
             case R.id.action_refresh:
                 mEmailViewModel.applyDownload(builder.build());

+ 30 - 10
app/src/main/java/com/noahvogt/miniprojekt/MessageCreateFragment.java

@@ -21,10 +21,14 @@ import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import com.noahvogt.miniprojekt.DataBase.Message;
 import com.noahvogt.miniprojekt.data.EmailViewModel;
 import com.noahvogt.miniprojekt.data.MailFunctions;
 
+import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -65,23 +69,18 @@ public class MessageCreateFragment extends DialogFragment implements PopupMenu.O
     }
 
     private AlertDialog dialog;
-    SharedPreferences preferences;
-
 
     private static final int NUMBER_OF_THREADS = 4;
     static final ExecutorService databaseWriteExecutor =
             Executors.newFixedThreadPool(NUMBER_OF_THREADS);
 
-
     /* set theming style */
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setStyle(DialogFragment.STYLE_NORMAL, R.style.messageCreateTheme);
-        preferences = getActivity().getSharedPreferences("UserPreferences", Context.MODE_PRIVATE);
     }
 
-
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -101,9 +100,11 @@ public class MessageCreateFragment extends DialogFragment implements PopupMenu.O
          subjectObject = (EditText) view.findViewById(R.id.create_message_subject_text);
          messageBodyObject = (EditText) view.findViewById(R.id.create_message_body_text);
 
+        SharedPreferences mailServerCredentials = getContext().getSharedPreferences("Credentials", Context.MODE_PRIVATE);
+        
         /* set logged in email address as sending address */
-        String loginEmail = preferences.getString("email","");
-        sendingAddressObject.setText(loginEmail);
+        String currentMailUser = mailServerCredentials.getString("currentUser", "");
+        sendingAddressObject.setText(currentMailUser);
 
         /* get string vars, MAYBE NOT HERE */
         if (mMessage != null) {
@@ -217,11 +218,30 @@ public class MessageCreateFragment extends DialogFragment implements PopupMenu.O
                 String ccStr = ccObject.getText().toString();
                 String bccStr = bccObject.getText().toString();
 
+                Gson gson = new Gson();
+
+                /* get string vars, MAYBE NOT HERE */
+                String jsonData = mailServerCredentials.getString("data", "");
+                Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
+                ArrayList<MailServerCredentials> allUsersCredentials = gson.fromJson(jsonData, credentialsType);
+                
+                String smtpHost = null, password = null; int smtpPort = 587;
+
+                for (int i = 0; i < allUsersCredentials.size(); i++) {
+                    if (allUsersCredentials.get(i).getUsername().equals(currentMailUser)) {
+                        smtpHost = allUsersCredentials.get(i).getSmtpHost();
+                        smtpPort = allUsersCredentials.get(i).getSmtpPort();
+                        password = allUsersCredentials.get(i).getPassword();
+                        break;
+                    }
+                }
+                
                 /* check for valid input */
                 if (MailFunctions.validateMessageBody(messageBodyObject) && MailFunctions.validateSubject(subjectObject) &&
-                MailFunctions.validateEmail(receivingAddressObject) && MailFunctions.validateEmail(sendingAddressObject)) {
-                    String password = preferences.getString("password","");
-                    MailFunctions.sendStarttlsMail("smtp.edubs.ch", sendingAddress, receivingAddress, password, messageBody, subject, ccStr, bccStr);
+                MailFunctions.validateEmail(receivingAddressObject) && MailFunctions.validateEmail(sendingAddressObject) &&
+                !MailFunctions.checkForSameEmail(sendingAddressObject, receivingAddressObject)) {
+                    MailFunctions.sendStarttlsMail(smtpHost, sendingAddress, receivingAddress, password, messageBody,
+                            subject, ccStr, bccStr, smtpPort);
                     Toast.makeText(getActivity(), "sending ... ", Toast.LENGTH_SHORT).show();
                     dismiss();
                 } else {

+ 12 - 8
app/src/main/java/com/noahvogt/miniprojekt/data/MailFunctions.java

@@ -16,10 +16,12 @@ public class MailFunctions {
         return pythonMailFunctions.callAttr("checkConnection", host, email, password, 993).toBoolean();
     }
 
-    public static void sendStarttlsMail(String host, String sendingMail, String receivingMail, String password, String message, String subject, String cc, String bcc) {
+    public static void sendStarttlsMail(String host, String sendingMail, String receivingMail, String password, String message,
+                                        String subject, String cc, String bcc, int port) {
         Python python = Python.getInstance();
         PyObject pythonMailFunctions = python.getModule("mailFunctions");
-        pythonMailFunctions.callAttr("sendStarttls", host, sendingMail, receivingMail, password, message, subject, 587, cc, bcc);
+        pythonMailFunctions.callAttr("sendStarttls", host, sendingMail, receivingMail, password,
+                message, subject, port, cc, bcc);
     }
 
     public static PyObject getIMAPConnection(String host, String email, String password, int port) {
@@ -58,16 +60,17 @@ public class MailFunctions {
         if (topLevelHost.endsWith("edubs.ch")) {
             return "teamwork.edubs.ch";
 
-        }else if (topLevelHost.endsWith("yahoo.com")){
+        } else if (topLevelHost.endsWith("yahoo.com")){
             return "imap.mail.yahoo.com";
 
         } else if (topLevelHost.endsWith("gmx.ch")){
             return "imap.gmx.net";
         } else if (topLevelHost.endsWith("gmx.de")){
             return "imap.gmx.net";
-        }
-        else {
-            return "imap." + topLevelHost;
+        } else if (topLevelHost.equals("noahvogt.com")) {
+            return "mail.noahvogt.com";
+        } else {
+                return "imap." + topLevelHost;
         }
     }
 
@@ -82,8 +85,9 @@ public class MailFunctions {
             return  "mail.gmx.net";
         }else if (topLevelHost.endsWith("gmx.de")) {
             return "mail.gmx.net";
-        }
-        else {
+        } else if (topLevelHost.endsWith("edubs.ch")) {
+            return "smtp.edubs.ch";
+        } else {
             return "smtp." + topLevelHost;
         }
     }

+ 34 - 26
app/src/main/java/com/noahvogt/miniprojekt/workers/DownloadWorker.java

@@ -26,12 +26,12 @@ import java.util.Date;
 import java.util.List;
 
 import static com.noahvogt.miniprojekt.MainActivity.mEmailViewModel;
-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){
@@ -46,34 +46,46 @@ public class DownloadWorker extends Worker {
     @Override
     public Result doWork() {
             try {
-                String mEmail = getInputData().getString(MainActivity.emailData);
-                String mPassword = getInputData().getString(MainActivity.passwordData);
-                String mName = getInputData().getString(MainActivity.nameData);
+                String mUser = null;
+                String mPassword = null;
+                String mImapHost = null;
+                int mImapPort = 0;
 
                 /* 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(
-                        mName, mEmail, mPassword, MailFunctions.getImapHostFromEmail(mEmail), MailFunctions.getSmtpHostFromEmail(mEmail), 993, 587, "");
-                String newCredentialsJson = gson.toJson(newMailServerCredentials);
-                System.out.println(newCredentialsJson);
-                MainActivity.credentialsEditor.putString("data", newCredentialsJson);
-                MainActivity.credentialsEditor.apply();
-
-                /* download all messages from mail server */
-
                 /* read login credentials from SharedPreferences */
-                SharedPreferences credentialsReader = getApplicationContext().getSharedPreferences("UserPreferences", Context.MODE_PRIVATE);
+                SharedPreferences credentialsReader = getApplicationContext().getSharedPreferences("Credentials", Context.MODE_PRIVATE);
                 String readJsonData = credentialsReader.getString("data", "");
-                MailServerCredentials readMailServerCredentials = gson.fromJson(readJsonData, MailServerCredentials.class);
+                String currentUser = credentialsReader.getString("currentUser", "");
+
+                Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>() {
+                }.getType();
+                ArrayList<MailServerCredentials> currentUsersCredentials = gson.fromJson(readJsonData, credentialsType);
+                boolean gotCurrentUserCredentials = false;
+                try {
+                    if (!currentUsersCredentials.isEmpty()) {
+                        for (int i = 0; i < currentUsersCredentials.size(); i++) {
+                            if (currentUsersCredentials.get(i).getUsername().equals(currentUser)){
+                                mPassword = currentUsersCredentials.get(i).getPassword();
+                                mUser = currentUsersCredentials.get(i).getUsername();
+                                mImapPort = currentUsersCredentials.get(i).getImapPort();
+                                mImapHost = currentUsersCredentials.get(i).getImapHost();
+                                gotCurrentUserCredentials = true;
+                                break;
+                            }
+                        }
+                    }
+                } catch (NullPointerException ignored) {}
 
 
-                List folders =  MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(newMailServerCredentials.getImapHost(),
-                        newMailServerCredentials.getUsername(), newMailServerCredentials.getPassword(), newMailServerCredentials.getImapPort()));
+                /* download all messages from mail server */
+                List folders =  MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(mImapHost,
+                        mUser, mPassword, mImapPort));
 
+                /*deletes all folders that were clicked*/
                 if (mEmailViewModel.getAll(false).size() > 0) {
                     for (int delete = 0; delete < mEmailViewModel.getAll(false).size(); delete++) {
                         mEmailViewModel.deleteMessage(mEmailViewModel.getAll(false).get(delete));
@@ -86,7 +98,7 @@ public class DownloadWorker extends Worker {
                     String folderNow = folders.get(i).toString();
                     System.out.println("ALL Folders: " + folders);
 
-                    if (folderNow.equals("Inbox") || folderNow.equals("IBOX") || folderNow.equals("inbox")){
+                    if (folderNow.equals("Inbox") || folderNow.equals("INBOX") || folderNow.equals("inbox")){
                         folderName = "Inbox";
                     }else if (folderNow.equals("Trash") || folderNow.equals("TRASH") ||
                             folderNow.equals("Delete") || folderNow.equals("DELETE") || folderNow.equals("Papierkorb")){
@@ -100,7 +112,7 @@ public class DownloadWorker extends Worker {
                             folderNow.equals("DRAFTS") || folderNow.equals("Entw&APw-rfe")  )  {
                         folderName = "Draft";
                     } else if (folderNow.equals("Spam") || folderNow.equals("SPAM") || folderNow.equals("Bulk Mail")  ||
-                            folderNow.equals("DRAFTS")){
+                            folderNow.equals("bulk mail")){
                         folderName = "Spam";
                     }
                     else {
@@ -109,8 +121,8 @@ public class DownloadWorker extends Worker {
 
                     //mEmailViewModel.deleteFolder(folders.get(i).toString());
                     /* fetch and print draft messages */
-                    String fetchedMails = MailFunctions.fetchMailsFromBox(MailFunctions.getIMAPConnection(newMailServerCredentials.getImapHost(),
-                            newMailServerCredentials.getUsername(), newMailServerCredentials.getPassword(), newMailServerCredentials.getImapPort()),
+                    String fetchedMails = MailFunctions.fetchMailsFromBox(MailFunctions.getIMAPConnection(mImapHost,
+                            mUser, mPassword, mImapPort),
                             folders.get(i).toString(), folderName);
                     //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");
@@ -139,10 +151,6 @@ public class DownloadWorker extends Worker {
 
                 }
 
-
-
-
-
                 return Result.success();
             } catch (Throwable throwable){
                 Log.e(TAG, "Error, downloading Messages", throwable);

+ 12 - 5
app/src/main/python/mailFunctions.py

@@ -47,7 +47,13 @@ def checkConnection(host, username, password, port):
         connection.logout()
         return True
     except Exception as e:
-        #print(str(e))
+
+        print("host: " + host)
+        print("username: " + username)
+        print("password: " + password)
+        print("port: " + str(port))
+        print(str(e))
+
         return False
 
 def connect(host, username, password, port):
@@ -157,12 +163,13 @@ def fetchMails(connection, inbox, folderLocal):
             # set subject to an empty string when not found
             try:
                 if raw_string[1] == 'utf-8':
-                    subject = raw_string[0].raw_string('utf-8')
+                    subject = raw_string[0].decode('utf-8')
+                elif raw_string[1] == 'iso-8859-1':
+                    subject = raw_string[0].decode('iso-8859-1')
                 else:
-                    subject = raw_string[0].decode("iso-8859-1")
-                            #nonNoneList.append(str(item.decode("iso-8859-1")))
+                    subject = str(raw_string[0])
             except AttributeError:
-                subject=""
+                 subject = str(raw_string[0])
 
             output_dict['subject'] = subject
             output_dict['from'] = stringCompiling(raw_from)

+ 94 - 0
app/src/main/res/layout/account_manager.xml

@@ -0,0 +1,94 @@
+<?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">
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/accountSelectorLayout"
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="32dp"
+        android:layout_marginLeft="32dp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="32dp"
+        android:layout_marginRight="32dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:startIconDrawable="@drawable/ic_mail_outline">
+
+        <AutoCompleteTextView
+            android:id="@+id/accountSelectorTextView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:inputType="none"
+            android:text="select Account" />
+
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+    <TextView
+        android:id="@+id/showCurrentUser"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Current User: "
+        android:textColor="@color/black"
+        android:textSize="14sp"
+        android:textStyle="bold"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/accountSelectorLayout"/>
+
+    <Button
+        android:id="@+id/deleteAccountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="delete account"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/showCurrentUser" />
+
+    <Button
+        android:id="@+id/switchToAccountButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="switch to account"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/deleteAccountButton" />
+
+    <Button
+        android:id="@+id/changeServerSettingsButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="change server settings"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/switchToAccountButton" />
+
+    <Button
+        android:id="@+id/exitButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        android:text="exit"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/changeServerSettingsButton" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 10 - 0
app/src/main/res/layout/dropdown_item.xml

@@ -0,0 +1,10 @@
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/textViewDropDownItem"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="12dp"
+    android:textColor="@color/black"
+    android:textStyle="bold"
+    android:textSize="16sp"
+    android:text="TextView"/>

+ 10 - 6
app/src/main/res/layout/mail_credentials_customizer.xml

@@ -40,7 +40,7 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:orientation="vertical"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="50dp"
             >
 
             <com.google.android.material.textfield.TextInputLayout
@@ -111,6 +111,7 @@
 
                 <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/custom_mail_server_incoming_port_text"
+                    android:inputType="number"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content" />
             </com.google.android.material.textfield.TextInputLayout>
@@ -135,6 +136,7 @@
 
                 <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/custom_mail_server_outgoing_port_text"
+                    android:inputType="number"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content" />
             </com.google.android.material.textfield.TextInputLayout>
@@ -178,8 +180,6 @@
                 android:hint="Server Password"
                 app:startIconDrawable="@drawable/ic_lock"
 
-                android:paddingBottom="50dp"
-
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@+id/custom_mail_server_username_layout">
@@ -196,8 +196,12 @@
                 android:layout_height="wrap_content">
 
                 <Button
-                    android:id="@+id/cancelCustomizeButton"
+                    android:id="@+id/saveCustomizeButton"
+                    android:layout_marginTop="16dp"
+                    android:layout_marginEnd="16dp"
 
+                    android:layout_marginRight="16dp"
+                    android:layout_marginBottom="16dp"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
 
@@ -208,14 +212,14 @@
                     android:text="Save" />
 
                 <Button
-                    android:id="@+id/saveCustomizeButton"
+                    android:id="@+id/cancelCustomizeButton"
 
                     android:layout_marginEnd="42dp"
                     android:layout_marginRight="42dp"
 
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_alignBottom="@+id/cancelCustomizeButton"
+                    android:layout_alignBottom="@+id/saveCustomizeButton"
                     android:layout_alignParentRight="true"
                     android:text="Cancel" />
 

+ 4 - 3
app/src/main/res/layout/nav_header_main.xml

@@ -21,15 +21,16 @@
         app:srcCompat="@drawable/portrait_icon" />
 
     <TextView
+        android:id="@+id/navHeaderName"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingTop="@dimen/nav_header_vertical_spacing"
-        android:text="@string/nav_header_title"
+        android:text="@string/noAccountsAddedNavHeaderMessageEmail"
         android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
 
     <TextView
-        android:id="@+id/textView"
+        android:id="@+id/navHeaderEmail"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/nav_header_subtitle" />
+        android:text="@string/noAccountsAddedNavHeaderMessageName" />
 </LinearLayout>

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -86,5 +86,8 @@
 
     <string name="write_email">Write a Email</string>
     <string name="empty_not_saved">Email not saved because it was empty.</string>
+    <string name="noAccountsAddedNavHeaderMessageEmail">No Account added</string>
+    <string name="noAccountsAddedNavHeaderMessageName">No Email added</string>
+    <string name="NoEmailsInDropDownMenuAvailable">None</string>
 </resources>
 

+ 17 - 0
patches/mailboxDecoding.patch

@@ -0,0 +1,17 @@
+--- mailFunctions.py	2021-10-06 12:34:01.556316453 +0200
++++ mailFunctions2.py	2021-10-06 12:33:47.493424755 +0200
+@@ -1,4 +1,4 @@
+-import imaplib, smtplib, ssl, email, os, json
++import imaplib, smtplib, ssl, email, os, json, imapclient
+ from itertools import chain
+ 
+ # format raw string you get from fetching mails
+@@ -66,6 +66,8 @@
+     for items in mailboxes:
+         if type(items) == list:
+             for raw_box_string in items:
++                print(raw_box_string)
++                print(imapclient.imap_utf7.decode(raw_box_string))
+                 box_string = str(raw_box_string)
+                 # TODO: handle cases when folder contains subfolders
+                 modified_box_string = (box_string[box_string.find('"/" ')+4:-1])