From e9310d56b5f014a541804269d86bc90d6d4489db Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 26 Mar 2022 13:16:53 +0100 Subject: [PATCH] UID EXPUNGE for folders --- app/src/main/java/eu/faircode/email/Core.java | 28 ++++++++++++++++++- .../java/eu/faircode/email/DaoMessage.java | 6 ++++ .../faircode/email/FragmentOptionsMisc.java | 2 -- .../main/res/layout/fragment_options_misc.xml | 1 - 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 391afe04cd..f6a8ac6977 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2692,7 +2692,33 @@ class Core { private static void onExpungeFolder(Context context, JSONArray jargs, EntityFolder folder, IMAPFolder ifolder) throws MessagingException { Log.i(folder.name + " expunge"); - ifolder.expunge(); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean uid_expunge = prefs.getBoolean("uid_expunge", false); + int chunk_size = prefs.getInt("chunk_size", DEFAULT_CHUNK_SIZE); + + if (uid_expunge) + uid_expunge = MessageHelper.hasCapability(ifolder, "UIDPLUS"); + + if (uid_expunge) { + DB db = DB.getInstance(context); + + List uids = db.message().getDeletedUids(folder.id); + if (uids == null || uids.size() == 0) + return; + + Log.i(ifolder.getName() + " expunging " + TextUtils.join(",", uids)); + ifolder.doCommand(new IMAPFolder.ProtocolCommand() { + @Override + public Object doCommand(IMAPProtocol protocol) throws ProtocolException { + for (List list : Helper.chunkList(uids, chunk_size)) + protocol.uidexpunge(UIDSet.createUIDSets(Helper.toLongArray(list))); + return null; + } + }); + Log.i(ifolder.getName() + " expunged " + TextUtils.join(",", uids)); + } else + ifolder.expunge(); } private static void onPurgeFolder(Context context, EntityFolder folder) { diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index b71a122fda..58f3b1ad8d 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -623,6 +623,12 @@ public interface DaoMessage { " AND NOT content") List getMessagesWithoutContent(long folder, Long received); + @Query("SELECT uid FROM message" + + " WHERE folder = :folder" + + " AND ui_deleted" + + " AND NOT uid IS NULL") + List getDeletedUids(long folder); + @Query("SELECT uid FROM message" + " WHERE folder = :folder" + " AND NOT ui_busy IS NULL" + diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 430165313f..5429a2a9d4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -1043,7 +1043,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("perform_expunge", checked).apply(); - swUidExpunge.setEnabled(checked); ServiceSynchronize.reload(compoundButton.getContext(), null, true, "perform_expunge"); } }); @@ -1713,7 +1712,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swUid.setChecked(prefs.getBoolean("uid_command", false)); swExpunge.setChecked(prefs.getBoolean("perform_expunge", true)); swUidExpunge.setChecked(prefs.getBoolean("uid_expunge", false)); - swUidExpunge.setEnabled(swExpunge.isChecked()); swAuthPlain.setChecked(prefs.getBoolean("auth_plain", true)); swAuthLogin.setChecked(prefs.getBoolean("auth_login", true)); swAuthNtlm.setChecked(prefs.getBoolean("auth_ntlm", true)); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 2a4399667e..1bd55f4bf8 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -997,7 +997,6 @@ android:id="@+id/swUidExpunge" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="12dp" android:layout_marginTop="12dp" android:text="@string/title_advanced_uid_expunge" app:layout_constraintEnd_toEndOf="parent"