@@ -37,10 +37,13 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
37
37
add ("all" );
38
38
}};
39
39
40
- OSTriggerController triggerController ;
40
+ private final OSLogger logger ;
41
+ private final OSTaskController taskController ;
42
+
41
43
private OSSystemConditionController systemConditionController ;
42
44
private OSInAppMessageRepository inAppMessageRepository ;
43
- private OSLogger logger ;
45
+
46
+ OSTriggerController triggerController ;
44
47
45
48
// IAMs loaded remotely from on_session
46
49
// If on_session won't be called this will be loaded from cache
@@ -65,8 +68,8 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
65
68
final private ArrayList <OSInAppMessage > messageDisplayQueue ;
66
69
// IAMs displayed with last displayed time and quantity of displays data
67
70
// This is retrieved from a DB Table that take care of each object to be unique
68
- @ NonNull
69
- private List <OSInAppMessage > redisplayedInAppMessages = new ArrayList <>() ;
71
+ @ Nullable
72
+ private List <OSInAppMessage > redisplayedInAppMessages = null ;
70
73
71
74
private OSInAppMessagePrompt currentPrompt = null ;
72
75
private boolean inAppMessagingEnabled = true ;
@@ -84,7 +87,8 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
84
87
Date lastTimeInAppDismissed = null ;
85
88
private int htmlNetworkRequestAttemptCount = 0 ;
86
89
87
- protected OSInAppMessageController (OneSignalDbHelper dbHelper , OSLogger logger ) {
90
+ protected OSInAppMessageController (OneSignalDbHelper dbHelper , OSTaskController controller , OSLogger logger ) {
91
+ taskController = controller ;
88
92
messages = new ArrayList <>();
89
93
dismissedMessages = OSUtils .newConcurrentSet ();
90
94
messageDisplayQueue = new ArrayList <>();
@@ -142,12 +146,34 @@ protected void initRedisplayData(OneSignalDbHelper dbHelper) {
142
146
Runnable getCachedIAMRunnable = new BackgroundRunnable () {
143
147
@ Override
144
148
public void run () {
145
- redisplayedInAppMessages = inAppMessageRepository .getCachedInAppMessages ();
146
- OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "redisplayedInAppMessages: " + redisplayedInAppMessages .toString ());
149
+ super .run ();
150
+
151
+ synchronized (LOCK ) {
152
+ redisplayedInAppMessages = inAppMessageRepository .getCachedInAppMessages ();
153
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Retrieved IAMs from DB redisplayedInAppMessages: " + redisplayedInAppMessages .toString ());
154
+ }
147
155
}
148
156
};
149
157
150
- runRunnableOnThread (getCachedIAMRunnable , OS_IAM_DB_ACCESS );
158
+ taskController .addTaskToQueue (getCachedIAMRunnable );
159
+ taskController .startPendingTasks ();
160
+ }
161
+
162
+ boolean shouldRunTaskThroughQueue () {
163
+ synchronized (LOCK ) {
164
+ return redisplayedInAppMessages == null && taskController .shouldRunTaskThroughQueue ();
165
+ }
166
+ }
167
+
168
+ void executeRedisplayIAMDataDependantTask (Runnable task ) {
169
+ synchronized (LOCK ) {
170
+ if (shouldRunTaskThroughQueue ()) {
171
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Delaying task due to redisplay data not retrieved yet" );
172
+ taskController .addTaskToQueue (task );
173
+ } else {
174
+ task .run ();
175
+ }
176
+ }
151
177
}
152
178
153
179
void resetSessionLaunchTime () {
@@ -190,15 +216,24 @@ void initWithCachedInAppMessages() {
190
216
* Called after the device is registered from UserStateSynchronizer
191
217
* which is the REST call to create the player record on_session
192
218
*/
193
- void receivedInAppMessageJson (@ NonNull JSONArray json ) throws JSONException {
219
+ void receivedInAppMessageJson (@ NonNull final JSONArray json ) throws JSONException {
194
220
// Cache copy for quick cold starts
195
221
OneSignalPrefs .saveString (
196
222
OneSignalPrefs .PREFS_ONESIGNAL ,
197
223
OneSignalPrefs .PREFS_OS_CACHED_IAMS ,
198
224
json .toString ());
199
225
200
- resetRedisplayMessagesBySession ();
201
- processInAppMessageJson (json );
226
+ executeRedisplayIAMDataDependantTask (new Runnable () {
227
+ @ Override
228
+ public void run () {
229
+ resetRedisplayMessagesBySession ();
230
+ try {
231
+ processInAppMessageJson (json );
232
+ } catch (JSONException e ) {
233
+ OneSignal .Log (OneSignal .LOG_LEVEL .ERROR , "ERROR processing InAppMessageJson JSON Response." , e );
234
+ }
235
+ }
236
+ });
202
237
}
203
238
204
239
private void resetRedisplayMessagesBySession () {
@@ -226,6 +261,17 @@ private void processInAppMessageJson(@NonNull JSONArray json) throws JSONExcepti
226
261
private void evaluateInAppMessages () {
227
262
OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Starting evaluateInAppMessages" );
228
263
264
+ if (shouldRunTaskThroughQueue ()) {
265
+ taskController .addTaskToQueue (new Runnable () {
266
+ @ Override
267
+ public void run () {
268
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Delaying evaluateInAppMessages due to redisplay data not retrieved yet" );
269
+ evaluateInAppMessages ();
270
+ }
271
+ });
272
+ return ;
273
+ }
274
+
229
275
for (OSInAppMessage message : messages ) {
230
276
// Make trigger evaluation first, dynamic trigger might change "trigger changed" flag value for redisplay messages
231
277
if (triggerController .evaluateMessageTriggers (message )) {
@@ -732,6 +778,8 @@ private void persistInAppMessage(final OSInAppMessage message) {
732
778
Runnable saveIAMOnDBRunnable = new BackgroundRunnable () {
733
779
@ Override
734
780
public void run () {
781
+ super .run ();
782
+
735
783
inAppMessageRepository .saveInAppMessage (message );
736
784
}
737
785
};
@@ -892,6 +940,8 @@ void cleanCachedInAppMessages() {
892
940
Runnable cleanCachedIAMRunnable = new BackgroundRunnable () {
893
941
@ Override
894
942
public void run () {
943
+ super .run ();
944
+
895
945
inAppMessageRepository .cleanCachedInAppMessages ();
896
946
}
897
947
};
@@ -960,25 +1010,48 @@ private void makeRedisplayMessagesAvailableWithTriggers(Collection<String> newTr
960
1010
}
961
1011
}
962
1012
1013
+ private void checkRedisplayMessagesAndEvaluate (Collection <String > newTriggersKeys ) {
1014
+ makeRedisplayMessagesAvailableWithTriggers (newTriggersKeys );
1015
+ evaluateInAppMessages ();
1016
+ }
1017
+
963
1018
/**
964
1019
* Trigger logic
965
1020
* <p>
966
1021
* These methods mostly pass data to the Trigger Controller, but also cause the SDK to
967
1022
* re-evaluate messages to see if we should display/redisplay a message now that the trigger
968
1023
* conditions have changed.
969
1024
*/
970
- void addTriggers (@ NonNull Map <String , Object > newTriggers ) {
1025
+ void addTriggers (@ NonNull final Map <String , Object > newTriggers ) {
971
1026
logger .debug ("Triggers added: " + newTriggers .toString ());
972
1027
triggerController .addTriggers (newTriggers );
973
- makeRedisplayMessagesAvailableWithTriggers (newTriggers .keySet ());
974
- evaluateInAppMessages ();
1028
+
1029
+ if (shouldRunTaskThroughQueue ())
1030
+ taskController .addTaskToQueue (new Runnable () {
1031
+ @ Override
1032
+ public void run () {
1033
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Delaying addTriggers due to redisplay data not retrieved yet" );
1034
+ checkRedisplayMessagesAndEvaluate (newTriggers .keySet ());
1035
+ }
1036
+ });
1037
+ else
1038
+ checkRedisplayMessagesAndEvaluate (newTriggers .keySet ());
975
1039
}
976
1040
977
- void removeTriggersForKeys (Collection <String > keys ) {
1041
+ void removeTriggersForKeys (final Collection <String > keys ) {
978
1042
logger .debug ("Triggers key to remove: " + keys .toString ());
979
1043
triggerController .removeTriggersForKeys (keys );
980
- makeRedisplayMessagesAvailableWithTriggers (keys );
981
- evaluateInAppMessages ();
1044
+
1045
+ if (shouldRunTaskThroughQueue ())
1046
+ taskController .addTaskToQueue (new Runnable () {
1047
+ @ Override
1048
+ public void run () {
1049
+ OneSignal .Log (OneSignal .LOG_LEVEL .DEBUG , "Delaying removeTriggersForKeys due to redisplay data not retrieved yet" );
1050
+ checkRedisplayMessagesAndEvaluate (keys );
1051
+ }
1052
+ });
1053
+ else
1054
+ checkRedisplayMessagesAndEvaluate (keys );
982
1055
}
983
1056
984
1057
Map <String , Object > getTriggers () {
0 commit comments