From 6ec57066bdd75a79a69df51b9300544c61f0031e Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 17 Dec 2021 20:48:30 +0100 Subject: [PATCH] Limit subject threading to 24 hours --- .../main/java/eu/faircode/email/DaoMessage.java | 11 +++++++---- .../email/FragmentOptionsSynchronize.java | 4 ++++ .../java/eu/faircode/email/MessageHelper.java | 11 ++++++----- .../res/layout/fragment_options_synchronize.xml | 15 ++++++++++++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 128484aeab..804beb2413 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -424,8 +424,9 @@ public interface DaoMessage { @Query("SELECT * FROM message" + " WHERE account = :account" + " AND sender = :sender" + - " AND subject = :subject") - List getMessagesBySubject(long account, String sender, String subject); + " AND subject = :subject" + + " AND received >= :since") + List getMessagesBySubject(long account, String sender, String subject, long since); @Query("SELECT message.* FROM message" + " LEFT JOIN message AS base ON base.id = :id" + @@ -647,8 +648,10 @@ public interface DaoMessage { int updateMessage(EntityMessage message); @Query("UPDATE message SET thread = :thread" + - " WHERE account = :account AND thread = :old AND NOT (:old IS :thread)") - int updateMessageThread(long account, String old, String thread); + " WHERE account = :account" + + " AND thread = :old AND NOT (:old IS :thread)" + + " AND (:since IS NULL OR received >= :since)") + int updateMessageThread(long account, String old, String thread, Long since); @Query("UPDATE message SET uid = :uid WHERE id = :id AND NOT (uid IS :uid)") int setMessageUid(long id, Long uid); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java index 6d6ea131ef..306b2e5667 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java @@ -83,6 +83,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr private SwitchCompat swSyncKept; private SwitchCompat swGmailThread; private SwitchCompat swSubjectThreading; + private TextView tvSubjectThreading; private SwitchCompat swSyncFolders; private SwitchCompat swSyncFoldersPoll; private SwitchCompat swSyncSharedFolders; @@ -152,6 +153,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr swSyncKept = view.findViewById(R.id.swSyncKept); swGmailThread = view.findViewById(R.id.swGmailThread); swSubjectThreading = view.findViewById(R.id.swSubjectThreading); + tvSubjectThreading = view.findViewById(R.id.tvSubjectThreading); swSyncFolders = view.findViewById(R.id.swSyncFolders); swSyncFoldersPoll = view.findViewById(R.id.swSyncFoldersPoll); swSyncSharedFolders = view.findViewById(R.id.swSyncSharedFolders); @@ -422,6 +424,8 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr // Initialize FragmentDialogTheme.setBackground(getContext(), view, false); + tvSubjectThreading.setText(getString(R.string.title_advanced_subject_threading_hint, MessageHelper.MAX_SUBJECT_AGE)); + DB db = DB.getInstance(getContext()); db.account().liveSynchronizingAccounts().observe(getViewLifecycleOwner(), new Observer>() { @Override diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 67f7983c2c..c7d3f48117 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -129,6 +129,7 @@ public class MessageHelper { static final int SMALL_MESSAGE_SIZE = 192 * 1024; // bytes static final int DEFAULT_DOWNLOAD_SIZE = 4 * 1024 * 1024; // bytes static final String HEADER_CORRELATION_ID = "X-Correlation-ID"; + static final int MAX_SUBJECT_AGE = 48; // hours private static final int MAX_HEADER_LENGTH = 998; private static final int MAX_MESSAGE_SIZE = 10 * 1024 * 1024; // bytes @@ -1324,31 +1325,31 @@ public class MessageHelper { for (EntityMessage message : before) if (!thread.equals(message.thread)) { Log.w("Updating before thread from " + message.thread + " to " + thread); - db.message().updateMessageThread(message.account, message.thread, thread); + db.message().updateMessageThread(message.account, message.thread, thread, null); } List after = db.message().getMessagesByInReplyTo(account, msgid); for (EntityMessage message : after) if (!thread.equals(message.thread)) { Log.w("Updating after thread from " + message.thread + " to " + thread); - db.message().updateMessageThread(message.account, message.thread, thread); + db.message().updateMessageThread(message.account, message.thread, thread, null); } boolean subject_threading = prefs.getBoolean("subject_threading", false); if (subject_threading) { String sender = getSortKey(getFrom()); String subject = getSubject(); + long since = new Date().getTime() - MAX_SUBJECT_AGE * 3600 * 1000L; if (!TextUtils.isEmpty(sender) && !TextUtils.isEmpty(subject)) { - List subjects = db.message().getMessagesBySubject(account, sender, subject); + List subjects = db.message().getMessagesBySubject(account, sender, subject, since); 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); + db.message().updateMessageThread(message.account, message.thread, thread, since); } } } - 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 e717a0009d..10c7e6e650 100644 --- a/app/src/main/res/layout/fragment_options_synchronize.xml +++ b/app/src/main/res/layout/fragment_options_synchronize.xml @@ -589,6 +589,19 @@ app:layout_constraintTop_toBottomOf="@id/tvGmailThreadHint" app:switchPadding="12dp" /> + + When disabled, unread messages are kept on the device forever This will transfer extra data and consume extra battery power, especially if a lot of messages are stored on the device This only applies to newly received messages and can break existing groups + Only messages received in the last %1$d hours Disabling this will reduce data and battery usage somewhat, but will disable updating the list of folders too Periodically synchronize the folder list in addition to after connecting to an account This will check the results of DKIM, SPF and DMARC authentication as performed by the email server