From 26d2b86eca792b88a3eff8e057605d19f6f7e8eb Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 21 Sep 2020 09:50:43 +0200 Subject: [PATCH] Skip async errors for inactive sessions --- app/src/main/java/eu/faircode/email/Core.java | 17 ++++++++++++++--- .../eu/faircode/email/ServiceSynchronize.java | 4 ++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index fceff6c6a0..1d1a4cf457 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -4052,7 +4052,8 @@ class Core { } static class State { - private int session; + private int session = -1; + private boolean active = false; private int backoff; private ConnectionHelper.NetworkState networkState; private Thread thread = new Thread(); @@ -4103,11 +4104,16 @@ class Core { } void error(Throwable ex, int session) { - if (session != this.session) { - Log.i("Ignoring session=" + session + "/" + this.session + " ex=" + ex); + if (!this.active || session != this.session) { + Log.i("Ignoring" + + " active=" + active + + " session=" + session + "/" + this.session + + " ex=" + ex); return; } + active = false; + if (ex instanceof MessagingException && ("connection failure".equals(ex.getMessage()) || "Not connected".equals(ex.getMessage()) || // POP3 @@ -4140,11 +4146,16 @@ class Core { void reset(int run) { session = run; + active = true; recoverable = true; lastActivity = null; resetBatches(); } + void setActive(boolean whether) { + this.active = whether; + } + void resetBatches() { synchronized (this) { for (FolderPriority key : sequence.keySet()) { diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 14fe5d2dad..7bd3b76131 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1543,6 +1543,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences Log.i(account.name + " done state=" + state); } catch (Throwable ex) { + state.setActive(false); + Log.e(account.name, ex); EntityLog.log( ServiceSynchronize.this, @@ -1587,6 +1589,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } } finally { + state.setActive(false); + // Update state EntityLog.log(this, account.name + " closing"); db.account().setAccountState(account.id, "closing");