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.setFlags(imessages, new Flags(flag), set);
+ 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);
+ }
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