diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 004b76bd8f..b8f1a4ea77 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -4053,6 +4053,7 @@ class Core { static class State { private int backoff; + private boolean backingoff = false; private ConnectionHelper.NetworkState networkState; private Thread thread = new Thread(); private Semaphore semaphore = new Semaphore(0); @@ -4097,11 +4098,19 @@ class Core { return true; } - boolean acquire(long milliseconds) throws InterruptedException { - return semaphore.tryAcquire(milliseconds, TimeUnit.MILLISECONDS); + boolean acquire(long milliseconds, boolean backoff) throws InterruptedException { + try { + backingoff = backoff; + return semaphore.tryAcquire(milliseconds, TimeUnit.MILLISECONDS); + } finally { + backingoff = false; + } } void error(Throwable ex) { + if (backingoff) + return; + if (ex instanceof MessagingException && ("connection failure".equals(ex.getMessage()) || "Not connected".equals(ex.getMessage()) || // POP3 diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 73690d3eaf..7b9ce02d02 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, true); } 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, false); 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, true); } 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, true); } 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, true); Log.i("### " + account.name + " backoff done"); } catch (InterruptedException ex) { Log.w(account.name + " backoff " + ex.toString());