Prevent duplicate send operations

pull/185/head
M66B 5 years ago
parent 9100d086a5
commit 33581e907f

@ -113,6 +113,9 @@ public interface DaoOperation {
@Query("SELECT * FROM operation WHERE id = :id") @Query("SELECT * FROM operation WHERE id = :id")
EntityOperation getOperation(long 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") @Query("SELECT * FROM operation WHERE error IS NOT NULL")
List<EntityOperation> getOperationsError(); List<EntityOperation> getOperationsError();
@ -149,9 +152,4 @@ public interface DaoOperation {
@Query("DELETE FROM operation WHERE id = :id") @Query("DELETE FROM operation WHERE id = :id")
int deleteOperation(long id); int deleteOperation(long id);
@Query("DELETE FROM operation" +
" WHERE folder = :folder" +
" AND state <> 'executing'")
int deletePendingOperations(long folder);
} }

@ -436,27 +436,34 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar
} }
private void onSync(EntityFolder outbox) { private void onSync(EntityFolder outbox) {
DB db = DB.getInstance(this); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
DB db = DB.getInstance(this);
try { try {
db.beginTransaction(); db.beginTransaction();
db.folder().setFolderError(outbox.id, null); db.folder().setFolderError(outbox.id, null);
// Delete pending operations // Requeue non executing operations
db.operation().deletePendingOperations(outbox.id);
// Requeue operations
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
for (long id : db.message().getMessageByFolder(outbox.id)) { for (long id : db.message().getMessageByFolder(outbox.id)) {
EntityMessage message = db.message().getMessage(id); EntityMessage message = db.message().getMessage(id);
if (message != null) { if (message == null)
nm.cancel("send:" + message.id, 1); continue;
if (message.ui_snoozed == null)
EntityOperation.queue(this, message, EntityOperation.SEND); EntityOperation op = db.operation().getOperation(message.id, EntityOperation.SEND);
else if (op != null) {
EntityMessage.snooze(this, message.id, message.ui_snoozed); 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(); db.setTransactionSuccessful();

Loading…
Cancel
Save