From 6f10de5e30c5c78bd5a00595d87e64f23e105f78 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Thu, 30 Nov 2017 13:04:41 -0800 Subject: [PATCH] Fix trying to launch a dialog from an application context --- res/values/strings.xml | 2 ++ .../securesms/permissions/Permissions.java | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index d87ef66c51..7088252e8d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1311,6 +1311,8 @@ Transport icon Loading... Connecting... + Permission required + Continue diff --git a/src/org/thoughtcrime/securesms/permissions/Permissions.java b/src/org/thoughtcrime/securesms/permissions/Permissions.java index 89c0c9556a..127a4a6e00 100644 --- a/src/org/thoughtcrime/securesms/permissions/Permissions.java +++ b/src/org/thoughtcrime/securesms/permissions/Permissions.java @@ -22,9 +22,11 @@ import android.view.WindowManager; import com.annimon.stream.Stream; import com.annimon.stream.function.Consumer; +import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.util.LRUCache; import org.thoughtcrime.securesms.util.ServiceUtil; +import java.lang.ref.WeakReference; import java.security.SecureRandom; import java.util.List; import java.util.Map; @@ -309,22 +311,26 @@ public class Permissions { private static class SettingsDialogListener implements Runnable { - private final Context context; - private final String message; + private final WeakReference context; + private final String message; SettingsDialogListener(Context context, String message) { this.message = message; - this.context = context.getApplicationContext(); + this.context = new WeakReference<>(context); } @Override public void run() { - new AlertDialog.Builder(context) - .setTitle("Permission required") - .setMessage(message) - .setPositiveButton("Continue", (dialog, which) -> context.startActivity(getApplicationSettingsIntent(context))) - .setNegativeButton("Cancel", null) - .show(); + Context context = this.context.get(); + + if (context != null) { + new AlertDialog.Builder(context) + .setTitle(R.string.Permissions_permission_required) + .setMessage(message) + .setPositiveButton(R.string.Permissions_continue, (dialog, which) -> context.startActivity(getApplicationSettingsIntent(context))) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } } } }