Skip to content

Commit df936c6

Browse files
authored
feat: IAMs now display when triggers added before first fetch (#2528)
1 parent 6675028 commit df936c6

2 files changed

Lines changed: 323 additions & 49 deletions

File tree

OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ internal class InAppMessagesManager(
116116
private val fetchIAMMutex = Mutex()
117117
private var lastTimeFetchedIAMs: Long? = null
118118

119+
// Tracks whether the first IAM fetch has completed since this cold start
120+
private var hasCompletedFirstFetch: Boolean = false
121+
122+
// Tracks trigger keys added early on cold start (before first fetch completes), for redisplay logic
123+
private val earlySessionTriggers: MutableSet<String> = java.util.Collections.synchronizedSet(mutableSetOf())
124+
119125
private val identityModelChangeHandler =
120126
object : ISingletonModelStoreChangeHandler<IdentityModel> {
121127
override fun onModelReplaced(
@@ -308,6 +314,26 @@ internal class InAppMessagesManager(
308314

309315
if (newMessages != null) {
310316
this.messages = newMessages as MutableList<InAppMessage>
317+
318+
// Apply isTriggerChanged for messages that match triggers added too early on cold start
319+
synchronized(earlySessionTriggers) {
320+
if (earlySessionTriggers.isNotEmpty()) {
321+
Logging.verbose("InAppMessagesManager: Processing triggers added early on cold start: $earlySessionTriggers")
322+
for (message in this.messages) {
323+
val isMessageDisplayed = redisplayedInAppMessages.contains(message)
324+
val isTriggerOnMessage =
325+
_triggerController.isTriggerOnMessage(message, earlySessionTriggers)
326+
if (isMessageDisplayed && isTriggerOnMessage) {
327+
Logging.verbose("InAppMessagesManager: Setting isTriggerChanged=true for message ${message.messageId}")
328+
message.isTriggerChanged = true
329+
}
330+
}
331+
earlySessionTriggers.clear()
332+
}
333+
// Mark that first fetch has completed
334+
hasCompletedFirstFetch = true
335+
}
336+
311337
evaluateInAppMessages()
312338
}
313339
}
@@ -565,6 +591,14 @@ internal class InAppMessagesManager(
565591
) {
566592
Logging.debug("InAppMessagesManager.addTrigger(key: $key, value: $value)")
567593

594+
// Track triggers added early on cold start (before first fetch completes) for redisplay logic
595+
synchronized(earlySessionTriggers) {
596+
if (!hasCompletedFirstFetch) {
597+
Logging.verbose("InAppMessagesManager: Tracking trigger added early on cold start: $key")
598+
earlySessionTriggers.add(key)
599+
}
600+
}
601+
568602
var triggerModel = _triggerModelStore.get(key)
569603
if (triggerModel != null) {
570604
triggerModel.value = value
@@ -588,11 +622,24 @@ internal class InAppMessagesManager(
588622
override fun removeTrigger(key: String) {
589623
Logging.debug("InAppMessagesManager.removeTrigger(key: $key)")
590624

625+
synchronized(earlySessionTriggers) {
626+
if (!hasCompletedFirstFetch) {
627+
earlySessionTriggers.remove(key)
628+
}
629+
}
630+
591631
_triggerModelStore.remove(key)
592632
}
593633

594634
override fun clearTriggers() {
595635
Logging.debug("InAppMessagesManager.clearTriggers()")
636+
637+
synchronized(earlySessionTriggers) {
638+
if (!hasCompletedFirstFetch) {
639+
earlySessionTriggers.clear()
640+
}
641+
}
642+
596643
_triggerModelStore.clear()
597644
}
598645

0 commit comments

Comments
 (0)