diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 40f90fd079..15a212eb55 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -698,20 +698,25 @@ class Core { String label = jargs.getString(0); boolean set = jargs.getBoolean(1); - Message imessage = ifolder.getMessageByUID(message.uid); - if (imessage == null) - throw new MessageRemovedException(); - - if (!(imessage instanceof GmailMessage)) - throw new IllegalArgumentException("GmailMessage"); - - ((GmailMessage) imessage).setLabels(new String[]{label}, set); - // Gmail does not push label changes - message.setLabel(label, set); + try { + Message imessage = ifolder.getMessageByUID(message.uid); + if (imessage instanceof GmailMessage) + ((GmailMessage) imessage).setLabels(new String[]{label}, set); + } catch (MessagingException ex) { + Log.w(ex); + } DB db = DB.getInstance(context); - db.message().setMessageLabels(message.id, DB.Converters.fromStringArray(message.labels)); + List messages = db.message().getMessagesByMsgId(message.account, message.msgid); + if (messages != null) + for (EntityMessage m : messages) { + EntityFolder f = db.folder().getFolder(m.folder); + if (!label.equals(f.name) && m.setLabel(label, set)) { + Log.i("Set " + label + "=" + set + " id=" + m.id + " folder=" + f.name); + db.message().setMessageLabels(m.id, DB.Converters.fromStringArray(m.labels)); + } + } } private static void onAdd(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPStore istore, IMAPFolder ifolder, State state) throws MessagingException, IOException { @@ -1018,13 +1023,39 @@ class Core { ifolder.fetch(new Message[]{imessage}, fp); EntityMessage message = synchronizeMessage(context, account, folder, istore, ifolder, imessage, false, download, rules, state); - if (download && message != null) - downloadMessage(context, account, folder, istore, ifolder, imessage, message.id, state); + if (message != null) { + if (account.isGmail() && EntityFolder.USER.equals(folder.type)) + try { + JSONArray jlabel = new JSONArray(); + jlabel.put(0, folder.name); + jlabel.put(1, true); + onLabel(context, jlabel, folder, message, istore, ifolder, state); + } catch (Throwable ex1) { + Log.e(ex1); + } + + if (download) + downloadMessage(context, account, folder, istore, ifolder, imessage, message.id, state); + } } finally { ((IMAPMessage) imessage).invalidateHeaders(); } } catch (MessageRemovedException ex) { Log.i(ex); + + if (account.isGmail() && EntityFolder.USER.equals(folder.type)) { + EntityMessage message = db.message().getMessageByUid(folder.id, uid); + if (message != null) + try { + JSONArray jlabel = new JSONArray(); + jlabel.put(0, folder.name); + jlabel.put(1, false); + onLabel(context, jlabel, folder, message, istore, ifolder, state); + } catch (Throwable ex1) { + Log.e(ex1); + } + } + db.message().deleteMessage(folder.id, uid); } finally { int count = ifolder.getMessageCount(); diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 9ffe19eaee..be2451bf3d 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -244,14 +244,28 @@ public class EntityMessage implements Serializable { return "notification." + sender.getAddress().toLowerCase(Locale.ROOT); } - void setLabel(String label, boolean set) { + boolean setLabel(String label, boolean set) { List list = new ArrayList<>(); if (labels != null) list.addAll(Arrays.asList(labels)); - list.remove(label); - if (set) - list.add(label); - labels = list.toArray(new String[0]); + + boolean changed = false; + if (set) { + if (!list.contains(label)) { + changed = true; + list.add(label); + } + } else { + if (list.contains(label)) { + changed = true; + list.remove(label); + } + } + + if (changed) + labels = list.toArray(new String[0]); + + return changed; } static File getFile(Context context, Long id) {