2
2
3
3
import android .app .AlertDialog ;
4
4
import android .content .DialogInterface ;
5
- import android .os .Build ;
6
5
import android .os .Process ;
7
6
8
7
import androidx .annotation .NonNull ;
26
25
27
26
class OSInAppMessageController implements OSDynamicTriggerControllerObserver , OSSystemConditionController .OSSystemConditionObserver {
28
27
28
+ private static final Object LOCK = new Object ();
29
29
private static final String OS_SAVE_IN_APP_MESSAGE = "OS_SAVE_IN_APP_MESSAGE" ;
30
30
public static final String IN_APP_MESSAGES_JSON_KEY = "in_app_messages" ;
31
31
private static ArrayList <String > PREFERRED_VARIANT_ORDER = new ArrayList <String >() {{
@@ -129,23 +129,31 @@ void resetSessionLaunchTime() {
129
129
// however an on session won't happen
130
130
void initWithCachedInAppMessages () {
131
131
// Do not reload from cache if already loaded.
132
- if (!messages .isEmpty ())
132
+ if (!messages .isEmpty ()) {
133
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "initWithCachedInAppMessages with already in memory messages: " + messages );
133
134
return ;
135
+ }
134
136
135
- String cachedIamsStr = OneSignalPrefs .getString (
137
+ String cachedInAppMessageString = OneSignalPrefs .getString (
136
138
OneSignalPrefs .PREFS_ONESIGNAL ,
137
139
OneSignalPrefs .PREFS_OS_CACHED_IAMS ,
138
140
null
139
141
);
140
- OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "initWithCachedInAppMessages: " + cachedIamsStr );
142
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "initWithCachedInAppMessages: " + cachedInAppMessageString );
141
143
142
- if (cachedIamsStr == null )
144
+ if (cachedInAppMessageString == null || cachedInAppMessageString . isEmpty () )
143
145
return ;
144
146
145
- try {
146
- processInAppMessageJson (new JSONArray (cachedIamsStr ));
147
- } catch (JSONException e ) {
148
- e .printStackTrace ();
147
+ synchronized (LOCK ) {
148
+ try {
149
+ // Second check to avoid getting the lock while message list is being set
150
+ if (!messages .isEmpty ())
151
+ return ;
152
+
153
+ processInAppMessageJson (new JSONArray (cachedInAppMessageString ));
154
+ } catch (JSONException e ) {
155
+ e .printStackTrace ();
156
+ }
149
157
}
150
158
}
151
159
@@ -171,27 +179,21 @@ private void resetRedisplayMessagesBySession() {
171
179
}
172
180
173
181
private void processInAppMessageJson (@ NonNull JSONArray json ) throws JSONException {
174
- ArrayList <OSInAppMessage > newMessages = new ArrayList <>();
175
- for (int i = 0 ; i < json .length (); i ++) {
176
- JSONObject messageJson = json .getJSONObject (i );
177
- OSInAppMessage message = new OSInAppMessage (messageJson );
182
+ synchronized (LOCK ) {
183
+ ArrayList <OSInAppMessage > newMessages = new ArrayList <>();
184
+ for (int i = 0 ; i < json .length (); i ++) {
185
+ JSONObject messageJson = json .getJSONObject (i );
186
+ OSInAppMessage message = new OSInAppMessage (messageJson );
187
+
188
+ newMessages .add (message );
189
+ }
178
190
179
- populateRedisplayMessageTriggers (message );
180
- newMessages .add (message );
191
+ messages = newMessages ;
181
192
}
182
- messages = newMessages ;
183
193
184
194
evaluateInAppMessages ();
185
195
}
186
196
187
- private void populateRedisplayMessageTriggers (OSInAppMessage message ) {
188
- int index = redisplayedInAppMessages .indexOf (message );
189
- if (index > -1 ) {
190
- OSInAppMessage redisplayMessage = redisplayedInAppMessages .get (index );
191
- redisplayMessage .triggers = message .triggers ;
192
- }
193
- }
194
-
195
197
private void evaluateInAppMessages () {
196
198
OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Starting evaluateInAppMessages" );
197
199
@@ -480,7 +482,7 @@ private void setDataForRedisplay(OSInAppMessage message) {
480
482
message .getRedisplayStats ().setDisplayStats (savedIAM .getRedisplayStats ());
481
483
482
484
// Message that don't have triggers should display only once per session
483
- boolean triggerHasChanged = savedIAM .isTriggerChanged () || (!savedIAM .isDisplayedInSession () && message .triggers .isEmpty ());
485
+ boolean triggerHasChanged = message .isTriggerChanged () || (!savedIAM .isDisplayedInSession () && message .triggers .isEmpty ());
484
486
485
487
OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "setDataForRedisplay: " + message .toString () + " triggerHasChanged: " + triggerHasChanged );
486
488
@@ -551,9 +553,6 @@ void messageWasDismissed(@NonNull OSInAppMessage message) {
551
553
}
552
554
553
555
void messageWasDismissed (@ NonNull OSInAppMessage message , boolean failed ) {
554
- // Remove DIRECT influence due to ClickHandler of ClickAction outcomes
555
- OneSignal .getSessionManager ().onDirectInfluenceFromIAMClickFinished ();
556
-
557
556
if (!message .isPreview ) {
558
557
dismissedMessages .add (message .messageId );
559
558
// If failed we will retry on next session
@@ -574,12 +573,21 @@ void messageWasDismissed(@NonNull OSInAppMessage message, boolean failed) {
574
573
dismissCurrentMessage (message );
575
574
}
576
575
576
+ void messageWasDismissedByBackPress (@ NonNull OSInAppMessage message ) {
577
+ OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "OSInAppMessageController messageWasDismissed by back press: " + message .toString ());
578
+ // IAM was not dismissed by user, will be redisplay again until user dismiss it
579
+ dismissCurrentMessage (message );
580
+ }
581
+
577
582
/**
578
583
* Removes first item from the queue and attempts to show the next IAM in the queue
579
584
*
580
585
* @param message The message dismissed, preview messages are null
581
586
*/
582
587
private void dismissCurrentMessage (@ Nullable OSInAppMessage message ) {
588
+ // Remove DIRECT influence due to ClickHandler of ClickAction outcomes
589
+ OneSignal .getSessionManager ().onDirectInfluenceFromIAMClickFinished ();
590
+
583
591
if (currentPrompt != null ) {
584
592
logger .debug ("Stop evaluateMessageDisplayQueue because prompt is currently displayed" );
585
593
return ;
@@ -781,8 +789,9 @@ public void systemConditionChanged() {
781
789
* - At least one Trigger has changed
782
790
*/
783
791
private void makeRedisplayMessagesAvailableWithTriggers (Collection <String > newTriggersKeys ) {
784
- for (OSInAppMessage message : redisplayedInAppMessages ) {
785
- if (!message .isTriggerChanged () && triggerController .isTriggerOnMessage (message , newTriggersKeys )) {
792
+ for (OSInAppMessage message : messages ) {
793
+ if (!message .isTriggerChanged () && redisplayedInAppMessages .contains (message ) &&
794
+ triggerController .isTriggerOnMessage (message , newTriggersKeys )) {
786
795
logger .debug ("Trigger changed for message: " + message .toString ());
787
796
message .setTriggerChanged (true );
788
797
}
0 commit comments