@@ -30,6 +30,7 @@ class OSInAppMessageController implements OSDynamicTriggerControllerObserver, OS
30
30
31
31
public static final String IN_APP_MESSAGES_JSON_KEY = "in_app_messages" ;
32
32
private static final String OS_SAVE_IN_APP_MESSAGE = "OS_SAVE_IN_APP_MESSAGE" ;
33
+ private static final String OS_DELETE_IN_APP_MESSAGE = "OS_DELETE_IN_APP_MESSAGE" ;
33
34
34
35
OSTriggerController triggerController ;
35
36
private OSSystemConditionController systemConditionController ;
@@ -49,7 +50,8 @@ class OSInAppMessageController implements OSDynamicTriggerControllerObserver, OS
49
50
// Ordered IAMs queued to display, includes the message currently displaying, if any.
50
51
@ NonNull final ArrayList <OSInAppMessage > messageDisplayQueue ;
51
52
// IAMs displayed with last displayed time and quantity of displays data
52
- @ NonNull private List <OSInAppMessage > displayedMessagesData ;
53
+ // This is retrieved from a DB Table that take care of each object to be unique
54
+ @ NonNull private List <OSInAppMessage > redisplayedInAppMessages ;
53
55
54
56
boolean inAppMessagingEnabled = true ;
55
57
boolean inAppMessageShowing = false ;
@@ -110,9 +112,9 @@ protected OSInAppMessageController(OneSignalDbHelper dbInstance) {
110
112
111
113
void initRedisplayData (OneSignalDbHelper dbInstance ) {
112
114
inAppMessageRepository = new OSInAppMessageRepository (dbInstance );
113
- displayedMessagesData = inAppMessageRepository .getAllInAppMessages ();
115
+ redisplayedInAppMessages = inAppMessageRepository .getRedisplayedInAppMessages ();
114
116
115
- OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "displayedMessagesData : " + displayedMessagesData .toString ());
117
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "redisplayedInAppMessages : " + redisplayedInAppMessages .toString ());
116
118
}
117
119
118
120
// Normally we wait until on_session call to download the latest IAMs
@@ -151,6 +153,15 @@ void receivedInAppMessageJson(@NonNull JSONArray json) throws JSONException {
151
153
json .toString ());
152
154
153
155
processInAppMessageJson (json );
156
+
157
+ // Remove cache redisplayed messages
158
+ new Thread (new Runnable () {
159
+ @ Override
160
+ public void run () {
161
+ Thread .currentThread ().setPriority (Process .THREAD_PRIORITY_BACKGROUND );
162
+ inAppMessageRepository .deleteOldRedisplayedInAppMessages ();
163
+ }
164
+ }, OS_DELETE_IN_APP_MESSAGE ).start ();
154
165
}
155
166
156
167
private void processInAppMessageJson (@ NonNull JSONArray json ) throws JSONException {
@@ -291,13 +302,15 @@ private void fireRESTCallForClick(@NonNull final OSInAppMessage message, @NonNul
291
302
return ;
292
303
293
304
final String clickId = action .clickId ;
305
+ // If IAM has redisplay the clickId may be available
294
306
boolean clickAvailableByRedisplay = message .getDisplayStats ().isRedisplayEnabled () && message .isClickAvailable (clickId );
295
307
296
308
// Never count multiple clicks for the same click UUID unless that click is from an IAM with redisplay
297
309
if (!clickAvailableByRedisplay && clickedClickIds .contains (clickId ))
298
310
return ;
299
311
300
312
clickedClickIds .add (clickId );
313
+ // Track clickId per IAM
301
314
message .addClickId (clickId );
302
315
303
316
try {
@@ -338,26 +351,26 @@ void onFailure(int statusCode, String response, Throwable throwable) {
338
351
/**
339
352
* Part of redisplay logic
340
353
*
341
- * In order to an IAM to be re display , the following conditions need to be satisfied
342
- * - IAM has redisplay property
343
- * - Gap between displays is satisfied
344
- * - Quantity of displays is available
345
- * - Some IAM Trigger was fired
354
+ * In order to redisplay an IAM, the following conditions must be satisfied:
355
+ * 1. IAM has redisplay property
356
+ * 2. Time delay between redisplay satisfied
357
+ * 3. Has more redisplays
358
+ * 4. An IAM trigger was satisfied
346
359
*
347
- * For re display , the message need to be removed from the arrays that track the display/impression
360
+ * For redisplay , the message need to be removed from the arrays that track the display/impression
348
361
* For click counting, every message has it click id array
349
362
* */
350
363
private void setDataForRedisplay (OSInAppMessage message ) {
351
364
if (!message .getDisplayStats ().isRedisplayEnabled ())
352
365
return ;
353
366
354
367
boolean messageDismissed = dismissedMessages .contains (message .messageId );
355
- int index = displayedMessagesData .indexOf (message );
368
+ int index = redisplayedInAppMessages .indexOf (message );
356
369
357
370
if (messageDismissed && index != -1 ) {
358
371
OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "setDataForRedisplay: " + message .messageId );
359
372
360
- OSInAppMessage savedIAM = displayedMessagesData .get (index );
373
+ OSInAppMessage savedIAM = redisplayedInAppMessages .get (index );
361
374
message .getDisplayStats ().setDisplayStats (savedIAM .getDisplayStats ());
362
375
363
376
// Check if conditions are correct for redisplay
@@ -431,7 +444,7 @@ void messageWasDismissed(@NonNull OSInAppMessage message) {
431
444
432
445
// Don't keep track of last displayed time for a preview
433
446
lastTimeInAppDismissed = new Date ();
434
- persisIAMessageForRedisplay (message );
447
+ persistInAppMessageForRedisplay (message );
435
448
}
436
449
437
450
dismissCurrentMessage ();
@@ -456,7 +469,7 @@ private void dismissCurrentMessage() {
456
469
}
457
470
}
458
471
459
- private void persisIAMessageForRedisplay (final OSInAppMessage message ) {
472
+ private void persistInAppMessageForRedisplay (final OSInAppMessage message ) {
460
473
//If the IAM doesn't have the re display configuration then no need to save it
461
474
if (!message .getDisplayStats ().isRedisplayEnabled ())
462
475
return ;
@@ -474,16 +487,16 @@ public void run() {
474
487
}
475
488
}, OS_SAVE_IN_APP_MESSAGE ).start ();
476
489
477
- //Update the data to enable future re displays
478
- //Avoid calling the repository data again
479
- int index = displayedMessagesData .indexOf (message );
490
+ // Update the data to enable future re displays
491
+ // Avoid calling the repository data again
492
+ int index = redisplayedInAppMessages .indexOf (message );
480
493
if (index != -1 ) {
481
- displayedMessagesData .set (index , message );
494
+ redisplayedInAppMessages .set (index , message );
482
495
} else {
483
- displayedMessagesData .add (message );
496
+ redisplayedInAppMessages .add (message );
484
497
}
485
498
486
- OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "persisIAMessageForRedisplay : " + message .toString () + " with msg array data: " + displayedMessagesData .toString ());
499
+ OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "persistInAppMessageForRedisplay : " + message .toString () + " with msg array data: " + redisplayedInAppMessages .toString ());
487
500
}
488
501
489
502
private static @ Nullable String htmlPathForMessage (OSInAppMessage message ) {
@@ -589,36 +602,36 @@ public void messageTriggerConditionChanged() {
589
602
}
590
603
591
604
/**
592
- * Part of redisplay logic
605
+ * Part of redisplay logic
593
606
*
594
- * Make all messages with redisplay enable available for redisplay if:
607
+ * Make all messages with redisplay available if:
595
608
* - Already displayed
596
- * - Trigger changed
597
- * * /
598
- private void checkTriggerChanged (Collection <String > newTriggersKeys ) {
609
+ * - At least one Trigger has changed
610
+ */
611
+ private void makeRedisplayMessagesAvailableWithTriggers (Collection <String > newTriggersKeys ) {
599
612
for (OSInAppMessage message : messages ) {
600
- if (displayedMessagesData .contains (message ) &&
613
+ if (redisplayedInAppMessages .contains (message ) &&
601
614
triggerController .isTriggerOnMessage (message , newTriggersKeys )) {
602
615
message .setTriggerChanged (true );
603
616
}
604
617
}
605
618
}
606
619
607
620
/**
608
- * Trigger logic
609
- * These methods mostly pass data to the Trigger Controller, but also cause the SDK to
621
+ * Trigger logic
622
+ * These methods mostly pass data to the Trigger Controller, but also cause the SDK to
610
623
* re-evaluate messages to see if we should display a message now that the trigger
611
624
* conditions have changed.
612
625
*/
613
626
void addTriggers (Map <String , Object > newTriggers ) {
614
627
triggerController .addTriggers (newTriggers );
615
- checkTriggerChanged (newTriggers .keySet ());
628
+ makeRedisplayMessagesAvailableWithTriggers (newTriggers .keySet ());
616
629
evaluateInAppMessages ();
617
630
}
618
631
619
632
void removeTriggersForKeys (Collection <String > keys ) {
620
633
triggerController .removeTriggersForKeys (keys );
621
- checkTriggerChanged (keys );
634
+ makeRedisplayMessagesAvailableWithTriggers (keys );
622
635
evaluateInAppMessages ();
623
636
}
624
637
0 commit comments