mirror of
https://github.com/M66B/FairEmail.git
synced 2026-01-04 03:43:55 +01:00
Prevent duplicate send operations
This commit is contained in:
@@ -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<EntityOperation> 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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user