diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index b6ac6e8b17..274a21964b 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -298,6 +298,7 @@ public class AdapterMessage extends RecyclerView.Adapter languages; private static boolean debug; + private int level; private boolean gotoTop = false; private Integer gotoPos = null; @@ -1399,6 +1400,8 @@ public class AdapterMessage extends RecyclerView.Adapter callback = new DiffUtil.ItemCallback() { @Override diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index cae4b2da5e..6504f59dc7 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2729,7 +2729,7 @@ class Core { message.references = TextUtils.join(" ", helper.getReferences()); message.inreplyto = helper.getInReplyTo(); message.deliveredto = helper.getDeliveredTo(); - message.thread = helper.getThreadId(context, account.id, 0); + message.thread = helper.getThreadId(context, account.id, folder.id, 0); message.priority = helper.getPriority(); message.auto_submitted = helper.getAutoSubmitted(); message.receipt_request = helper.getReceiptRequested(); @@ -3615,7 +3615,7 @@ class Core { have = true; if (dup.folder.equals(folder.id)) { - String thread = helper.getThreadId(context, account.id, uid); + String thread = helper.getThreadId(context, account.id, folder.id, uid); Log.i(folder.name + " found as id=" + dup.id + " uid=" + dup.uid + "/" + uid + " msgid=" + msgid + " thread=" + thread); @@ -3701,7 +3701,7 @@ class Core { message.inreplyto = helper.getInReplyTo(); // Local address contains control or whitespace in string ``mailing list someone@example.org'' message.deliveredto = helper.getDeliveredTo(); - message.thread = helper.getThreadId(context, account.id, uid); + message.thread = helper.getThreadId(context, account.id, folder.id, uid); message.priority = helper.getPriority(); message.auto_submitted = helper.getAutoSubmitted(); message.receipt_request = helper.getReceiptRequested(); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java index 5267c225f5..265104c3a1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptions.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java @@ -144,7 +144,7 @@ public class FragmentOptions extends FragmentBase { "swipe_reply", "language_detection", "quick_filter", "quick_scroll", - "experiments", "debug", + "experiments", "debug", "log_level", "biometrics", "default_light" }; diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index a8b123b427..253282f2e5 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -1135,7 +1135,7 @@ public class MessageHelper { return (header == null ? null : MimeUtility.unfold(header)); } - String getThreadId(Context context, long account, long uid) throws MessagingException { + String getThreadId(Context context, long account, long folder, long uid) throws MessagingException { 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); @@ -1173,23 +1173,24 @@ public class MessageHelper { } } - if (thread == null && refs.size() > 0) - thread = refs.get(0); - - if (thread != null) { - List after = db.message().getMessagesByInReplyTo(account, msgid); - for (EntityMessage message : after) - if (!TextUtils.isEmpty(message.thread) && !thread.equals(message.thread)) { - Log.w("Updating after thread from " + message.thread + " to " + thread); - db.message().updateMessageThread(message.account, message.thread, thread); + if (thread == null) { + List similar = db.message().getMessagesByMsgId(account, msgid); + for (EntityMessage message : similar) + if (!TextUtils.isEmpty(message.thread) && message.folder != folder) { + thread = message.thread; + break; } } if (thread == null) - if (TextUtils.isEmpty(msgid)) - thread = Long.toString(uid); - else - thread = msgid; + thread = (uid == 0 /* POP3 */ ? msgid : account + ":" + folder + ":" + uid); + + List after = db.message().getMessagesByInReplyTo(account, msgid); + for (EntityMessage message : after) + if (!TextUtils.isEmpty(message.thread) && !thread.equals(message.thread)) { + Log.w("Updating after thread from " + message.thread + " to " + thread); + db.message().updateMessageThread(message.account, message.thread, thread); + } return thread; }