From 33581e907f04f4f0fff8576b461000357748fcc7 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 17 Sep 2020 16:33:52 +0200 Subject: [PATCH] Prevent duplicate send operations --- .../java/eu/faircode/email/DaoOperation.java | 8 ++--- .../java/eu/faircode/email/ServiceSend.java | 31 ++++++++++++------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoOperation.java b/app/src/main/java/eu/faircode/email/DaoOperation.java index 07cbd77d42..01ca9be1a5 100644 --- a/app/src/main/java/eu/faircode/email/DaoOperation.java +++ b/app/src/main/java/eu/faircode/email/DaoOperation.java @@ -113,6 +113,9 @@ public interface DaoOperation { @Query("SELECT * FROM operation WHERE id = :id") EntityOperation getOperation(long id); + @Query("SELECT * FROM operation WHERE message = :message AND name = :name") + EntityOperation getOperation(long message, String name); + @Query("SELECT * FROM operation WHERE error IS NOT NULL") List getOperationsError(); @@ -149,9 +152,4 @@ public interface DaoOperation { @Query("DELETE FROM operation WHERE id = :id") int deleteOperation(long id); - - @Query("DELETE FROM operation" + - " WHERE folder = :folder" + - " AND state <> 'executing'") - int deletePendingOperations(long folder); } diff --git a/app/src/main/java/eu/faircode/email/ServiceSend.java b/app/src/main/java/eu/faircode/email/ServiceSend.java index 3e36005f48..0a0c9dddac 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSend.java +++ b/app/src/main/java/eu/faircode/email/ServiceSend.java @@ -436,27 +436,34 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar } private void onSync(EntityFolder outbox) { - DB db = DB.getInstance(this); + NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + DB db = DB.getInstance(this); try { db.beginTransaction(); db.folder().setFolderError(outbox.id, null); - // Delete pending operations - db.operation().deletePendingOperations(outbox.id); - - // Requeue operations - NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + // Requeue non executing operations for (long id : db.message().getMessageByFolder(outbox.id)) { EntityMessage message = db.message().getMessage(id); - if (message != null) { - nm.cancel("send:" + message.id, 1); - if (message.ui_snoozed == null) - EntityOperation.queue(this, message, EntityOperation.SEND); - else - EntityMessage.snooze(this, message.id, message.ui_snoozed); + if (message == null) + continue; + + EntityOperation op = db.operation().getOperation(message.id, EntityOperation.SEND); + if (op != null) { + if ("executing".equals(op.state)) + continue; + db.operation().deleteOperation(op.id); } + + db.message().setMessageError(message.id, null); + nm.cancel("send:" + message.id, 1); + + if (message.ui_snoozed == null) + EntityOperation.queue(this, message, EntityOperation.SEND); + else + EntityMessage.snooze(this, message.id, message.ui_snoozed); } db.setTransactionSuccessful();