From fdcf20dcd02268d263b8c7b9b0c0ea196e407b16 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 17 Dec 2021 19:34:39 +0100 Subject: [PATCH] Added option to group by sender/subject --- .../java/eu/faircode/email/DaoMessage.java | 6 ++++++ .../email/FragmentOptionsSynchronize.java | 15 ++++++++++++++- .../java/eu/faircode/email/MessageHelper.java | 18 +++++++++++++++++- .../layout/fragment_options_synchronize.xml | 14 +++++++++++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 56bb083acf..128484aeab 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -421,6 +421,12 @@ public interface DaoMessage { " AND inreplyto = :inreplyto") List getMessagesByInReplyTo(long account, String inreplyto); + @Query("SELECT * FROM message" + + " WHERE account = :account" + + " AND sender = :sender" + + " AND subject = :subject") + List getMessagesBySubject(long account, String sender, String subject); + @Query("SELECT message.* FROM message" + " LEFT JOIN message AS base ON base.id = :id" + " WHERE message.account = :account" + diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java index 6fb06b95f3..6d6ea131ef 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java @@ -82,6 +82,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr private SwitchCompat swDeleteUnseen; private SwitchCompat swSyncKept; private SwitchCompat swGmailThread; + private SwitchCompat swSubjectThreading; private SwitchCompat swSyncFolders; private SwitchCompat swSyncFoldersPoll; private SwitchCompat swSyncSharedFolders; @@ -103,7 +104,8 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr private final static String[] RESET_OPTIONS = new String[]{ "enabled", "poll_interval", "auto_optimize", "schedule", "schedule_start", "schedule_end", "sync_quick_imap", "sync_quick_pop", - "sync_nodate", "sync_unseen", "sync_flagged", "delete_unseen", "sync_kept", "gmail_thread_id", + "sync_nodate", "sync_unseen", "sync_flagged", "delete_unseen", "sync_kept", + "gmail_thread_id", "subject_threading", "sync_folders", "sync_folders_poll", "sync_shared_folders", "subscriptions", "check_authentication", "check_reply_domain", "check_mx", "check_blocklist", "use_blocklist", "tune_keep_alive" @@ -149,6 +151,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr swDeleteUnseen = view.findViewById(R.id.swDeleteUnseen); swSyncKept = view.findViewById(R.id.swSyncKept); swGmailThread = view.findViewById(R.id.swGmailThread); + swSubjectThreading = view.findViewById(R.id.swSubjectThreading); swSyncFolders = view.findViewById(R.id.swSyncFolders); swSyncFoldersPoll = view.findViewById(R.id.swSyncFoldersPoll); swSyncSharedFolders = view.findViewById(R.id.swSyncSharedFolders); @@ -325,6 +328,14 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("gmail_thread_id", checked).apply(); + swSubjectThreading.setEnabled(!checked); + } + }); + + swSubjectThreading.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("subject_threading", checked).apply(); } }); @@ -493,6 +504,8 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr swDeleteUnseen.setChecked(prefs.getBoolean("delete_unseen", false)); swSyncKept.setChecked(prefs.getBoolean("sync_kept", true)); swGmailThread.setChecked(prefs.getBoolean("gmail_thread_id", false)); + swSubjectThreading.setChecked(prefs.getBoolean("subject_threading", false)); + swSubjectThreading.setEnabled(!swGmailThread.isChecked()); swSyncFolders.setChecked(prefs.getBoolean("sync_folders", true)); swSyncFoldersPoll.setChecked(prefs.getBoolean("sync_folders_poll", false)); swSyncFoldersPoll.setEnabled(swSyncFolders.isChecked()); diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index f7df49a93f..a20f65c5b9 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -1274,9 +1274,10 @@ public class MessageHelper { } String getThreadId(Context context, long account, long folder, long uid) throws MessagingException { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (imessage instanceof GmailMessage) { // https://developers.google.com/gmail/imap/imap-extensions#access_to_the_gmail_thread_id_x-gm-thrid - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean gmail_thread_id = prefs.getBoolean("gmail_thread_id", false); if (gmail_thread_id) { long thrid = ((GmailMessage) imessage).getThrId(); @@ -1330,6 +1331,21 @@ public class MessageHelper { db.message().updateMessageThread(message.account, message.thread, thread); } + boolean subject_threading = prefs.getBoolean("subject_threading", false); + if (subject_threading) { + String sender = getSortKey(getFrom()); + String subject = getSubject(); + if (!TextUtils.isEmpty(sender) && !TextUtils.isEmpty(subject)) { + List subjects = db.message().getMessagesBySubject(account, sender, subject); + for (EntityMessage message : subjects) + if (!thread.equals(message.thread)) { + Log.w("Updating subject thread from " + message.thread + " to " + thread); + db.message().updateMessageThread(message.account, message.thread, thread); + } + } + } + + return thread; } diff --git a/app/src/main/res/layout/fragment_options_synchronize.xml b/app/src/main/res/layout/fragment_options_synchronize.xml index 31c36b4508..e717a0009d 100644 --- a/app/src/main/res/layout/fragment_options_synchronize.xml +++ b/app/src/main/res/layout/fragment_options_synchronize.xml @@ -577,6 +577,18 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swGmailThread" /> + + Delete old unread messages Check if old messages were removed from the server Gmail message grouping style for Gmail accounts + Group messages by sender and subject Synchronize folder list Actively synchronize folder list Synchronize shared folder lists