diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/views/SimpleProgressDialog.java b/app/src/main/java/org/thoughtcrime/securesms/util/views/SimpleProgressDialog.java index 261e64fa08..a5e4e872e7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/views/SimpleProgressDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/views/SimpleProgressDialog.java @@ -1,11 +1,14 @@ package org.thoughtcrime.securesms.util.views; +import android.app.Activity; import android.content.Context; import androidx.annotation.AnyThread; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.Lifecycle; import org.signal.core.util.ThreadUtil; import org.signal.core.util.logging.Log; @@ -61,6 +64,11 @@ public final class SimpleProgressDialog { AtomicLong shownAt = new AtomicLong(); Runnable showRunnable = () -> { + if (!isContextValid(context)) { + Log.w(TAG, "Context is no longer valid. Not showing dialog."); + return; + } + Log.i(TAG, "Taking some time. Showing a progress dialog."); shownAt.set(System.currentTimeMillis()); dialogAtomicReference.set(show(context)); @@ -73,13 +81,25 @@ public final class SimpleProgressDialog { public void dismiss() { ThreadUtil.cancelRunnableOnMain(showRunnable); ThreadUtil.runOnMain(() -> { + if (!isContextValid(context)) { + Log.w(TAG, "Context is no longer valid. Not dismissing dialog."); + return; + } + AlertDialog alertDialog = dialogAtomicReference.getAndSet(null); if (alertDialog != null) { long beenShowingForMs = System.currentTimeMillis() - shownAt.get(); long remainingTimeMs = minimumShowTimeMs - beenShowingForMs; if (remainingTimeMs > 0) { - ThreadUtil.runOnMainDelayed(alertDialog::dismiss, remainingTimeMs); + ThreadUtil.runOnMainDelayed(() -> { + if (!isContextValid(context)) { + Log.w(TAG, "Context is no longer valid. Not dismissing dialog."); + return; + } + + alertDialog.dismiss(); + }, remainingTimeMs); } else { alertDialog.dismiss(); } @@ -100,6 +120,18 @@ public final class SimpleProgressDialog { }; } + private static boolean isContextValid(@NonNull Context context) { + if (context instanceof AppCompatActivity) { + AppCompatActivity activity = (AppCompatActivity) context; + return !activity.isFinishing() && !activity.isDestroyed() && activity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED); + } else if (context instanceof Activity) { + Activity activity = (Activity) context; + return !activity.isFinishing() && !activity.isDestroyed(); + } else { + return true; + } + } + public interface DismissibleDialog { @AnyThread void dismiss();