Skip to content

Commit d6f222d

Browse files
authored
Fix foreground check for wrappers (#1174)
* Fix foreground check for wrappers * If user init with activity context foreground check should work even if on resume callback is not fire
1 parent c262a7c commit d6f222d

File tree

6 files changed

+88
-33
lines changed

6 files changed

+88
-33
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ static void processFromContext(Context context, Intent intent) {
5555
if (!isOneSignalIntent(intent))
5656
return;
5757

58-
OneSignal.initWithContext(context);
58+
if (context != null)
59+
OneSignal.initWithContext(context.getApplicationContext());
5960

6061
handleDismissFromActionButtonPress(context, intent);
6162

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
class NotificationPayloadProcessorHMS {
1717

1818
static void handleHMSNotificationOpenIntent(@NonNull Activity activity, @Nullable Intent intent) {
19-
OneSignal.initWithContext(activity);
19+
OneSignal.initWithContext(activity.getApplicationContext());
2020
if (intent == null)
2121
return;
2222

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ public NotificationRestoreWorker(@NonNull Context context, @NonNull WorkerParame
6161
public Result doWork() {
6262
Context context = getApplicationContext();
6363

64-
OneSignal.initWithContext(context);
64+
if (OneSignal.appContext == null)
65+
OneSignal.initWithContext(context);
6566

6667
if (!OSUtils.areNotificationsEnabled(context))
6768
return Result.failure();

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858

5959
import java.io.PrintWriter;
6060
import java.io.StringWriter;
61+
import java.lang.ref.WeakReference;
6162
import java.util.ArrayList;
6263
import java.util.Calendar;
6364
import java.util.Collection;
@@ -275,6 +276,7 @@ public interface PostNotificationResponseHandler {
275276
}
276277

277278
static Context appContext;
279+
static WeakReference<Activity> appActivity;
278280
static String appId;
279281
static String googleProjectNumber;
280282

@@ -571,7 +573,10 @@ public static void setAppId(@NonNull String newAppId) {
571573
return;
572574
}
573575

574-
init(appContext);
576+
if (appActivity != null && appActivity.get() != null)
577+
init(appActivity.get());
578+
else
579+
init(appContext);
575580
}
576581

577582
/**
@@ -589,6 +594,8 @@ public static void initWithContext(@NonNull Context context) {
589594

590595
boolean wasAppContextNull = (appContext == null);
591596
appContext = context.getApplicationContext();
597+
if (context instanceof Activity)
598+
appActivity = new WeakReference<>((Activity) context);
592599
setupActivityLifecycleListener(wasAppContextNull);
593600
setupPrivacyConsent(appContext);
594601

@@ -667,6 +674,8 @@ synchronized private static void init(Context context) {
667674
}
668675

669676
handleActivityLifecycleHandler(context);
677+
// Clean saved init activity
678+
appActivity = null;
670679

671680
OneSignalStateSynchronizer.initUserState();
672681

@@ -767,10 +776,14 @@ private static boolean isSubscriptionStatusUninitializable() {
767776

768777
private static void handleActivityLifecycleHandler(Context context) {
769778
ActivityLifecycleHandler activityLifecycleHandler = ActivityLifecycleListener.getActivityLifecycleHandler();
770-
inForeground = OneSignal.getCurrentActivity() != null;
779+
inForeground = OneSignal.getCurrentActivity() != null || context instanceof Activity;
771780
logger.debug("OneSignal handleActivityLifecycleHandler inForeground: " + inForeground);
772781

773782
if (inForeground) {
783+
if (OneSignal.getCurrentActivity() == null && activityLifecycleHandler != null) {
784+
activityLifecycleHandler.setCurActivity((Activity) context);
785+
activityLifecycleHandler.setNextResumeIsFirstActivity(true);
786+
}
774787
OSNotificationRestoreWorkManager.beginEnqueueingWork(context, false);
775788
FocusTimeController.getInstance().appForegrounded();
776789
} else if (activityLifecycleHandler != null) {

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

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,23 +1918,54 @@ public void testNotificationCompletesFlows_withNullNotificationWillShowInForegro
19181918
assertNotificationDbRecords(1);
19191919
}
19201920

1921+
@Test
1922+
@Config(shadows = { ShadowGenerateNotification.class })
1923+
public void testNotificationWillShowInForegroundHandlerWithActivityAlreadyResumed_doesNotFireWhenAppBackgrounded() throws Exception {
1924+
blankActivityController.resume();
1925+
1926+
// 1. Init OneSignal
1927+
OneSignal.setAppId("b2f7f966-d8cc-11e4-bed1-df8f05be55ba");
1928+
OneSignal.initWithContext(blankActivity);
1929+
OneSignal.setNotificationWillShowInForegroundHandler(notificationReceivedEvent -> {
1930+
lastForegroundNotificationReceivedEvent = notificationReceivedEvent;
1931+
1932+
// Call complete to end without waiting default 30 second timeout
1933+
notificationReceivedEvent.complete(notificationReceivedEvent.getNotification());
1934+
});
1935+
threadAndTaskWait();
1936+
1937+
// 3. Background the app
1938+
blankActivityController.pause();
1939+
threadAndTaskWait();
1940+
1941+
// 4. Receive a notification
1942+
FCMBroadcastReceiver_processBundle(blankActivity, getBaseNotifBundle());
1943+
threadAndTaskWait();
1944+
1945+
// 5. Make sure the AppNotificationJob is null since the app is in background when receiving a notification
1946+
assertNull(lastForegroundNotificationReceivedEvent);
1947+
1948+
// 6. Make sure 1 notification exists in DB
1949+
assertNotificationDbRecords(1);
1950+
}
1951+
19211952
@Test
19221953
@Config(shadows = { ShadowGenerateNotification.class })
19231954
public void testNotificationWillShowInForegroundHandler_doesNotFireWhenAppBackgrounded() throws Exception {
19241955
// 1. Init OneSignal
19251956
OneSignal.setAppId("b2f7f966-d8cc-11e4-bed1-df8f05be55ba");
19261957
OneSignal.initWithContext(blankActivity);
1927-
OneSignal.setNotificationWillShowInForegroundHandler(new OneSignal.OSNotificationWillShowInForegroundHandler() {
1928-
@Override
1929-
public void notificationWillShowInForeground(OSNotificationReceivedEvent notificationReceivedEvent) {
1930-
lastForegroundNotificationReceivedEvent = notificationReceivedEvent;
1958+
OneSignal.setNotificationWillShowInForegroundHandler(notificationReceivedEvent -> {
1959+
lastForegroundNotificationReceivedEvent = notificationReceivedEvent;
19311960

1932-
// Call complete to end without waiting default 30 second timeout
1933-
notificationReceivedEvent.complete(notificationReceivedEvent.getNotification());
1934-
}
1961+
// Call complete to end without waiting default 30 second timeout
1962+
notificationReceivedEvent.complete(notificationReceivedEvent.getNotification());
19351963
});
19361964
threadAndTaskWait();
19371965

1966+
blankActivityController.resume();
1967+
threadAndTaskWait();
1968+
19381969
// 3. Background the app
19391970
blankActivityController.pause();
19401971
threadAndTaskWait();

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

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@
130130
import static com.onesignal.OneSignalPackagePrivateHelper.NotificationBundleProcessor_Process;
131131
import static com.onesignal.OneSignalPackagePrivateHelper.NotificationOpenedProcessor_processFromContext;
132132
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_getSessionListener;
133-
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_isInForeground;
134133
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_handleNotificationOpen;
134+
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_isInForeground;
135135
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_setSessionManager;
136136
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_setTime;
137137
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_setTrackerFactory;
@@ -792,10 +792,23 @@ public void testInitWithContext_ActivityResumedBeforeInit() throws Exception {
792792
OneSignal.setLogLevel(OneSignal.LOG_LEVEL.VERBOSE, OneSignal.LOG_LEVEL.NONE);
793793
ShadowOSUtils.subscribableStatus = 1;
794794

795-
OneSignal.initWithContext(blankActivity);
796795
blankActivityController.resume();
796+
OneSignal.initWithContext(blankActivity);
797+
OneSignal.setAppId(ONESIGNAL_APP_ID);
798+
threadAndTaskWait();
799+
800+
assertTrue(OneSignal_isInForeground());
801+
}
802+
803+
@Test
804+
public void testInitWithContextAppIdSet_ActivityResumedBeforeInit() throws Exception {
805+
OneSignal.setLogLevel(OneSignal.LOG_LEVEL.VERBOSE, OneSignal.LOG_LEVEL.NONE);
806+
ShadowOSUtils.subscribableStatus = 1;
797807

808+
blankActivityController.resume();
798809
OneSignal.setAppId(ONESIGNAL_APP_ID);
810+
OneSignal.initWithContext(blankActivity);
811+
799812
threadAndTaskWait();
800813

801814
assertTrue(OneSignal_isInForeground());
@@ -1084,7 +1097,7 @@ public void testOpeningLauncherActivity() throws Exception {
10841097
// From app launching normally
10851098
assertNotNull(shadowOf(blankActivity).getNextStartedActivity());
10861099
// Will get appId saved
1087-
OneSignal.initWithContext(blankActivity);
1100+
OneSignal.initWithContext(blankActivity.getApplicationContext());
10881101
OneSignal_handleNotificationOpen(blankActivity, new JSONArray("[{ \"alert\": \"Test Msg\", \"custom\": { \"i\": \"UUID\" } }]"), false, ONESIGNAL_NOTIFICATION_ID);
10891102

10901103
assertNotNull(shadowOf(blankActivity).getNextStartedActivity());
@@ -2321,24 +2334,21 @@ public void testFocusConcurrentModificationException() throws Exception {
23212334
}
23222335

23232336
private static Thread newSendTagTestThread(final Thread mainThread, final int id) {
2324-
return new Thread(new Runnable() {
2325-
@Override
2326-
public void run() {
2327-
try {
2328-
for (int i = 0; i < 100; i++) {
2329-
if (failedCurModTest)
2330-
break;
2331-
OneSignal.sendTags("{\"key" + id + "\": " + i + "}");
2332-
}
2333-
} catch (Throwable t) {
2334-
// Ignore the flaky Robolectric null error.
2335-
if (t.getStackTrace()[0].getClassName().equals("org.robolectric.shadows.ShadowMessageQueue"))
2336-
return;
2337-
t.printStackTrace();
2338-
failedCurModTest = true;
2339-
mainThread.interrupt();
2340-
throw t;
2337+
return new Thread(() -> {
2338+
try {
2339+
for (int i = 0; i < 100; i++) {
2340+
if (failedCurModTest)
2341+
break;
2342+
OneSignal.sendTags("{\"key" + id + "\": " + i + "}");
23412343
}
2344+
} catch (Throwable t) {
2345+
// Ignore the flaky Robolectric null error.
2346+
if (t.getStackTrace()[0].getClassName().equals("org.robolectric.shadows.ShadowMessageQueue"))
2347+
return;
2348+
t.printStackTrace();
2349+
failedCurModTest = true;
2350+
mainThread.interrupt();
2351+
throw t;
23422352
}
23432353
});
23442354
}
@@ -3887,7 +3897,6 @@ public void shouldClearBadgesWhenPermissionIsDisabled() throws Exception {
38873897
assertEquals(0, ShadowBadgeCountUpdater.lastCount);
38883898
}
38893899

3890-
38913900
private OSSubscriptionStateChanges lastSubscriptionStateChanges;
38923901
private boolean currentSubscription;
38933902
@Test

0 commit comments

Comments
 (0)