diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 84867ddf5b..2b859dcc90 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -763,7 +763,7 @@ class Core { } if (uid != null && purge) { - boolean purged = false; + List deleted = new ArrayList<>(); for (Message iexisting : imessages) { long muid = ifolder.getUID(iexisting); if (muid < 0) @@ -772,21 +772,13 @@ class Core { try { Log.i(name + " deleting uid=" + muid + " for msgid=" + msgid); iexisting.setFlag(Flags.Flag.DELETED, true); - purged = true; + deleted.add(iexisting); } catch (MessagingException ignored) { Log.w(name + " existing gone uid=" + muid + " for msgid=" + msgid); } } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean perform_expunge = prefs.getBoolean("perform_expunge", true); - if (purged && perform_expunge) - try { - ifolder.expunge(); - } catch (MessagingException ex) { - // NO EXPUNGE failed. - Log.e(ex); - } + expunge(context, ifolder, deleted); } } @@ -989,11 +981,7 @@ class Core { if (imessage == null) throw new MessageRemovedException(); imessage.setFlag(Flags.Flag.DELETED, true); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean perform_expunge = prefs.getBoolean("perform_expunge", true); - if (perform_expunge) - ifolder.expunge(); + expunge(context, ifolder, Arrays.asList(imessage)); } catch (MessagingException ex) { Log.w(ex); } @@ -1162,10 +1150,7 @@ class Core { Message iprev = ifolder.getMessageByUID(Math.min(newuid, found)); if (iprev != null) { iprev.setFlag(Flags.Flag.DELETED, true); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean perform_expunge = prefs.getBoolean("perform_expunge", true); - if (perform_expunge) - ifolder.expunge(); + expunge(context, ifolder, Arrays.asList(iprev)); } } catch (MessagingException ex) { Log.w(ex); @@ -1369,11 +1354,7 @@ class Core { try { for (Message imessage : map.keySet()) imessage.setFlag(Flags.Flag.DELETED, true); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean perform_expunge = prefs.getBoolean("perform_expunge", true); - if (perform_expunge) - ifolder.expunge(); + expunge(context, ifolder, Arrays.asList(map.keySet().toArray(new Message[0]))); } catch (MessageRemovedException ex) { Log.w(ex); } @@ -1589,8 +1570,9 @@ class Core { } try { - boolean deleted = false; + List deleted = new ArrayList<>(); + boolean found = false; if (message.uid != null) { Message iexisting = ifolder.getMessageByUID(message.uid); if (iexisting == null) @@ -1602,13 +1584,16 @@ class Core { iexisting.setFlag(Flags.Flag.DELETED, true); else iexisting.setFlag(Flags.Flag.DELETED, message.ui_deleted); - deleted = true; + + found = true; + if (perform_expunge || message.ui_deleted) + deleted.add(iexisting); } catch (MessageRemovedException ignored) { Log.w(folder.name + " existing gone uid=" + message.uid); } } - if (!deleted && !TextUtils.isEmpty(message.msgid)) + if (!found && !TextUtils.isEmpty(message.msgid)) try { Message[] imessages = ifolder.search(new MessageIDTerm(message.msgid)); if (imessages == null) @@ -1622,7 +1607,9 @@ class Core { iexisting.setFlag(Flags.Flag.DELETED, true); else iexisting.setFlag(Flags.Flag.DELETED, message.ui_deleted); - deleted = true; + + if (perform_expunge || message.ui_deleted) + deleted.add(iexisting); } catch (MessageRemovedException ignored) { Log.w(folder.name + " existing gone uid=" + muid); } @@ -1632,11 +1619,10 @@ class Core { } if (perform_expunge) { - if (deleted) - ifolder.expunge(); // NO EXPUNGE failed. - db.message().deleteMessage(message.id); + if (expunge(context, ifolder, deleted)) + db.message().deleteMessage(message.id); } else { - if (deleted) + if (deleted.size() > 0) db.message().setMessageDeleted(message.id, message.ui_deleted); } @@ -2391,12 +2377,7 @@ class Core { } else ifolder.setFlags(idelete.toArray(new Message[0]), new Flags(Flags.Flag.DELETED), true); Log.i(folder.name + " purge deleted"); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean perform_expunge = prefs.getBoolean("perform_expunge", true); - if (perform_expunge) - ifolder.expunge(); - Log.i(folder.name + " purge expunged"); + expunge(context, ifolder, idelete); } catch (Throwable ex) { Log.e(ex); throw ex; @@ -3059,13 +3040,13 @@ class Core { } }); - int expunge = 0; + List deleted = new ArrayList<>(); for (int i = 0; i < imessages.length; i++) { state.ensureRunning("Sync/IMAP/delete"); try { if (perform_expunge && imessages[i].isSet(Flags.Flag.DELETED)) - expunge++; + deleted.add(imessages[i]); else uids.remove(ifolder.getUID(imessages[i])); } catch (MessageRemovedException ex) { @@ -3079,13 +3060,7 @@ class Core { } } - if (expunge > 0) - try { - Log.i(folder.name + " expunging=" + expunge); - ifolder.expunge(); - } catch (Throwable ex) { - Log.w(ex); - } + expunge(context, ifolder, deleted); if (uids.size() > 0) { // This is done outside of JavaMail to prevent changed notifications @@ -3483,7 +3458,6 @@ class Core { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean download_headers = prefs.getBoolean("download_headers", false); boolean notify_known = prefs.getBoolean("notify_known", false); - boolean perform_expunge = prefs.getBoolean("perform_expunge", true); boolean pro = ActivityBilling.isPro(context); long uid = ifolder.getUID(imessage); @@ -3496,13 +3470,10 @@ class Core { Log.w(folder.name + " expunged uid=" + uid); throw new MessageRemovedException("Expunged"); } - if (perform_expunge && imessage.isSet(Flags.Flag.DELETED)) { + + if (imessage.isSet(Flags.Flag.DELETED)) { Log.w(folder.name + " deleted uid=" + uid); - try { - ifolder.expunge(); - } catch (MessagingException ex) { - Log.w(ex); - } + expunge(context, ifolder, Arrays.asList(imessage)); throw new MessageRemovedException("Deleted"); } @@ -4050,6 +4021,32 @@ class Core { return message; } + private static boolean expunge(Context context, IMAPFolder ifolder, List messages) { + if (messages.size() == 0) + return false; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean perform_expunge = prefs.getBoolean("perform_expunge", true); + if (!perform_expunge) + return false; + + try { + boolean uidplus = MessageHelper.hasCapability(ifolder, "UIDPLUS"); + String count = (uidplus ? messages.size() : "all") + "messages"; + Log.i(ifolder.getName() + " expunging " + count); + if (uidplus) + ifolder.expunge(messages.toArray(new Message[0])); + else + ifolder.expunge(); + Log.i(ifolder.getName() + " expunged " + count); + return true; + } catch (MessagingException ex) { + // NO EXPUNGE failed. + Log.w(ex); + return false; + } + } + private static EntityIdentity matchIdentity(Context context, EntityFolder folder, EntityMessage message) { DB db = DB.getInstance(context);