Skip to content

Commit 27d703e

Browse files
committed
Add pending tasks to IAMController
* Since work can't start until we have redisplayedInAppMessages init, we delay IAM start points
1 parent e9a1dc7 commit 27d703e

File tree

6 files changed

+104
-25
lines changed

6 files changed

+104
-25
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageController.java

Lines changed: 90 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
3737
add("all");
3838
}};
3939

40-
OSTriggerController triggerController;
40+
private final OSLogger logger;
41+
private final OSTaskController taskController;
42+
4143
private OSSystemConditionController systemConditionController;
4244
private OSInAppMessageRepository inAppMessageRepository;
43-
private OSLogger logger;
45+
46+
OSTriggerController triggerController;
4447

4548
// IAMs loaded remotely from on_session
4649
// If on_session won't be called this will be loaded from cache
@@ -65,8 +68,8 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
6568
final private ArrayList<OSInAppMessage> messageDisplayQueue;
6669
// IAMs displayed with last displayed time and quantity of displays data
6770
// 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;
7073

7174
private OSInAppMessagePrompt currentPrompt = null;
7275
private boolean inAppMessagingEnabled = true;
@@ -84,7 +87,8 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
8487
Date lastTimeInAppDismissed = null;
8588
private int htmlNetworkRequestAttemptCount = 0;
8689

87-
protected OSInAppMessageController(OneSignalDbHelper dbHelper, OSLogger logger) {
90+
protected OSInAppMessageController(OneSignalDbHelper dbHelper, OSTaskController controller, OSLogger logger) {
91+
taskController = controller;
8892
messages = new ArrayList<>();
8993
dismissedMessages = OSUtils.newConcurrentSet();
9094
messageDisplayQueue = new ArrayList<>();
@@ -142,12 +146,34 @@ protected void initRedisplayData(OneSignalDbHelper dbHelper) {
142146
Runnable getCachedIAMRunnable = new BackgroundRunnable() {
143147
@Override
144148
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+
}
147155
}
148156
};
149157

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+
}
151177
}
152178

