Skip to content

Commit cc3826e

Browse files
committed
Init IAM with cached IAMs on new session
* When app is closed and opened if it is a new session, the IAMs will be delayed until on_session call, this end with the idea that IAMs stop working * Always init app with cache IAMs
1 parent 1c8354a commit cc3826e

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

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

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.app.AlertDialog;
44
import android.content.DialogInterface;
5-
import android.os.Build;
65
import android.os.Process;
76
import android.support.annotation.NonNull;
87
import android.support.annotation.Nullable;
@@ -33,6 +32,7 @@ class OSInAppMessageController implements OSDynamicTriggerControllerObserver, OS
3332

3433
public static final String IN_APP_MESSAGES_JSON_KEY = "in_app_messages";
3534
private static final String OS_SAVE_IN_APP_MESSAGE = "OS_SAVE_IN_APP_MESSAGE";
35+
private static final Object LOCK = new Object();
3636

3737
OSTriggerController triggerController;
3838
private OSSystemConditionController systemConditionController;
@@ -130,20 +130,26 @@ void initWithCachedInAppMessages() {
130130
if (!messages.isEmpty())
131131
return;
132132

133-
String cachedIamsStr = OneSignalPrefs.getString(
133+
String cachedInAppMessageString = OneSignalPrefs.getString(
134134
OneSignalPrefs.PREFS_ONESIGNAL,
135135
OneSignalPrefs.PREFS_OS_CACHED_IAMS,
136136
null
137137
);
138-
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "initWithCachedInAppMessages: " + cachedIamsStr);
138+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "initWithCachedInAppMessages: " + cachedInAppMessageString);
139139

140-
if (cachedIamsStr == null)
140+
if (cachedInAppMessageString == null || cachedInAppMessageString.isEmpty())
141141
return;
142142

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+
}
147153
}
148154
}
149155

@@ -159,6 +165,7 @@ void receivedInAppMessageJson(@NonNull JSONArray json) throws JSONException {
159165
json.toString());
160166

161167
resetRedisplayMessagesBySession();
168+
162169
processInAppMessageJson(json);
163170
}
164171

@@ -169,14 +176,17 @@ private void resetRedisplayMessagesBySession() {
169176
}
170177

171178
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+
}
176187

177-
newMessages.add(message);
188+
messages = newMessages;
178189
}
179-
messages = newMessages;
180190

181191
evaluateInAppMessages();
182192
}
@@ -774,6 +784,7 @@ private void makeRedisplayMessagesAvailableWithTriggers(Collection<String> newTr
774784
for (OSInAppMessage message : messages) {
775785
if (!message.isTriggerChanged() && redisplayedInAppMessages.contains(message) &&
776786
triggerController.isTriggerOnMessage(message, newTriggersKeys)) {
787+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "Trigger changed for message: " + message.toString());
777788
message.setTriggerChanged(true);
778789
}
779790
}
@@ -787,12 +798,14 @@ private void makeRedisplayMessagesAvailableWithTriggers(Collection<String> newTr
787798
* conditions have changed.
788799
*/
789800
void addTriggers(Map<String, Object> newTriggers) {
801+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "Add trigger called with: " + newTriggers.toString());
790802
triggerController.addTriggers(newTriggers);
791803
makeRedisplayMessagesAvailableWithTriggers(newTriggers.keySet());
792804
evaluateInAppMessages();
793805
}
794806

795807
void removeTriggersForKeys(Collection<String> keys) {
808+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "Remove trigger called with keys: " + keys);
796809
triggerController.removeTriggersForKeys(keys);
797810
makeRedisplayMessagesAvailableWithTriggers(keys);
798811
evaluateInAppMessages();

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ private boolean triggerMatchesNumericValue(@NonNull Number triggerValue, @NonNul
172172
* If trigger key is part of message triggers, then return true, otherwise false
173173
* */
174174
boolean isTriggerOnMessage(OSInAppMessage message, Collection<String> newTriggersKeys) {
175+
if (message.triggers == null)
176+
return false;
177+
175178
for (String triggerKey : newTriggersKeys) {
176179
for (ArrayList<OSTrigger> andConditions : message.triggers) {
177180
for (OSTrigger trigger : andConditions) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,16 +844,16 @@ private static void handleAmazonPurchase() {
844844
// If the app is not in the foreground yet do not make an on_session call yet.
845845
// If we don't have a OneSignal player_id yet make the call to create it regardless of focus
846846
private static void doSessionInit() {
847+
getInAppMessageController().initWithCachedInAppMessages();
847848
// Check session time to determine whether to start a new session or not
848849
if (isPastOnSessionTime()) {
849-
OneSignalStateSynchronizer.setNewSession();
850+
OneSignalStateSynchronizer.setNewSession();
850851
if (foreground) {
851852
outcomeEventsController.cleanOutcomes();
852853
sessionManager.restartSessionIfNeeded(getAppEntryState());
853854
getInAppMessageController().resetSessionLaunchTime();
854855
}
855856
} else if (foreground) {
856-
getInAppMessageController().initWithCachedInAppMessages();
857857
sessionManager.attemptSessionUpgrade(getAppEntryState());
858858
}
859859

0 commit comments

Comments
 (0)