Propagate labels

This commit is contained in:
M66B 2020-06-25 19:53:30 +02:00
parent 1488a37caa
commit 141d57ba18
2 changed files with 63 additions and 18 deletions

View File

@ -698,20 +698,25 @@ class Core {
String label = jargs.getString(0); String label = jargs.getString(0);
boolean set = jargs.getBoolean(1); 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 // 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 db = DB.getInstance(context);
db.message().setMessageLabels(message.id, DB.Converters.fromStringArray(message.labels)); List<EntityMessage> 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 { 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); ifolder.fetch(new Message[]{imessage}, fp);
EntityMessage message = synchronizeMessage(context, account, folder, istore, ifolder, imessage, false, download, rules, state); EntityMessage message = synchronizeMessage(context, account, folder, istore, ifolder, imessage, false, download, rules, state);
if (download && message != null) if (message != null) {
downloadMessage(context, account, folder, istore, ifolder, imessage, message.id, state); 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 { } finally {
((IMAPMessage) imessage).invalidateHeaders(); ((IMAPMessage) imessage).invalidateHeaders();
} }
} catch (MessageRemovedException ex) { } catch (MessageRemovedException ex) {
Log.i(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); db.message().deleteMessage(folder.id, uid);
} finally { } finally {
int count = ifolder.getMessageCount(); int count = ifolder.getMessageCount();

View File

@ -244,14 +244,28 @@ public class EntityMessage implements Serializable {
return "notification." + sender.getAddress().toLowerCase(Locale.ROOT); return "notification." + sender.getAddress().toLowerCase(Locale.ROOT);
} }
void setLabel(String label, boolean set) { boolean setLabel(String label, boolean set) {
List<String> list = new ArrayList<>(); List<String> list = new ArrayList<>();
if (labels != null) if (labels != null)
list.addAll(Arrays.asList(labels)); list.addAll(Arrays.asList(labels));
list.remove(label);
if (set) boolean changed = false;
list.add(label); if (set) {
labels = list.toArray(new String[0]); 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) { static File getFile(Context context, Long id) {