From c0ab9c8461833f3d12f15d5d3e557f52fb103f4e Mon Sep 17 00:00:00 2001 From: jinliu9508 Date: Wed, 30 Oct 2024 11:54:57 -0700 Subject: [PATCH 1/4] simulate WindowLeak exception --- .../permissions/AlertDialogPrepromptForAndroidSettings.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt index 6f96a20441..9f5028dbb8 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt @@ -53,6 +53,9 @@ object AlertDialogPrepromptForAndroidSettings { val messageTemplate = activity.getString(R.string.permission_not_available_message) val message = messageTemplate.format(previouslyDeniedPostfix) + // simulate showing a dialog in a finishing activity + activity.finish() + AlertDialog.Builder(activity) .setTitle(title) .setMessage(message) From 95b0d902fa9ddda884d3a4adf0f3777a9372880c Mon Sep 17 00:00:00 2001 From: jinliu9508 Date: Wed, 30 Oct 2024 11:57:00 -0700 Subject: [PATCH 2/4] check activity availability before showing a dialog --- .../AlertDialogPrepromptForAndroidSettings.kt | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt index 9f5028dbb8..e0f2820b85 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt @@ -30,6 +30,8 @@ package com.onesignal.core.internal.permissions import android.app.Activity import android.app.AlertDialog import com.onesignal.core.R +import com.onesignal.debug.LogLevel +import com.onesignal.debug.internal.logging.Logging /** * A singleton helper which will display the fallback-to-settings alert dialog. @@ -56,18 +58,26 @@ object AlertDialogPrepromptForAndroidSettings { // simulate showing a dialog in a finishing activity activity.finish() - AlertDialog.Builder(activity) - .setTitle(title) - .setMessage(message) - .setPositiveButton(R.string.permission_not_available_open_settings_option) { dialog, which -> - callback.onAccept() - } - .setNegativeButton(android.R.string.no) { dialog, which -> - callback.onDecline() - } - .setOnCancelListener { - callback.onDecline() - } - .show() + // ensure the activity that will be showing the dialog is available + if (activity == null || activity.isDestroyed || activity.isFinishing) { + Logging.log(LogLevel.ERROR, "Alert dialog for Android settings was skipped because the activity was unavailable to display it.") + return + } + + if (activity != null && !activity.isFinishing) { + AlertDialog.Builder(activity) + .setTitle(title) + .setMessage(message) + .setPositiveButton(R.string.permission_not_available_open_settings_option) { dialog, which -> + callback.onAccept() + } + .setNegativeButton(android.R.string.no) { dialog, which -> + callback.onDecline() + } + .setOnCancelListener { + callback.onDecline() + } + .show() + } } } From df65bae4c17afcffae66425a2e8d396c8a7b8534 Mon Sep 17 00:00:00 2001 From: jinliu9508 Date: Wed, 30 Oct 2024 11:57:21 -0700 Subject: [PATCH 3/4] clean up --- .../permissions/AlertDialogPrepromptForAndroidSettings.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt index e0f2820b85..ac6d3b4dbd 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt @@ -55,9 +55,6 @@ object AlertDialogPrepromptForAndroidSettings { val messageTemplate = activity.getString(R.string.permission_not_available_message) val message = messageTemplate.format(previouslyDeniedPostfix) - // simulate showing a dialog in a finishing activity - activity.finish() - // ensure the activity that will be showing the dialog is available if (activity == null || activity.isDestroyed || activity.isFinishing) { Logging.log(LogLevel.ERROR, "Alert dialog for Android settings was skipped because the activity was unavailable to display it.") From e5db93324a99898859e7366b5c339243beab36d7 Mon Sep 17 00:00:00 2001 From: jinliu9508 Date: Mon, 4 Nov 2024 12:27:46 -0500 Subject: [PATCH 4/4] fix up: use try and catch and fire onDecline callback --- .../AlertDialogPrepromptForAndroidSettings.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt index ac6d3b4dbd..5fd7445c0c 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/permissions/AlertDialogPrepromptForAndroidSettings.kt @@ -29,6 +29,7 @@ package com.onesignal.core.internal.permissions import android.app.Activity import android.app.AlertDialog +import android.view.WindowManager.BadTokenException import com.onesignal.core.R import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging @@ -55,13 +56,8 @@ object AlertDialogPrepromptForAndroidSettings { val messageTemplate = activity.getString(R.string.permission_not_available_message) val message = messageTemplate.format(previouslyDeniedPostfix) - // ensure the activity that will be showing the dialog is available - if (activity == null || activity.isDestroyed || activity.isFinishing) { - Logging.log(LogLevel.ERROR, "Alert dialog for Android settings was skipped because the activity was unavailable to display it.") - return - } - - if (activity != null && !activity.isFinishing) { + // Try displaying the dialog while handling cases where execution is not possible. + try { AlertDialog.Builder(activity) .setTitle(title) .setMessage(message) @@ -75,6 +71,11 @@ object AlertDialogPrepromptForAndroidSettings { callback.onDecline() } .show() + } catch (ex: BadTokenException) { + // If Android is unable to display the dialog, trigger the onDecline callback to maintain + // consistency with the behavior when the dialog is canceled or dismissed without a response. + Logging.log(LogLevel.ERROR, "Alert dialog for Android settings was skipped because the activity was unavailable to display it.") + callback.onDecline() } } }