diff --git a/app/src/main/java/eu/faircode/email/SimpleTask.java b/app/src/main/java/eu/faircode/email/SimpleTask.java index dd856138a1..cd44738c2c 100644 --- a/app/src/main/java/eu/faircode/email/SimpleTask.java +++ b/app/src/main/java/eu/faircode/email/SimpleTask.java @@ -49,6 +49,7 @@ import java.util.concurrent.Future; public abstract class SimpleTask implements LifecycleObserver { private boolean log = true; private boolean count = true; + private boolean optional = false; private String name; private long started; @@ -78,6 +79,11 @@ public abstract class SimpleTask implements LifecycleObserver { return this; } + public SimpleTask setOptional(boolean optional) { + this.optional = optional; + return this; + } + public SimpleTask setExecutor(ExecutorService executor) { this.localExecutor = executor; return this; @@ -144,6 +150,15 @@ public abstract class SimpleTask implements LifecycleObserver { } } + LifecycleObserver watcher = new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + public void onDestroy() { + EntityLog.log(context, EntityLog.Type.Debug, "Cancelling task=" + name); + cancel(context); + owner.getLifecycle().removeObserver(this); + } + }; + future = getExecutor(context).submit(new Runnable() { private Object data; private long elapsed; @@ -181,30 +196,35 @@ public abstract class SimpleTask implements LifecycleObserver { if (state.equals(Lifecycle.State.DESTROYED)) { // No delivery cleanup(context); - } else if (state.isAtLeast(Lifecycle.State.RESUMED)) { - // Inline delivery - Log.i("Deliver task " + name + " state=" + state + " elapse=" + elapsed + " ms"); - deliver(); - cleanup(context); } else { - Log.i("Deferring task " + name + " state=" + state); - owner.getLifecycle().addObserver(new LifecycleObserver() { - @OnLifecycleEvent(Lifecycle.Event.ON_ANY) - public void onAny() { - state = owner.getLifecycle().getCurrentState(); - if (state.equals(Lifecycle.State.DESTROYED)) { - Log.i("Destroyed task " + name); - owner.getLifecycle().removeObserver(this); - cleanup(context); - } else if (state.isAtLeast(Lifecycle.State.RESUMED)) { - Log.i("Deferred delivery task " + name); - owner.getLifecycle().removeObserver(this); - deliver(); - cleanup(context); - } else - Log.i("Deferring task " + name + " state=" + state); - } - }); + if (optional) + owner.getLifecycle().removeObserver(watcher); + + if (state.isAtLeast(Lifecycle.State.RESUMED)) { + // Inline delivery + Log.i("Deliver task " + name + " state=" + state + " elapse=" + elapsed + " ms"); + deliver(); + cleanup(context); + } else { + Log.i("Deferring task " + name + " state=" + state); + owner.getLifecycle().addObserver(new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_ANY) + public void onAny() { + state = owner.getLifecycle().getCurrentState(); + if (state.equals(Lifecycle.State.DESTROYED)) { + Log.i("Destroyed task " + name); + owner.getLifecycle().removeObserver(this); + cleanup(context); + } else if (state.isAtLeast(Lifecycle.State.RESUMED)) { + Log.i("Deferred delivery task " + name); + owner.getLifecycle().removeObserver(this); + deliver(); + cleanup(context); + } else + Log.i("Deferring task " + name + " state=" + state); + } + }); + } } } @@ -249,6 +269,9 @@ public abstract class SimpleTask implements LifecycleObserver { } }); + if (optional) + owner.getLifecycle().addObserver(watcher); + updateTaskCount(context); } diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index e3a240c35b..cbd8cca5e5 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -431,7 +431,7 @@ public class ViewModelMessages extends ViewModel { Log.i("Observe previous/next fallback=" + result); return result; } - }.execute(context, owner, args, "model:fallback"); + }.setOptional(true).execute(context, owner, args, "model:fallback"); } }); }