Skip to content

Commit 05b05de

Browse files
committed
Make IAM not display under splas screenh when back pressing
* If user implements splash with a handler timer activity and back press while displaying an IAM, IAM will be displayed under splash * Add callback for when the app lost focus, dismiss IAM but not save it as dismissed this will allow the IAM to be displayed again until the user dismiss it * If the user back press and come too quickly to the app, focus detection won't happen, IAM will still be shown under the splash screen
1 parent cc3826e commit 05b05de

File tree

6 files changed

+62
-13
lines changed

6 files changed

+62
-13
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ abstract static class ActivityAvailableListener {
5050
void available(@NonNull Activity activity) {
5151
}
5252

53-
void stopped(WeakReference<Activity> reference) {
53+
void stopped() {
54+
}
55+
56+
void lostFocus() {
5457
}
5558
}
5659

@@ -145,7 +148,7 @@ static void onActivityStopped(Activity activity) {
145148
}
146149

147150
for (Map.Entry<String, ActivityAvailableListener> entry : sActivityAvailableListeners.entrySet()) {
148-
entry.getValue().stopped(new WeakReference<>(activity));
151+
entry.getValue().stopped();
149152
}
150153

151154
logCurActivity();
@@ -185,7 +188,7 @@ private static void onOrientationChanged() {
185188
// Remove view
186189
handleLostFocus();
187190
for (Map.Entry<String, ActivityAvailableListener> entry : sActivityAvailableListeners.entrySet()) {
188-
entry.getValue().stopped(new WeakReference<>(curActivity));
191+
entry.getValue().stopped();
189192
}
190193

191194
// Show view
@@ -260,6 +263,9 @@ public void run() {
260263
return;
261264

262265
backgrounded = true;
266+
for (Map.Entry<String, ActivityAvailableListener> entry : sActivityAvailableListeners.entrySet()) {
267+
entry.getValue().lostFocus();
268+
}
263269
OneSignal.onAppLostFocus();
264270
completed = true;
265271
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,6 @@ public void run() {
451451
* IAM has been fully dismissed, remove all views and call the onMessageWasDismissed callback
452452
*/
453453
private void cleanupViewsAfterDismiss() {
454-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "InAppMessageView cleanupViewsAfterDismiss");
455454
removeAllViews();
456455
if (messageController != null)
457456
messageController.onMessageWasDismissed();
@@ -461,6 +460,7 @@ private void cleanupViewsAfterDismiss() {
461460
* Remove all views and dismiss PopupWindow
462461
*/
463462
void removeAllViews() {
463+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "InAppMessageView removing views");
464464
if (scheduleDismissRunnable != null) {
465465
// Dismissed before the dismiss delay
466466
handler.removeCallbacks(scheduleDismissRunnable);

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,10 @@ void resetSessionLaunchTime() {
127127
// however an on session won't happen
128128
void initWithCachedInAppMessages() {
129129
// Do not reload from cache if already loaded.
130-
if (!messages.isEmpty())
130+
if (!messages.isEmpty()) {
131+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "initWithCachedInAppMessages with already in memory messages: " + messages);
131132
return;
133+
}
132134

133135
String cachedInAppMessageString = OneSignalPrefs.getString(
134136
OneSignalPrefs.PREFS_ONESIGNAL,
@@ -550,9 +552,6 @@ void messageWasDismissed(@NonNull OSInAppMessage message) {
550552
}
551553

552554
void messageWasDismissed(@NonNull OSInAppMessage message, boolean failed) {
553-
// Remove DIRECT influence due to ClickHandler of ClickAction outcomes
554-
OneSignal.getSessionManager().onDirectInfluenceFromIAMClickFinished();
555-
556555
if (!message.isPreview) {
557556
dismissedMessages.add(message.messageId);
558557
// If failed we will retry on next session
@@ -573,12 +572,21 @@ void messageWasDismissed(@NonNull OSInAppMessage message, boolean failed) {
573572
dismissCurrentMessage(message);
574573
}
575574

575+
void messageWasDismissedByBackPress(@NonNull OSInAppMessage message) {
576+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "OSInAppMessageController messageWasDismissed by back press: " + message.toString());
577+
// IAM was not dismissed by user, will be redisplay again until user dismiss it
578+
dismissCurrentMessage(message);
579+
}
580+
576581
/**
577582
* Removes first item from the queue and attempts to show the next IAM in the queue
578583
*
579584
* @param message The message dismissed, preview messages are null
580585
*/
581586
private void dismissCurrentMessage(@Nullable OSInAppMessage message) {
587+
// Remove DIRECT influence due to ClickHandler of ClickAction outcomes
588+
OneSignal.getSessionManager().onDirectInfluenceFromIAMClickFinished();
589+
582590
if (currentPrompt != null) {
583591
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "Stop evaluateMessageDisplayQueue because prompt is currently displayed");
584592
return;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -844,18 +844,20 @@ 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();
848847
// Check session time to determine whether to start a new session or not
849848
if (isPastOnSessionTime()) {
849+
OneSignal.onesignalLog(LOG_LEVEL.DEBUG, "Starting new session");
850850
OneSignalStateSynchronizer.setNewSession();
851851
if (foreground) {
852852
outcomeEventsController.cleanOutcomes();
853853
sessionManager.restartSessionIfNeeded(getAppEntryState());
854854
getInAppMessageController().resetSessionLaunchTime();
855855
}
856856
} else if (foreground) {
857+
OneSignal.onesignalLog(LOG_LEVEL.DEBUG, "Continue on same session");
857858
sessionManager.attemptSessionUpgrade(getAppEntryState());
858859
}
860+
getInAppMessageController().initWithCachedInAppMessages();
859861

860862
// We still want register the user to OneSignal if the SDK was initialized
861863
// in the background for the first time.

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ protected WebViewManager(@NonNull OSInAppMessage message, @NonNull Activity acti
8484
*/
8585
static void showHTMLString(@NonNull final OSInAppMessage message, @NonNull final String htmlStr) {
8686
final Activity currentActivity = ActivityLifecycleHandler.curActivity;
87+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "in app message showHTMLString on currentActivity: " + currentActivity);
8788
/* IMPORTANT
8889
* This is the starting route for grabbing the current Activity and passing it to InAppMessageView */
8990
if (currentActivity != null) {
@@ -98,9 +99,9 @@ public void onComplete() {
9899
initInAppMessage(currentActivity, message, htmlStr);
99100
}
100101
});
101-
}
102-
else
102+
} else {
103103
initInAppMessage(currentActivity, message, htmlStr);
104+
}
104105
return;
105106
}
106107

@@ -248,6 +249,8 @@ private void calculateHeightAndShowWebViewAfterNewActivity() {
248249
return;
249250
}
250251

252+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "In app message new activity, calculate height and show ");
253+
251254
// Using post to ensure that the status bar inset is already added to the view
252255
OSViewUtils.decorViewReady(activity, new Runnable() {
253256
@Override
@@ -280,17 +283,25 @@ void available(final @NonNull Activity activity) {
280283
}
281284

282285
@Override
283-
void stopped(WeakReference<Activity> reference) {
286+
void stopped() {
284287
if (messageView != null)
285288
messageView.removeAllViews();
286289
}
287290

291+
@Override
292+
void lostFocus() {
293+
OneSignal.getInAppMessageController().messageWasDismissedByBackPress(message);
294+
removeActivityListener();
295+
messageView = null;
296+
}
297+
288298
private void showMessageView(@Nullable Integer newHeight) {
289299
if (messageView == null) {
290300
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "No messageView found to update a with a new height.");
291301
return;
292302
}
293303

304+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "In app message, showing fist one with height: " + newHeight);
294305
messageView.setWebView(webView);
295306
if (newHeight != null)
296307
messageView.updateHeight(newHeight);
@@ -353,7 +364,7 @@ public void onMessageWasShown() {
353364
@Override
354365
public void onMessageWasDismissed() {
355366
OneSignal.getInAppMessageController().messageWasDismissed(message);
356-
ActivityLifecycleHandler.removeActivityAvailableListener(TAG + message.messageId);
367+
removeActivityListener();
357368
}
358369
});
359370

@@ -377,6 +388,9 @@ private static int getWebViewMaxSizeY(Activity activity) {
377388
return OSViewUtils.getWindowHeight(activity) - (MARGIN_PX_SIZE * 2);
378389
}
379390

391+
private void removeActivityListener() {
392+
ActivityLifecycleHandler.removeActivityAvailableListener(TAG + message.messageId);
393+
}
380394
/**
381395
* Trigger the {@link #messageView} dismiss animation flow
382396
*/

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,25 @@ public void doNotReshowInAppIfDismissed_evenAfterColdRestart() throws Exception
465465
assertEquals(0, OneSignalPackagePrivateHelper.getInAppMessageDisplayQueue().size());
466466
}
467467

468+
@Test
469+
public void doNotReshowInAppUntilTriggerIfAppBackPressed() throws Exception {
470+
// 1. Start app
471+
initializeSdkWithMultiplePendingMessages();
472+
// 2. Trigger showing In App and dismiss it
473+
OneSignal.addTrigger("test_2", 2);
474+
assertEquals(1, OneSignalPackagePrivateHelper.getInAppMessageDisplayQueue().size());
475+
assertTrue(OneSignalPackagePrivateHelper.isInAppMessageShowing());
476+
// 3. Emulate back pressing
477+
blankActivityController.destroy();
478+
threadAndTaskWait();
479+
// 4. Put activity back to foreground
480+
blankActivityController = Robolectric.buildActivity(BlankActivity.class).create();
481+
OneSignalInit();
482+
threadAndTaskWait();
483+
assertEquals(1, OneSignalPackagePrivateHelper.getInAppMessageDisplayQueue().size());
484+
assertFalse(OneSignalPackagePrivateHelper.isInAppMessageShowing());
485+
}
486+
468487
@Test
469488
public void reshowInAppIfDisplayedButNeverDismissedAfterColdRestart() throws Exception {
470489
// 1. Start app

0 commit comments

Comments
 (0)