153179
void resetSessionLaunchTime() {
@@ -190,15 +216,24 @@ void initWithCachedInAppMessages() {
190216
* Called after the device is registered from UserStateSynchronizer
191217
* which is the REST call to create the player record on_session
192218
*/
193-
void receivedInAppMessageJson(@NonNull JSONArray json) throws JSONException {
219+
void receivedInAppMessageJson(@NonNull final JSONArray json) throws JSONException {
194220
// Cache copy for quick cold starts
195221
OneSignalPrefs.saveString(
196222
OneSignalPrefs.PREFS_ONESIGNAL,
197223
OneSignalPrefs.PREFS_OS_CACHED_IAMS,
198224
json.toString());
199225

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+
});
202237
}
203238

204239
private void resetRedisplayMessagesBySession() {
@@ -226,6 +261,17 @@ private void processInAppMessageJson(@NonNull JSONArray json) throws JSONExcepti
226261
private void evaluateInAppMessages() {
227262
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "Starting evaluateInAppMessages");
228263

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+
229275
for (OSInAppMessage message : messages) {
230276
// Make trigger evaluation first, dynamic trigger might change "trigger changed" flag value for redisplay messages
231277
if (triggerController.evaluateMessageTriggers(message)) {
@@ -732,6 +778,8 @@ private void persistInAppMessage(final OSInAppMessage message) {
732778
Runnable saveIAMOnDBRunnable = new BackgroundRunnable() {
733779
@Override
734780
public void run() {
781+
super.run();
782+
735783
inAppMessageRepository.saveInAppMessage(message);
736784
}
737785
};
@@ -892,6 +940,8 @@ void cleanCachedInAppMessages() {
892940
Runnable cleanCachedIAMRunnable = new BackgroundRunnable() {
893941
@Override
894942
public void run() {
943+
super.run();
944+
895945
inAppMessageRepository.cleanCachedInAppMessages();
896946
}
897947
};
@@ -960,25 +1010,48 @@ private void makeRedisplayMessagesAvailableWithTriggers(Collection<String> newTr
9601010
}
9611011
}
9621012

1013+
private void checkRedisplayMessagesAndEvaluate(Collection<String> newTriggersKeys) {
1014+
makeRedisplayMessagesAvailableWithTriggers(newTriggersKeys);
1015+
evaluateInAppMessages();
1016+
}
1017+
9631018
/**
9641019
* Trigger logic
9651020
* <p>
9661021
* These methods mostly pass data to the Trigger Controller, but also cause the SDK to
9671022
* re-evaluate messages to see if we should display/redisplay a message now that the trigger
9681023
* conditions have changed.
9691024
*/
970-
void addTriggers(@NonNull Map<String, Object> newTriggers) {
1025+
void addTriggers(@NonNull final Map<String, Object> newTriggers) {
9711026
logger.debug("Triggers added: " + newTriggers.toString());
9721027
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());
9751039
}
9761040

977-
void removeTriggersForKeys(Collection<String> keys) {
1041+
void removeTriggersForKeys(final Collection<String> keys) {
9781042
logger.debug("Triggers key to remove: " + keys.toString());
9791043
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);
9821055
}
9831056

9841057
Map<String, Object> getTriggers() {

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageControllerFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ class OSInAppMessageControllerFactory {
3535

3636
private OSInAppMessageController controller;
3737

38-
public OSInAppMessageController getController(OneSignalDbHelper dbHelper, OSLogger logger) {
38+
public OSInAppMessageController getController(OneSignalDbHelper dbHelper, OSTaskController taskController, OSLogger logger) {
3939
if (controller == null) {
4040
synchronized (LOCK) {
4141
if (controller == null) {
4242
// Make sure only Android 4.4 devices and higher can use IAMs
4343
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR2)
44-
controller = new OSInAppMessageDummyController(null, logger);
44+
controller = new OSInAppMessageDummyController(null, taskController, logger);
4545
else
46-
controller = new OSInAppMessageController(dbHelper, logger);
46+
controller = new OSInAppMessageController(dbHelper, taskController, logger);
4747
}
4848
}
4949
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageDummyController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ class OSInAppMessageDummyController extends OSInAppMessageController {
1717
* This is a dummy controller that will be used for Android 4.3 and older devices
1818
* All methods should be overridden and as empty as possible (few return exceptions)
1919
*/
20-
OSInAppMessageDummyController(OneSignalDbHelper dbHelper, OSLogger logger) {
21-
super(dbHelper, logger);
20+
OSInAppMessageDummyController(OneSignalDbHelper dbHelper, OSTaskController taskController, OSLogger logger) {
21+
super(dbHelper, taskController, logger);
2222
}
2323

2424
@Override

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,10 +418,11 @@ public void onSessionEnding(@NonNull List<OSInfluence> lastInfluences) {
418418

419419
private static OSInAppMessageControllerFactory inAppMessageControllerFactory = new OSInAppMessageControllerFactory();
420420
static OSInAppMessageController getInAppMessageController() {
421-
return inAppMessageControllerFactory.getController(getDBHelperInstance(), getLogger());
421+
return inAppMessageControllerFactory.getController(getDBHelperInstance(), taskController, getLogger());
422422
}
423423
private static OSTime time = new OSTimeImpl();
424424
private static OSRemoteParamController remoteParamController = new OSRemoteParamController();
425+
private static OSTaskController taskController = new OSTaskController(logger);
425426
private static OSTaskRemoteController taskRemoteController = new OSTaskRemoteController(remoteParamController, logger);
426427
private static OneSignalAPIClient apiClient = new OneSignalRestClientWrapper();
427428
private static OSSharedPreferences preferences = new OSSharedPreferencesWrapper();

OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ public static DelayedConsentInitializationParameters OneSignal_delayedInitParams
268268
}
269269

270270
public static ConcurrentLinkedQueue<Runnable> OneSignal_taskQueueWaitingForInit() {
271-
return OneSignal.getTaskController().getTaskQueueWaitingForInit();
271+
return OneSignal.getTaskRemoteController().getTaskQueueWaitingForInit();
272272
}
273273

274274
public static boolean OneSignal_requiresUserPrivacyConsent() {

OneSignalSDK/unittest/src/test/java/com/onesignal/StaticResetHelper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ public static void load() {
2525
field.set(null, new OSRemoteParamController());
2626
return true;
2727
} else if (field.getName().equals("taskController")) {
28-
field.set(null, new OSTaskController(OneSignal.getRemoteParamController(), new OSLogWrapper()));
28+
OSLogger logger = new OSLogWrapper();
29+
field.set(null, new OSTaskController(logger));
30+
return true;
31+
} else if (field.getName().equals("taskRemoteController")) {
32+
OSLogger logger = new OSLogWrapper();
33+
field.set(null, new OSTaskRemoteController(OneSignal.getRemoteParamController(), logger));
2934
return true;
3035
} else if (field.getName().equals("inAppMessageControllerFactory")) {
3136
field.set(null, new OSInAppMessageControllerFactory());

0 commit comments

Comments
 (0)