diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 60b986aa45..9187823c99 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -173,6 +173,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences }); liveAccountNetworkState.observeForever(new Observer>() { + private boolean init = false; private boolean fts = false; private Integer lastQuitId = null; private List accountStates = new ArrayList<>(); @@ -191,6 +192,11 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences coreStates.clear(); liveAccountNetworkState.removeObserver(this); } else { + if (!init) { + init = true; + init(); + } + int accounts = 0; int operations = 0; boolean runService = false; @@ -298,6 +304,52 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } + private void init() { + EntityLog.log(ServiceSynchronize.this, "Service reset"); + + queue.submit(new Runnable() { + @Override + public void run() { + try { + DB db = DB.getInstance(ServiceSynchronize.this); + try { + db.beginTransaction(); + + // Reset accounts + for (EntityAccount account : db.account().getAccounts()) + db.account().setAccountState(account.id, null); + + // reset folders + for (EntityFolder folder : db.folder().getFolders()) { + db.folder().setFolderState(folder.id, null); + db.folder().setFolderSyncState(folder.id, null); + } + + // Reset operations + db.operation().resetOperationStates(); + + // Restore notifications + db.message().clearNotifyingMessages(); + + // Restore snooze timers + for (EntityMessage message : db.message().getSnoozed(null)) + EntityMessage.snooze(ServiceSynchronize.this, message.id, message.ui_snoozed); + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + // Restore schedule + schedule(ServiceSynchronize.this); + + } catch (Throwable ex) { + Log.e(ex); + } + } + }); + } + private void start(final TupleAccountNetworkState accountNetworkState, boolean sync) { EntityLog.log(ServiceSynchronize.this, "Service start=" + accountNetworkState); @@ -1750,38 +1802,6 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences public void run() { try { DB db = DB.getInstance(context); - try { - db.beginTransaction(); - - // Reset accounts - for (EntityAccount account : db.account().getAccounts()) - db.account().setAccountState(account.id, null); - - // reset folders - for (EntityFolder folder : db.folder().getFolders()) { - db.folder().setFolderState(folder.id, null); - db.folder().setFolderSyncState(folder.id, null); - } - - // Reset operations - db.operation().resetOperationStates(); - - // Restore notifications - db.message().clearNotifyingMessages(); - - // Restore snooze timers - for (EntityMessage message : db.message().getSnoozed(null)) - EntityMessage.snooze(context, message.id, message.ui_snoozed); - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - // Restore schedule - schedule(context); - - // Init service int accounts = db.account().getSynchronizingAccounts().size(); if (accounts > 0) eval(context, "boot");