From 8f66f8e8e9b5eb86388803d30219b516697beabf Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Mon, 17 Jun 2024 19:31:22 -0400 Subject: [PATCH] Xiaomi fix notification click not foregrounding This fixes a bug where tapping on a OneSignal notification on a Xiaomi device doesn't bring the app to the foreground. Xiaomi has very strict activity trampolining rules on notification open. We have to start the next activity before the current activity is finished. Tested on Xiaomi Redmi 6A device with MIUI 11.0.8 (Android 9) as well as an Android 14 emulator. --- .../NotificationOpenedActivityBase.kt | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/activities/NotificationOpenedActivityBase.kt b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/activities/NotificationOpenedActivityBase.kt index 463a0d92be..ab89cec04a 100644 --- a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/activities/NotificationOpenedActivityBase.kt +++ b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/activities/NotificationOpenedActivityBase.kt @@ -36,32 +36,26 @@ import com.onesignal.notifications.internal.open.INotificationOpenedProcessor abstract class NotificationOpenedActivityBase : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (!OneSignal.initWithContext(applicationContext)) { - return - } - - var self = this - - suspendifyOnThread { - var openedProcessor = OneSignal.getService() - openedProcessor.processFromContext(self, intent) - } - - finish() + processIntent() } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) + processIntent() + } + + private fun processIntent() { if (!OneSignal.initWithContext(applicationContext)) { return } - - var self = this suspendifyOnThread { - var openedProcessor = OneSignal.getService() - openedProcessor.processFromContext(self, getIntent()) + val openedProcessor = OneSignal.getService() + openedProcessor.processFromContext(this, intent) + // KEEP: Xiaomi Compatibility: + // Must keep this Activity alive while trampolining, that is + // startActivity() must be called BEFORE finish(), otherwise + // the app is never foregrounded. + finish() } - - finish() } }