浏览代码

added backround worker

Simon Hammer 3 年之前
父节点
当前提交
4ddbda2a1f

+ 3 - 0
app/build.gradle

@@ -59,6 +59,9 @@ dependencies {
 
     implementation 'com.google.code.gson:gson:2.8.7'
 
+    implementation 'androidx.work:work-runtime:2.6.0'
+
+
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

+ 0 - 1
app/src/main/AndroidManifest.xml

@@ -22,7 +22,6 @@
             </intent-filter>
         </activity>
         <activity android:name=".SettingsActivity"/>
-        <activity android:name=".data.ReadInMailsActivity"/>
     </application>
 
 </manifest>

+ 32 - 15
app/src/main/java/com/noahvogt/miniprojekt/MainActivity.java

@@ -6,9 +6,11 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
+import android.widget.PopupMenu;
 import android.widget.Toast;
 
 import androidx.appcompat.app.AlertDialog;
@@ -18,7 +20,6 @@ import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.fragment.app.DialogFragment;
 
 
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.noahvogt.miniprojekt.DataBase.Message;
 
@@ -35,6 +36,7 @@ import androidx.navigation.NavController;
 import androidx.navigation.Navigation;
 import androidx.navigation.ui.AppBarConfiguration;
 import androidx.navigation.ui.NavigationUI;
+import androidx.work.Data;
 
 import com.chaquo.python.Python;
 import com.chaquo.python.android.AndroidPlatform;
@@ -42,26 +44,26 @@ import com.google.android.material.snackbar.Snackbar;
 import com.noahvogt.miniprojekt.data.CustomAdapter;
 import com.noahvogt.miniprojekt.data.EmailViewModel;
 import com.noahvogt.miniprojekt.data.MailFunctions;
-import com.noahvogt.miniprojekt.data.ReadInMailsActivity;
+import com.noahvogt.miniprojekt.workers.DownloadWorker;
 import com.noahvogt.miniprojekt.ui.show.MessageShowFragment;
 
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
+
 import com.google.gson.Gson;
 
 
 
 import static com.noahvogt.miniprojekt.R.id.drawer_layout;
 
-public class MainActivity extends AppCompatActivity implements View.OnClickListener, CustomAdapter.SelectedMessage {
+public class MainActivity extends AppCompatActivity implements View.OnClickListener, CustomAdapter.SelectedMessage, PopupMenu.OnMenuItemClickListener {
 
     private AppBarConfiguration mAppBarConfiguration;
 
     public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;
+    public static final String emailData = "Email";
+    public static final String passwordData = "Password";
     public static EmailViewModel mEmailViewModel;
     public static RecyclerView recyclerView;
 
@@ -220,6 +222,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
     public boolean onCreateOptionsMenu(Menu menu) {
         /* Inflate the menu; this adds items to the action bar if it is present. */
         getMenuInflater().inflate(R.menu.main, menu);
+
         return true;
     }
 
@@ -321,20 +324,29 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
                 String email = newemail_email.getText().toString();
                 String password = newemail_password.getText().toString();
 
+                Data.Builder builder = new Data.Builder();
+                builder.putString(emailData, email)
+                        .putString(passwordData, password);
+
                 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");
 
-                    Intent intent = new Intent(getBaseContext(), ReadInMailsActivity.class);
+                    dialog.dismiss();
+                    /*makes request to worker and gives data to it*/
+                    mEmailViewModel.applyDownload(builder.build());
+
+                    /*
+                    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);
 
 
@@ -393,12 +405,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         });
 
 
-        newemail_cancel_button.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                dialog.dismiss();
-            }
-        });
+        newemail_cancel_button.setOnClickListener(v -> dialog.dismiss());
 
     }
 
@@ -422,5 +429,15 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         dialog.show(getSupportFragmentManager(), "tag");
 
     }
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        switch (item.getItemId()){
+            case R.id.action_refresh:
+
+                return true;
+        }
+        return false;
+    }
 }
 

+ 18 - 0
app/src/main/java/com/noahvogt/miniprojekt/data/EmailViewModel.java

@@ -4,15 +4,20 @@ import android.app.Application;
 
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.AndroidViewModel;
+import androidx.work.Data;
+import androidx.work.OneTimeWorkRequest;
+import androidx.work.WorkManager;
 
 import com.noahvogt.miniprojekt.DataBase.EmailRepository;
 import com.noahvogt.miniprojekt.DataBase.Message;
+import com.noahvogt.miniprojekt.workers.DownloadWorker;
 
 import java.util.List;
 
 public class EmailViewModel extends AndroidViewModel {
 
     private EmailRepository mEmailRepository;
+    private WorkManager mWorkManager;
 
     private LiveData<List<Message>> mDraftMessage;
     private LiveData<List<Message>> mInboxMessage;
@@ -22,6 +27,7 @@ public class EmailViewModel extends AndroidViewModel {
 
     public EmailViewModel(Application application) {
         super(application);
+        mWorkManager = WorkManager.getInstance(application);
         mEmailRepository = new EmailRepository(application);
         mInboxMessage = mEmailRepository.getInboxMessages();
         mDraftMessage = mEmailRepository.getDraftMessages();
@@ -30,6 +36,16 @@ public class EmailViewModel extends AndroidViewModel {
         mSpamMessage = mEmailRepository.getSpamMessage();
     }
 
+    /*requests Worker and applies password, email to it */
+    public void applyDownload(Data data){
+        OneTimeWorkRequest downloadRequest =
+                new OneTimeWorkRequest.Builder(DownloadWorker.class)
+                .setInputData(data)
+                .build();
+
+        mWorkManager.enqueue(downloadRequest);
+    }
+
     public LiveData<List<Message>> getDraftMessage(){
         return mDraftMessage;
     }
@@ -47,4 +63,6 @@ public class EmailViewModel extends AndroidViewModel {
     public void deleteMessage(Message message){mEmailRepository.deleteMessage(message);}
 
     public void updateMessage(int id, String folder){mEmailRepository.updateMessage(id, folder);}
+
+
 }

+ 13 - 3
app/src/main/java/com/noahvogt/miniprojekt/data/MailFunctions.java

@@ -34,10 +34,12 @@ public class MailFunctions {
         return pythonMailFunctions.callAttr("listMailboxes", IMAPConnection).asList();
     }
 
-    public static List fetchMailsFromBox(PyObject IMAPConnection, String Folder) {
+    public static PyObject fetchMailsFromBox(PyObject IMAPConnection, String Folder) {
         Python python = Python.getInstance();
         PyObject pythonMailFunctions = python.getModule("mailFunctions");
-        return pythonMailFunctions.callAttr("fetchMails", IMAPConnection, Folder).asList();
+        System.out.println(pythonMailFunctions);
+        System.out.println("YAAAAAAYYYY " + pythonMailFunctions.callAttr("fetchMails", IMAPConnection, Folder).toString() + "\n For REAAALLL");
+        return pythonMailFunctions.callAttr("fetchMails", IMAPConnection, Folder);
     }
 
 
@@ -60,6 +62,10 @@ public class MailFunctions {
         String topLevelHost = email.substring(email.lastIndexOf("@") + 1);
         if (topLevelHost.endsWith("edubs.ch")) {
             return "teamwork.edubs.ch";
+
+        }else if (topLevelHost.endsWith("yahoo.com")){
+            return "imap.mail.yahoo.com";
+
         } else {
             return "imap." + topLevelHost;
         }
@@ -69,7 +75,11 @@ public class MailFunctions {
         String topLevelHost = email.substring(email.lastIndexOf("@") + 1);
         if (topLevelHost.equals("noahvogt.com")) {
             return "mail.noahvogt.com";
-        } else {
+
+        } else if (topLevelHost.endsWith("yahoo.com")){
+            return "smtp.mail.yahoo.com";
+        }
+        else {
             return "smtp." + topLevelHost;
         }
     }

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

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

+ 59 - 0
app/src/main/java/com/noahvogt/miniprojekt/workers/DownloadWorker.java

@@ -0,0 +1,59 @@
+package com.noahvogt.miniprojekt.workers;
+
+import android.content.Context;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
+
+import com.chaquo.python.PyObject;
+import com.noahvogt.miniprojekt.MainActivity;
+import com.noahvogt.miniprojekt.data.MailFunctions;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class DownloadWorker extends Worker {
+
+    public DownloadWorker(
+            @NonNull Context appContext,
+            @NonNull WorkerParameters workerParameters){
+        super(appContext, workerParameters);
+    }
+
+    private static final String TAG = DownloadWorker.class.getSimpleName();
+
+
+    @NonNull
+    @NotNull
+    @Override
+    public Result doWork() {
+            try {
+                String mEmail = getInputData().getString(MainActivity.emailData);
+                String mPassword = getInputData().getString(MainActivity.passwordData);
+
+                    List folders = MailFunctions.listMailboxes(MailFunctions.getIMAPConnection(MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword));
+                    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 */
+                        PyObject messages = MailFunctions.fetchMailsFromBox(
+                                MailFunctions.getIMAPConnection(
+                                        MailFunctions.getImapHostFromEmail(mEmail), mEmail, mPassword),
+                                folders.get(i).toString());
+                        System.out.println(folders.get(i).toString());
+                        System.out.println(messages);
+                    }
+
+
+                return Result.success();
+            } catch (Throwable throwable){
+                Log.e(TAG, "Error, downloading Messages", throwable);
+                return Result.failure();
+            }
+
+    }
+}

+ 9 - 9
app/src/main/python/mailFunctions.py

@@ -99,15 +99,15 @@ def verifyNoBytes(messages, output_list):
                 exit()
 
 def fetchMails(connection, inbox):
-    print("###" + inbox + "###")
-    print(type(inbox))
+    #print("###" + inbox + "###")
+    #print(type(inbox))
     try:
         status, messages = connection.select(inbox)
     except:
         return []
 
-    print("status-------\n" + status)
-    print("messages-------\n" + str(messages))
+    #print("status-------\n" + status)
+    #print("messages-------\n" + str(messages))
     # number of top emails to fetch
     #N = 3
     # total number of emails
@@ -124,12 +124,12 @@ def fetchMails(connection, inbox):
 
             msg = email.message_from_bytes(data[0][1])
 
-            print(num)
+            #print(num)
 
             raw_string = email.header.decode_header(msg['Subject'])[0]
-            print("raw_string: " + str(raw_string))
+            #print("raw_string: " + str(raw_string))
             raw_from = email.header.decode_header(msg['From'])
-            print("raw_from" + str(raw_from))
+            #print("raw_from" + str(raw_from))
             try:
                 raw_to = email.header.decode_header(msg['To'])
             except TypeError:
@@ -142,9 +142,9 @@ def fetchMails(connection, inbox):
                 raw_bcc = email.header.decode_header(msg['BCC'])
             except TypeError:
                 raw_bcc = [""]
-            print("raw_to" + str(raw_to))
+            #print("raw_to" + str(raw_to))
             raw_date = email.header.decode_header(msg['Date'])[0]
-            print("raw_to" + str(raw_date))
+            #print("raw_to" + str(raw_date))
 
             raw_msg = str(msg)
 

+ 3 - 0
app/src/main/res/menu/main.xml

@@ -6,4 +6,7 @@
         android:orderInCategory="100"
         android:title="@string/action_settings"
         app:showAsAction="never" />
+    <item
+        android:id="@+id/action_refresh"
+        android:title="@string/action_refresh"/>
 </menu>

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

@@ -5,7 +5,9 @@
     <string name="nav_header_title">Max Mustermann</string>
     <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_refresh">Refresh</string>
 
     <string name="drawer_inbox">Inbox</string>
     <string name="drawer_sent">Sent</string>