mirror of
https://github.com/M66B/FairEmail.git
synced 2026-03-31 22:26:06 +02:00
Added bacth seen/flagged
This commit is contained in:
@@ -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<EntityMessage> 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<Long> 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);
|
||||
|
||||
@@ -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" +
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user