From 818045528fb1d2e7040a46d0bbb7187ea86b79b0 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 12 Dec 2019 08:51:48 +0100 Subject: [PATCH] Refactored account wakeup --- .../eu/faircode/email/ServiceSynchronize.java | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 545ba2c33e..83309ffef4 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -51,8 +51,6 @@ import androidx.preference.PreferenceManager; import com.sun.mail.imap.IMAPFolder; -import org.w3c.dom.Text; - import java.net.SocketException; import java.text.DateFormat; import java.util.ArrayList; @@ -95,6 +93,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences private int lastAccounts = 0; private int lastOperations = 0; + private Map coreStates = new Hashtable<>(); + private static final int CONNECT_BACKOFF_START = 8; // seconds private static final int CONNECT_BACKOFF_MAX = 64; // seconds (totally 2 minutes) private static final int CONNECT_BACKOFF_AlARM = 15; // minutes @@ -243,20 +243,19 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences liveAccountNetworkState.observeForever(new Observer>() { private List accountStates = new ArrayList<>(); - private Map serviceStates = new Hashtable<>(); private ExecutorService queue = Helper.getBackgroundExecutor(1, "service"); @Override public void onChanged(List accountNetworkStates) { if (accountNetworkStates == null) { // Destroy - for (TupleAccountNetworkState prev : new ArrayList<>(serviceStates.keySet())) + for (TupleAccountNetworkState prev : accountStates) stop(prev); quit(); accountStates.clear(); - serviceStates.clear(); + coreStates.clear(); liveAccountNetworkState.removeObserver(this); } else { int accounts = 0; @@ -282,7 +281,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } else { TupleAccountNetworkState prev = accountStates.get(index); - Core.State state = serviceStates.get(current); + Core.State state = coreStates.get(current.accountState.id); if (state != null) state.setNetworkState(current.networkState); @@ -291,14 +290,6 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences case "reload": reload = true; break; - case "wakeup": - if (state == null) - Log.w("### wakeup without state"); - else { - Log.i("### waking up " + current); - state.release(); - } - break; } accountStates.remove(index); @@ -358,7 +349,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } }, "sync.account." + accountNetworkState.accountState.id); - serviceStates.put(accountNetworkState, astate); + coreStates.put(accountNetworkState.accountState.id, astate); queue.submit(new Runnable() { @Override @@ -381,8 +372,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences private void stop(final TupleAccountNetworkState accountNetworkState) { EntityLog.log(ServiceSynchronize.this, "Service stop=" + accountNetworkState); - final Core.State state = serviceStates.get(accountNetworkState); - serviceStates.remove(accountNetworkState); + final Core.State state = coreStates.get(accountNetworkState.accountState.id); + coreStates.remove(accountNetworkState.accountState.id); queue.submit(new Runnable() { @Override @@ -637,31 +628,21 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences if (action != null) try { - String[] a = action.split(":"); - Bundle command = new Bundle(); - switch (a[0]) { + switch (action.split(":")[0]) { case "eval": - command.putString("name", "eval"); - command.putLong("account", intent.getLongExtra("account", -1)); - liveAccountNetworkState.post(command); + onEval(intent); break; case "reload": - command.putString("name", "reload"); - command.putLong("account", intent.getLongExtra("account", -1)); - liveAccountNetworkState.post(command); + onReload(intent); break; case "wakeup": - command.putString("name", "wakeup"); - command.putLong("account", Long.parseLong(a[1])); - liveAccountNetworkState.post(command); + onWakeup(intent); break; case "alarm": - schedule(this); - command.putString("name", "eval"); - liveAccountNetworkState.post(command); + onAlarm(intent); break; default: @@ -671,9 +652,43 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences Log.e(ex); } + return START_STICKY; } + private void onEval(Intent intent) { + Bundle command = new Bundle(); + command.putString("name", "eval"); + command.putLong("account", intent.getLongExtra("account", -1)); + liveAccountNetworkState.post(command); + } + + private void onReload(Intent intent) { + Bundle command = new Bundle(); + command.putString("name", "reload"); + command.putLong("account", intent.getLongExtra("account", -1)); + liveAccountNetworkState.post(command); + } + + private void onWakeup(Intent intent) { + String action = intent.getAction(); + long account = Long.parseLong(action.split(":")[1]); + Core.State state = coreStates.get(account); + if (state == null) + EntityLog.log(this, "### wakeup missing account=" + account); + else { + EntityLog.log(this, "### waking up account=" + account); + state.release(); + } + } + + private void onAlarm(Intent intent) { + Bundle command = new Bundle(); + schedule(this); + command.putString("name", "eval"); + liveAccountNetworkState.post(command); + } + private NotificationCompat.Builder getNotificationService(Integer accounts, Integer operations) { if (accounts != null) this.lastAccounts = accounts;