From 57402f7cd4314641ef795c501de3357d70d442b4 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 24 Aug 2020 14:33:32 +0200 Subject: [PATCH] Fixed premature quit in some situations --- .../eu/faircode/email/ServiceSynchronize.java | 63 +++++++++++-------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index cd8e57763b..bafd43d537 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -95,7 +95,6 @@ import me.leolin.shortcutbadger.ShortcutBadger; import static android.os.Process.THREAD_PRIORITY_BACKGROUND; public class ServiceSynchronize extends ServiceBase implements SharedPreferences.OnSharedPreferenceChangeListener { - private Integer lastStartId = null; private Boolean lastSuitable = null; private long lastLost = 0; private int lastAccounts = 0; @@ -192,7 +191,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences liveAccountNetworkState.observeForever(new Observer>() { private boolean fts = false; - private Integer lastQuitId = null; + private int lastEventId = 0; + private int lastQuitId = -1; private List accountStates = new ArrayList<>(); private ExecutorService queue = Helper.getBackgroundExecutor(1, "service"); @@ -211,6 +211,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } else { int accounts = 0; int operations = 0; + boolean event = false; boolean runService = false; for (TupleAccountNetworkState current : accountNetworkStates) { Log.d("### evaluating " + current); @@ -238,6 +239,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences " tbd=" + current.accountState.tbd + " state=" + current.accountState.state + " type=" + current.networkState.getType()); + event = true; start(current, current.accountState.isEnabled(current.enabled), false); } } else { @@ -270,26 +272,39 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences " force=" + force + " stop=" + prev.canRun() + " start=" + current.canRun() + - " sync=" + current.accountState.isEnabled(current.enabled) + "/" + sync + + " sync=" + sync + + " enabled=" + current.accountState.isEnabled(current.enabled) + + " should=" + current.accountState.shouldRun(current.enabled) + " changed=" + !prev.accountState.equals(current.accountState) + - " enabled=" + current.accountState.synchronize + + " synchronize=" + current.accountState.synchronize + " ondemand=" + current.accountState.ondemand + " folders=" + current.accountState.folders + " ops=" + current.accountState.operations + " tbd=" + current.accountState.tbd + " state=" + current.accountState.state + " type=" + prev.networkState.getType() + "/" + current.networkState.getType()); - if (prev.canRun()) + if (prev.canRun()) { + event = true; stop(prev); - if (current.canRun()) + } + if (current.canRun()) { + event = true; start(current, current.accountState.isEnabled(current.enabled) || sync, force); + } } } if (current.accountState.tbd == null) accountStates.add(current); - else + else { + event = true; delete(current); + } + } + + if (event) { + lastEventId++; + EntityLog.log(ServiceSynchronize.this, "### eventId=" + lastEventId); } if (lastAccounts != accounts || lastOperations != operations) { @@ -325,8 +340,11 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } - if (!runService) - quit(lastStartId); + if (!runService && lastQuitId != lastEventId) { + lastQuitId = lastEventId; + EntityLog.log(ServiceSynchronize.this, "### quitting startId=" + lastEventId); + quit(lastEventId); + } } } @@ -409,23 +427,13 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences }); } - private void quit(final Integer startId) { - if (startId != null && lastOperations > 0) - return; - - if (lastQuitId != null && lastQuitId.equals(startId)) - return; - - lastQuitId = startId; - - EntityLog.log(ServiceSynchronize.this, "Service quit startId=" + startId); - + private void quit(final Integer eventId) { queue.submit(new Runnable() { @Override public void run() { - Log.i("### quit startId=" + startId); + EntityLog.log(ServiceSynchronize.this, "### quit eventId=" + eventId); - if (startId == null) { + if (eventId == null) { // Service destroy DB db = DB.getInstance(ServiceSynchronize.this); List ops = db.operation().getOperations(EntityOperation.SYNC); @@ -439,10 +447,14 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences Log.w(ex); } + if (!eventId.equals(lastEventId)) { + EntityLog.log(ServiceSynchronize.this, "### quit cancelled eventId=" + eventId + "/" + lastEventId); + return; + } + // Stop service - boolean stopped = stopSelfResult(startId); - EntityLog.log(ServiceSynchronize.this, - "Service quited=" + stopped + " startId=" + startId); + stopSelf(); + EntityLog.log(ServiceSynchronize.this, "### stop self eventId=" + eventId); } } }); @@ -686,7 +698,6 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences @Override public int onStartCommand(Intent intent, int flags, int startId) { - lastStartId = startId; String action = (intent == null ? null : intent.getAction()); String reason = (intent == null ? null : intent.getStringExtra("reason")); EntityLog.log(ServiceSynchronize.this, "### Service command " + intent +