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
import android .support .annotation .NonNull ;
8
7
import android .support .annotation .Nullable ;
@@ -33,6 +32,7 @@ class OSInAppMessageController implements OSDynamicTriggerControllerObserver, OS
33
32
34
33
public static final String IN_APP_MESSAGES_JSON_KEY = "in_app_messages" ;
35
34
private static final String OS_SAVE_IN_APP_MESSAGE = "OS_SAVE_IN_APP_MESSAGE" ;
35
+ private static final Object LOCK = new Object ();
36
36
37
37
OSTriggerController triggerController ;
38
38
private OSSystemConditionController systemConditionController ;
@@ -130,20 +130,26 @@ void initWithCachedInAppMessages() {
130
130
if (!messages .isEmpty ())
131
131
return ;
132
132
133
- String cachedIamsStr = OneSignalPrefs .getString (
133
+ String cachedInAppMessageString = OneSignalPrefs .getString (
134
134
OneSignalPrefs .PREFS_ONESIGNAL ,
135
135
OneSignalPrefs .PREFS_OS_CACHED_IAMS ,
136
136
null
137
137
);
138
- OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "initWithCachedInAppMessages: " + cachedIamsStr );
138
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "initWithCachedInAppMessages: " + cachedInAppMessageString );
139
139
140
- if (cachedIamsStr == null )
140
+ if (cachedInAppMessageString == null || cachedInAppMessageString . isEmpty () )
141
141
return ;
142
142
143
- try {
144
- processInAppMessageJson (new JSONArray (cachedIamsStr ));
145
- } catch (JSONException e ) {
146
- e .printStackTrace ();
143
+ synchronized (LOCK ) {
144
+ try {
145
+ // Second check to avoid getting the lock while message list is being set
146
+ if (!messages .isEmpty ())
147
+ return ;
148
+
149
+ processInAppMessageJson (new JSONArray (cachedInAppMessageString ));
150
+ } catch (JSONException e ) {
151
+ e .printStackTrace ();
152
+ }
147
153
}
148
154
}
149
155
@@ -159,6 +165,7 @@ void receivedInAppMessageJson(@NonNull JSONArray json) throws JSONException {
159
165
json .toString ());
160
166
161
167
resetRedisplayMessagesBySession ();
168
+
162
169
processInAppMessageJson (json );
163
170
}
164
171
@@ -169,14 +176,17 @@ private void resetRedisplayMessagesBySession() {
169
176
}
170
177
171
178
private void processInAppMessageJson (@ NonNull JSONArray json ) throws JSONException {
172
- ArrayList <OSInAppMessage > newMessages = new ArrayList <>();
173
- for (int i = 0 ; i < json .length (); i ++) {
174
- JSONObject messageJson = json .getJSONObject (i );
175
- OSInAppMessage message = new OSInAppMessage (messageJson );
179
+ synchronized (LOCK ) {
180
+ ArrayList <OSInAppMessage > newMessages = new ArrayList <>();
181
+ for (int i = 0 ; i < json .length (); i ++) {
182
+ JSONObject messageJson = json .getJSONObject (i );
183
+ OSInAppMessage message = new OSInAppMessage (messageJson );
184
+
185
+ newMessages .add (message );
186
+ }
176
187
177
- newMessages . add ( message ) ;
188
+ messages = newMessages ;
178
189
}
179
- messages = newMessages ;
180
190
181
191
evaluateInAppMessages ();
182
192
}
@@ -774,6 +784,7 @@ private void makeRedisplayMessagesAvailableWithTriggers(Collection<String> newTr
774
784
for (OSInAppMessage message : messages ) {
775
785
if (!message .isTriggerChanged () && redisplayedInAppMessages .contains (message ) &&
776
786
triggerController .isTriggerOnMessage (message , newTriggersKeys )) {
787
+ OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "Trigger changed for message: " + message .toString ());
777
788
message .setTriggerChanged (true );
778
789
}
779
790
}
@@ -787,12 +798,14 @@ private void makeRedisplayMessagesAvailableWithTriggers(Collection<String> newTr
787
798
* conditions have changed.
788
799
*/
789
800
void addTriggers (Map <String , Object > newTriggers ) {
801
+ OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "Add trigger called with: " + newTriggers .toString ());
790
802
triggerController .addTriggers (newTriggers );
791
803
makeRedisplayMessagesAvailableWithTriggers (newTriggers .keySet ());
792
804
evaluateInAppMessages ();
793
805
}
794
806
795
807
void removeTriggersForKeys (Collection <String > keys ) {
808
+ OneSignal .onesignalLog (OneSignal .LOG_LEVEL .DEBUG , "Remove trigger called with keys: " + keys );
796
809
triggerController .removeTriggersForKeys (keys );
797
810
makeRedisplayMessagesAvailableWithTriggers (keys );
798
811
evaluateInAppMessages ();
0 commit comments