From 181694bcb32bbbc29e8b14bf166ab2d3968acf65 Mon Sep 17 00:00:00 2001 From: jinliu9508 Date: Fri, 25 Apr 2025 18:47:45 -0400 Subject: [PATCH] Fix: add fetch condition in the event of user change instead of start() --- .../backend/IIdentityBackendService.kt | 2 +- .../internal/InAppMessagesManager.kt | 44 +++++++++++++++---- .../internal/InAppMessagesManagerTests.kt | 1 + 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/IIdentityBackendService.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/IIdentityBackendService.kt index 880599871d..4278d8002b 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/IIdentityBackendService.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/backend/IIdentityBackendService.kt @@ -38,7 +38,7 @@ interface IIdentityBackendService { ) } -internal object IdentityConstants { +object IdentityConstants { /** * The alias label for the external ID alias. */ diff --git a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt index f1743d3715..89659703ba 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt @@ -43,6 +43,9 @@ import com.onesignal.session.internal.outcomes.IOutcomeEventsController import com.onesignal.session.internal.session.ISessionLifecycleHandler import com.onesignal.session.internal.session.ISessionService import com.onesignal.user.IUserManager +import com.onesignal.user.internal.backend.IdentityConstants +import com.onesignal.user.internal.identity.IdentityModel +import com.onesignal.user.internal.identity.IdentityModelStore import com.onesignal.user.internal.subscriptions.ISubscriptionChangedHandler import com.onesignal.user.internal.subscriptions.ISubscriptionManager import com.onesignal.user.internal.subscriptions.SubscriptionModel @@ -60,6 +63,7 @@ internal class InAppMessagesManager( private val _influenceManager: IInfluenceManager, private val _configModelStore: ConfigModelStore, private val _userManager: IUserManager, + private val _identityModelStore: IdentityModelStore, private val _subscriptionManager: ISubscriptionManager, private val _outcomeEventsController: IOutcomeEventsController, private val _state: InAppStateService, @@ -113,6 +117,36 @@ internal class InAppMessagesManager( private val fetchIAMMutex = Mutex() private var lastTimeFetchedIAMs: Long? = null + private val identityModelChangeHandler = + object : ISingletonModelStoreChangeHandler { + override fun onModelReplaced( + model: IdentityModel, + tag: String, + ) { } + + override fun onModelUpdated( + args: ModelChangedArgs, + tag: String, + ) { + if (args.property == IdentityConstants.ONESIGNAL_ID) { + val oldOneSignalId = args.oldValue as String + val newOneSignalId = args.newValue as String + + // Create a IAM fetch condition when a backend OneSignalID is retrieved for the first time + if (IDManager.isLocalId(oldOneSignalId) && !IDManager.isLocalId(newOneSignalId)) { + suspendifyOnThread { + val updateConditionDeferred = + _consistencyManager.getRywDataFromAwaitableCondition(IamFetchReadyCondition(newOneSignalId)) + val rywToken = updateConditionDeferred.await() + if (rywToken != null) { + fetchMessages(rywToken) + } + } + } + } + } + } + override var paused: Boolean get() = _state.paused set(value) { @@ -150,6 +184,7 @@ internal class InAppMessagesManager( _triggerController.subscribe(this) _sessionService.subscribe(this) _applicationService.addApplicationLifecycleHandler(this) + _identityModelStore.subscribe(identityModelChangeHandler) suspendifyOnThread { _repository.cleanCachedInAppMessages() @@ -161,15 +196,6 @@ internal class InAppMessagesManager( for (redisplayInAppMessage in redisplayedInAppMessages) { redisplayInAppMessage.isDisplayedInSession = false } - - // attempt to fetch messages from the backend (if we have the pre-requisite data already) - val onesignalId = _userManager.onesignalId - val updateConditionDeferred = - _consistencyManager.getRywDataFromAwaitableCondition(IamFetchReadyCondition(onesignalId)) - val rywToken = updateConditionDeferred.await() - if (rywToken != null) { - fetchMessages(rywToken) - } } } diff --git a/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/InAppMessagesManagerTests.kt b/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/InAppMessagesManagerTests.kt index f2753bcff8..16dce8e5a4 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/InAppMessagesManagerTests.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/InAppMessagesManagerTests.kt @@ -41,6 +41,7 @@ class InAppMessagesManagerTests : FunSpec({ mockk(), mockk(), mockk(), + MockHelper.identityModelStore(), mockk(), mockk(), mockk(),