diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 771b1f4926..59631c3e63 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -4055,6 +4055,7 @@ class Core { static class State { private int backoff; + private boolean keepalive = false; private ConnectionHelper.NetworkState networkState; private Thread thread = new Thread(); private Semaphore semaphore = new Semaphore(0); @@ -4099,8 +4100,13 @@ class Core { return true; } - boolean acquire(long milliseconds) throws InterruptedException { - return semaphore.tryAcquire(milliseconds, TimeUnit.MILLISECONDS); + boolean acquire(long milliseconds, boolean keepalive) throws InterruptedException { + try { + this.keepalive = keepalive; + return semaphore.tryAcquire(milliseconds, TimeUnit.MILLISECONDS); + } finally { + this.keepalive = false; + } } void error(Throwable ex) { @@ -4130,8 +4136,10 @@ class Core { if (ex instanceof OperationCanceledException) recoverable = false; - thread.interrupt(); - yield(); + if (keepalive) { + thread.interrupt(); + yield(); + } } void reset() { diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 73690d3eaf..3ff780f858 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -899,7 +899,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences try { long backoff = RECONNECT_BACKOFF - ago; EntityLog.log(ServiceSynchronize.this, account.name + " reconnect backoff=" + (backoff / 1000)); - state.acquire(backoff); + state.acquire(backoff, false); } catch (InterruptedException ex) { Log.w(account.name + " backoff " + ex.toString()); } @@ -1523,7 +1523,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences try { wlAccount.release(); - state.acquire(2 * duration); + state.acquire(2 * duration, true); Log.i("### " + account.name + " keeping alive"); } catch (InterruptedException ex) { EntityLog.log(this, account.name + " waited state=" + state); @@ -1638,7 +1638,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences if (cbackoff > backoff) { try { EntityLog.log(this, account.name + " reconnect backoff=" + cbackoff); - state.acquire(cbackoff * 1000L); + state.acquire(cbackoff * 1000L, false); } catch (InterruptedException ex) { Log.w(account.name + " cbackoff " + ex.toString()); } @@ -1648,7 +1648,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences if (backoff <= CONNECT_BACKOFF_MAX) { // Short back-off period, keep device awake try { - state.acquire(backoff * 1000L); + state.acquire(backoff * 1000L, false); } catch (InterruptedException ex) { Log.w(account.name + " backoff " + ex.toString()); } @@ -1681,7 +1681,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences try { wlAccount.release(); - state.acquire(2 * backoff * 1000L); + state.acquire(2 * backoff * 1000L, false); Log.i("### " + account.name + " backoff done"); } catch (InterruptedException ex) { Log.w(account.name + " backoff " + ex.toString());