diff --git a/FAQ.md b/FAQ.md index 81c5df2af9..d252653a0b 100644 --- a/FAQ.md +++ b/FAQ.md @@ -313,7 +313,7 @@ The low priority status bar notification shows the number of pending operations, * *copy*: copy message to another remote folder * *fetch*: fetched pushed message * *delete*: delete message from remote folder -* *send*: send message +* *deleted*: delete message from local folder * *seen*: mark message as read/unread in remote folder * *answered*: mark message as answered in remote folder * *flag*: add/remove star in remote folder diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 4fe79af373..161ac8d112 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -166,6 +166,7 @@ class Core { if (message == null) { if (!EntityOperation.FETCH.equals(op.name) && + !EntityOperation.DELETED.equals(op.name) && !EntityOperation.SYNC.equals(op.name) && !EntityOperation.SUBSCRIBE.equals(op.name)) throw new MessageRemovedException(); @@ -221,6 +222,10 @@ class Core { onDelete(context, jargs, folder, message, (IMAPFolder) ifolder); break; + case EntityOperation.DELETED: + onDeleted(context, jargs, folder, (IMAPFolder) ifolder); + break; + case EntityOperation.HEADERS: onHeaders(context, jargs, folder, message, (IMAPFolder) ifolder); break; @@ -327,10 +332,14 @@ class Core { return; if (EntityOperation.ADD.equals(op.name)) return; + if (EntityOperation.FETCH.equals(op.name)) + return; if (EntityOperation.EXISTS.equals(op.name)) return; if (EntityOperation.DELETE.equals(op.name) && !TextUtils.isEmpty(message.msgid)) return; + if (EntityOperation.DELETED.equals(op.name)) + return; Log.i(folder.name + " ensure uid op=" + op.name + " msgid=" + message.msgid); @@ -743,6 +752,18 @@ class Core { } } + private static void onDeleted(Context context, JSONArray jargs, EntityFolder folder, IMAPFolder ifolder) throws JSONException, MessagingException, IOException { + long uid = jargs.getLong(0); + + DB db = DB.getInstance(context); + try { + db.message().deleteMessage(folder.id, uid); + } finally { + int count = ifolder.getMessageCount(); + db.folder().setFolderTotal(folder.id, count < 0 ? null : count); + } + } + private static void onHeaders(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException { // Download headers DB db = DB.getInstance(context); diff --git a/app/src/main/java/eu/faircode/email/EntityOperation.java b/app/src/main/java/eu/faircode/email/EntityOperation.java index 90a2092c8c..3cf2082735 100644 --- a/app/src/main/java/eu/faircode/email/EntityOperation.java +++ b/app/src/main/java/eu/faircode/email/EntityOperation.java @@ -77,8 +77,9 @@ public class EntityOperation { static final String ADD = "add"; static final String MOVE = "move"; static final String COPY = "copy"; - static final String DELETE = "delete"; static final String FETCH = "fetch"; + static final String DELETE = "delete"; + static final String DELETED = "deleted"; static final String SEEN = "seen"; static final String ANSWERED = "answered"; static final String FLAG = "flag"; diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index d3931d879e..fb480badf3 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -908,17 +908,7 @@ public class ServiceSynchronize extends ServiceBase { for (Message imessage : e.getMessages()) { long uid = ifolder.getUID(imessage); - try { - db.beginTransaction(); - - EntityMessage message = db.message().getMessageByUid(folder.id, uid); - if (message != null) - EntityOperation.queue(ServiceSynchronize.this, message, EntityOperation.DELETE); - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } + EntityOperation.queue(ServiceSynchronize.this, folder, EntityOperation.DELETED, uid); } } catch (Throwable ex) { Log.e(folder.name, ex);