From 44abd3cd16a88e874e6d5d89cfae6d150a89c7df Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 17 Jan 2022 21:36:07 +0100 Subject: [PATCH] Added bacth seen/flagged --- app/src/main/java/eu/faircode/email/Core.java | 100 +++++++++++------- .../java/eu/faircode/email/DaoOperation.java | 14 +-- .../eu/faircode/email/TupleOperationEx.java | 11 +- 3 files changed, 76 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 0226eb2fc6..4d19fe57d7 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -253,6 +253,22 @@ class Core { TupleOperationEx next = ops.get(j); switch (op.name) { + case EntityOperation.SEEN: + case EntityOperation.FLAG: + if (group && + message.uid != null && + op.name.equals(next.name) && + account.protocol == EntityAccount.TYPE_IMAP) { + JSONArray jnext = new JSONArray(next.args); + // Same flag + if (jargs.getBoolean(0) == jnext.getBoolean(0)) { + EntityMessage m = db.message().getMessage(next.message); + if (m != null && m.uid != null) + similar.put(next, m); + } + } + break; + case EntityOperation.ADD: // Same message if (Objects.equals(op.message, next.message) && @@ -404,11 +420,11 @@ class Core { switch (op.name) { case EntityOperation.SEEN: - onSeen(context, jargs, folder, message, (IMAPFolder) ifolder); + onSetFlag(context, jargs, folder, messages, (IMAPFolder) ifolder, Flags.Flag.SEEN); break; case EntityOperation.FLAG: - onFlag(context, jargs, folder, message, (IMAPFolder) ifolder); + onSetFlag(context, jargs, folder, messages, (IMAPFolder) ifolder, Flags.Flag.FLAGGED); break; case EntityOperation.ANSWERED: @@ -840,30 +856,60 @@ class Core { return null; } - private static void onSeen(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, JSONException { + private static void onSetFlag(Context context, JSONArray jargs, EntityFolder folder, List messages, IMAPFolder ifolder, Flags.Flag flag) throws MessagingException, JSONException { // Mark message (un)seen DB db = DB.getInstance(context); + if (flag != Flags.Flag.SEEN && flag != Flags.Flag.FLAGGED) + throw new IllegalArgumentException("Invalid flag=" + flag); + if (folder.read_only) return; - if (!ifolder.getPermanentFlags().contains(Flags.Flag.SEEN)) { - db.message().setMessageSeen(message.id, false); - db.message().setMessageUiSeen(message.id, false); + if (!ifolder.getPermanentFlags().contains(flag)) { + for (EntityMessage message : messages) + if (flag == Flags.Flag.SEEN) { + db.message().setMessageSeen(message.id, false); + db.message().setMessageUiSeen(message.id, false); + } else if (flag == Flags.Flag.FLAGGED) { + db.message().setMessageFlagged(message.id, false); + db.message().setMessageUiFlagged(message.id, false, null); + } return; } - boolean seen = jargs.getBoolean(0); - if (message.seen.equals(seen)) + List uids = new ArrayList<>(); + boolean set = jargs.getBoolean(0); + for (EntityMessage message : messages) { + if (message.uid == null) + if (messages.size() == 1) + throw new IllegalArgumentException("Set flag: uid missing"); + else + throw new MessagingException("Set flag: uid missing"); + if (flag == Flags.Flag.SEEN && !message.seen.equals(set)) + uids.add(message.uid); + else if (flag == Flags.Flag.FLAGGED && !message.flagged.equals(set)) + uids.add(message.uid); + } + + if (uids.size() == 0) return; - Message imessage = ifolder.getMessageByUID(message.uid); - if (imessage == null) - throw new MessageRemovedException(); + 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"); - imessage.setFlag(Flags.Flag.SEEN, seen); + ifolder.setFlags(imessages, new Flags(flag), set); - db.message().setMessageSeen(message.id, seen); + for (EntityMessage message : messages) + if (flag == Flags.Flag.SEEN && !message.seen.equals(set)) + db.message().setMessageSeen(message.id, set); + else if (flag == Flags.Flag.FLAGGED && !message.flagged.equals(set)) + db.message().setMessageFlagged(message.id, set); } private static void onSeen(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, POP3Folder ifolder) throws JSONException { @@ -874,34 +920,6 @@ class Core { db.message().setMessageUiSeen(message.id, seen); } - private static void onFlag(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, JSONException, IOException { - // Star/unstar message - DB db = DB.getInstance(context); - - if (folder.read_only) - return; - - if (!ifolder.getPermanentFlags().contains(Flags.Flag.FLAGGED)) { - db.message().setMessageFlagged(message.id, false); - db.message().setMessageUiFlagged(message.id, false, null); - return; - } - - boolean flagged = jargs.getBoolean(0); - if (message.flagged.equals(flagged)) - return; - - Message imessage = ifolder.getMessageByUID(message.uid); - if (imessage == null) - throw new MessageRemovedException(); - - imessage.setFlag(Flags.Flag.FLAGGED, flagged); - if (imessage instanceof GmailMessage) - ((GmailMessage) imessage).setLabels(new String[]{"\\Starred"}, flagged); - - db.message().setMessageFlagged(message.id, flagged); - } - private static void onFlag(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, POP3Folder ifolder) throws MessagingException, JSONException { // Star/unstar message DB db = DB.getInstance(context); diff --git a/app/src/main/java/eu/faircode/email/DaoOperation.java b/app/src/main/java/eu/faircode/email/DaoOperation.java index b120f655f0..808761c524 100644 --- a/app/src/main/java/eu/faircode/email/DaoOperation.java +++ b/app/src/main/java/eu/faircode/email/DaoOperation.java @@ -30,13 +30,15 @@ import java.util.List; @Dao public interface DaoOperation { String priority = "CASE" + - " WHEN operation.name = '" + EntityOperation.BODY + "' THEN -4" + - " WHEN operation.name = '" + EntityOperation.ATTACHMENT + "' THEN -3" + - " WHEN operation.name = '" + EntityOperation.HEADERS + "' THEN -2" + - " WHEN operation.name = '" + EntityOperation.RAW + "' THEN -2" + - " WHEN operation.name = '" + EntityOperation.SYNC + "' AND folder.account IS NULL THEN -1" + // Outbox + " WHEN operation.name = '" + EntityOperation.BODY + "' THEN -5" + + " WHEN operation.name = '" + EntityOperation.ATTACHMENT + "' THEN -4" + + " WHEN operation.name = '" + EntityOperation.HEADERS + "' THEN -3" + + " WHEN operation.name = '" + EntityOperation.RAW + "' THEN -3" + + " WHEN operation.name = '" + EntityOperation.SYNC + "' AND folder.account IS NULL THEN -2" + // Outbox + " WHEN operation.name = '" + EntityOperation.ADD + "' THEN -1" + + " WHEN operation.name = '" + EntityOperation.DELETE + "' THEN -1" + + // Other operations: seen, answered, flag, keyword, label, subscribe, send, rule " WHEN operation.name = '" + EntityOperation.SYNC + "' AND folder.account IS NOT NULL THEN 1" + - // Other operations: add, delete, seen, answered, flag, keyword, label, subscribe, send " WHEN operation.name = '" + EntityOperation.FETCH + "' THEN 2" + " WHEN operation.name = '" + EntityOperation.EXISTS + "' THEN 3" + " WHEN operation.name = '" + EntityOperation.REPORT + "' THEN 3" + diff --git a/app/src/main/java/eu/faircode/email/TupleOperationEx.java b/app/src/main/java/eu/faircode/email/TupleOperationEx.java index 95fce10d09..7084eb72a4 100644 --- a/app/src/main/java/eu/faircode/email/TupleOperationEx.java +++ b/app/src/main/java/eu/faircode/email/TupleOperationEx.java @@ -59,9 +59,16 @@ public class TupleOperationEx extends EntityOperation { key.priority = this.priority; - if (ADD.equals(name) || DELETE.equals(name)) { + if (ADD.equals(name) || + DELETE.equals(name)) key.id = "msg:" + message; - } else if (FETCH.equals(name)) + else if (SEEN.equals(name) || + ANSWERED.equals(name) || + FLAG.equals(name) || + KEYWORD.equals(name) || + LABEL.equals(name)) + key.id = "flags:" + folder; + else if (FETCH.equals(name)) try { JSONArray jargs = new JSONArray(args); long uid = jargs.getLong(0);