From 86d655c98eff086e27d2c496f6959f2db5a72287 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 28 Jan 2022 08:41:02 +0100 Subject: [PATCH] Set flags with UID command --- app/src/main/java/eu/faircode/email/Core.java | 42 +++++++++++++++---- .../faircode/email/FragmentOptionsMisc.java | 12 +++++- .../main/res/layout/fragment_options_misc.xml | 13 +++++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 988679ae22..45ccdee643 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -866,6 +866,9 @@ class Core { // Mark message (un)seen DB db = DB.getInstance(context); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean uid_command = prefs.getBoolean("uid_command", false); + if (flag != Flags.Flag.SEEN && flag != Flags.Flag.FLAGGED) throw new IllegalArgumentException("Invalid flag=" + flag); @@ -901,15 +904,38 @@ class Core { if (uids.size() == 0) return; - Message[] imessages = ifolder.getMessagesByUID(Helper.toLongArray(uids)); - for (Message imessage : imessages) - if (imessage == null) - if (messages.size() == 1) - throw new MessageRemovedException(); - else - throw new MessagingException("Set flag: message missing"); + if (uid_command) { + String flags; + if (flag == Flags.Flag.SEEN) + flags = "\\Seen"; + else if (flag == Flags.Flag.FLAGGED) + flags = "\\Flagged"; + else + throw new IllegalArgumentException("Unknown flag=" + flag); + + ifolder.doCommand(new IMAPFolder.ProtocolCommand() { + @Override + public Object doCommand(IMAPProtocol protocol) throws ProtocolException { + for (long uid : uids) { + Response[] r = protocol.command( + "UID STORE " + uid + (set ? " +" : " -") + "FLAGS " + flags, null); + protocol.notifyResponseHandlers(r); + protocol.handleResult(r[r.length - 1]); + } + return null; + } + }); + } else { + Message[] imessages = ifolder.getMessagesByUID(Helper.toLongArray(uids)); + for (Message imessage : imessages) + if (imessage == null) + if (messages.size() == 1) + throw new MessageRemovedException(); + else + throw new MessagingException("Set flag: message missing"); - ifolder.setFlags(imessages, new Flags(flag), set); + ifolder.setFlags(imessages, new Flags(flag), set); + } for (EntityMessage message : messages) if (flag == Flags.Flag.SEEN && !message.seen.equals(set)) diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index b0951a599a..b551b40c48 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -146,6 +146,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swUndoManager; private SwitchCompat swWebViewLegacy; private SwitchCompat swModSeq; + private SwitchCompat swUid; private SwitchCompat swExpunge; private SwitchCompat swUidExpunge; private SwitchCompat swAuthPlain; @@ -190,7 +191,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "protocol", "debug", "log_level", "test1", "test2", "test3", "test4", "test5", "query_threads", "wal", "checkpoints", "sqlite_cache", "chunk_size", "undo_manager", "webview_legacy", - "use_modseq", "perform_expunge", "uid_expunge", + "use_modseq", "uid_command", "perform_expunge", "uid_expunge", "auth_plain", "auth_login", "auth_ntlm", "auth_sasl", "keep_alive_poll", "empty_pool", "idle_done", "exact_alarms", "infra", "dup_msgids", "test_iab" @@ -291,6 +292,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swUndoManager = view.findViewById(R.id.swUndoManager); swWebViewLegacy = view.findViewById(R.id.swWebViewLegacy); swModSeq = view.findViewById(R.id.swModSeq); + swUid = view.findViewById(R.id.swUid); swExpunge = view.findViewById(R.id.swExpunge); swUidExpunge = view.findViewById(R.id.swUidExpunge); swAuthPlain = view.findViewById(R.id.swAuthPlain); @@ -891,6 +893,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swUid.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("uid_command", checked).apply(); + } + }); + swExpunge.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -1439,6 +1448,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swUndoManager.setChecked(prefs.getBoolean("undo_manager", false)); swWebViewLegacy.setChecked(prefs.getBoolean("webview_legacy", false)); swModSeq.setChecked(prefs.getBoolean("use_modseq", true)); + 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()); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 67d1d14521..b5dd2d7789 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -871,6 +871,17 @@ app:layout_constraintTop_toBottomOf="@id/swWebViewLegacy" app:switchPadding="12dp" /> + + Use Android\'s undo manager Old WebView behavior MODSEQ + UID command AUTO EXPUNGE UID EXPUNGE Hide deleted messages