diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index d813111dee..7518cc94bc 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -3601,13 +3601,12 @@ public class AdapterMessage extends RecyclerView.Adapter() { @Override protected String[] onExecute(Context context, Bundle args) { long account = args.getLong("account"); - String exclude = args.getString("exclude"); DB db = DB.getInstance(context); List folders = db.folder().getFolders(account, true, true); @@ -3615,7 +3614,7 @@ public class AdapterMessage extends RecyclerView.Adapter result = new ArrayList<>(); if (folders != null) for (EntityFolder folder : folders) - if (EntityFolder.USER.equals(folder.type) && !exclude.equals(folder.name)) + if (EntityFolder.USER.equals(folder.type)) result.add(folder.name); Collator collator = Collator.getInstance(Locale.getDefault()); @@ -6209,10 +6208,13 @@ public class AdapterMessage extends RecyclerView.Adapter l = new ArrayList<>(); + if (self != null) + l.add(self); if (labels != null) l.addAll(Arrays.asList(labels)); diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index ea8d62a97e..2932241bce 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -695,19 +695,48 @@ class Core { private static void onLabel(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPStore istore, IMAPFolder ifolder, State state) throws JSONException, MessagingException, IOException { // Set/clear Gmail label + // Gmail does not push label changes String label = jargs.getString(0); boolean set = jargs.getBoolean(1); - // Gmail does not push label changes - 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); + + if (!set && label.equals(folder.name)) { + // Prevent deleting message + EntityFolder archive = db.folder().getFolderByType(message.account, EntityFolder.ARCHIVE); + if (archive == null) + throw new IllegalArgumentException("label/archive"); + + Message[] imessages; + Folder iarchive = istore.getFolder(archive.name); + try { + iarchive.open(Folder.READ_ONLY); + imessages = ifolder.search(new MessageIDTerm(message.msgid)); + } finally { + if (iarchive.isOpen()) + iarchive.close(); + } + + if (imessages != null && imessages.length > 0) + try { + Message imessage = ifolder.getMessageByUID(message.uid); + imessage.setFlag(Flags.Flag.DELETED, true); + ifolder.expunge(); + } catch (MessagingException ex) { + Log.w(ex); + } + else + throw new IllegalArgumentException("label/delete"); + } else { + 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); try { db.beginTransaction();