Skip to content

Commit ab3f062

Browse files
authored
Merge pull request #163 from Iterable/chore/MOB-873-only-auto-registerForPush-in-foreground
[MOB-873] Only perform automatic push registration when the app goes into foreground
2 parents 28eb838 + 1b9abb1 commit ab3f062

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ public boolean isInForeground() {
115115
}
116116

117117
public void addCallback(AppStateCallback callback) {
118+
// Don't insert again if the same callback already exists
119+
for (WeakReference<AppStateCallback> existingCallback : callbacks) {
120+
if (existingCallback.get() == callback) {
121+
return;
122+
}
123+
}
118124
callbacks.add(new WeakReference<>(callback));
119125
}
120126

iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class IterableApi {
4848
private Bundle _payloadData;
4949
private IterableNotificationData _notificationData;
5050
private String _deviceId;
51+
private boolean _firstForegroundHandled;
5152

5253
private IterableInAppManager inAppManager;
5354

@@ -244,10 +245,7 @@ public static void initialize(Context context, String apiKey, IterableConfig con
244245
sharedInstance.retrieveEmailAndUserId();
245246
sharedInstance.checkForDeferredDeeplink();
246247
IterableActivityMonitor.getInstance().registerLifecycleCallbacks(context);
247-
248-
if (sharedInstance.config.autoPushRegistration && sharedInstance.isInitialized()) {
249-
sharedInstance.registerForPush();
250-
}
248+
IterableActivityMonitor.getInstance().addCallback(sharedInstance.activityMonitorListener);
251249
}
252250

253251
/**
@@ -1223,6 +1221,26 @@ protected void registerDeviceToken(String email, String userId, String applicati
12231221
//region Private Fuctions
12241222
//---------------------------------------------------------------------------------------
12251223

1224+
private final IterableActivityMonitor.AppStateCallback activityMonitorListener = new IterableActivityMonitor.AppStateCallback() {
1225+
@Override
1226+
public void onSwitchToForeground() {
1227+
onForeground();
1228+
}
1229+
1230+
@Override
1231+
public void onSwitchToBackground() {}
1232+
};
1233+
1234+
private void onForeground() {
1235+
if (!_firstForegroundHandled) {
1236+
_firstForegroundHandled = true;
1237+
if (sharedInstance.config.autoPushRegistration && sharedInstance.isInitialized()) {
1238+
IterableLogger.d(TAG, "Performing automatic push registration");
1239+
sharedInstance.registerForPush();
1240+
}
1241+
}
1242+
}
1243+
12261244
/**
12271245
* Updates the data for the current user.
12281246
* @param context

iterableapi/src/test/java/com/iterable/iterableapi/IterableApiTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.iterable.iterableapi;
22

3+
import android.app.Activity;
34
import android.net.Uri;
45

56
import org.json.JSONObject;
@@ -10,6 +11,7 @@
1011
import org.mockito.Mockito;
1112
import org.robolectric.Robolectric;
1213
import org.robolectric.RuntimeEnvironment;
14+
import org.robolectric.android.controller.ActivityController;
1315
import org.robolectric.shadows.ShadowApplication;
1416

1517
import java.io.IOException;
@@ -246,14 +248,30 @@ public void testSetUserIdWithoutAutomaticPushRegistration() throws Exception {
246248
}
247249

248250
@Test
249-
public void testAutomaticPushRegistrationOnInit() throws Exception {
251+
public void testNoAutomaticPushRegistrationOnInit() throws Exception {
250252
IterableApi.initialize(RuntimeEnvironment.application, "fake_key", new IterableConfig.Builder().setPushIntegrationName("pushIntegration").setAutoPushRegistration(true).build());
251253
IterableApi.getInstance().setEmail("[email protected]");
252254

253255
reInitIterableApi();
254256
IterableApi.initialize(RuntimeEnvironment.application, "fake_key", new IterableConfig.Builder().setPushIntegrationName("pushIntegration").setAutoPushRegistration(true).build());
257+
verify(IterableApi.sharedInstance, never()).registerForPush();
258+
Mockito.reset(IterableApi.sharedInstance);
259+
}
260+
261+
@Test
262+
public void testAutomaticPushRegistrationOnInitAndForeground() throws Exception {
263+
IterableApi.initialize(RuntimeEnvironment.application, "fake_key", new IterableConfig.Builder().setPushIntegrationName("pushIntegration").setAutoPushRegistration(true).build());
264+
IterableApi.getInstance().setEmail("[email protected]");
265+
266+
reInitIterableApi();
267+
IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(RuntimeEnvironment.application);
268+
IterableActivityMonitor.instance = new IterableActivityMonitor();
269+
IterableApi.initialize(RuntimeEnvironment.application, "fake_key", new IterableConfig.Builder().setPushIntegrationName("pushIntegration").setAutoPushRegistration(true).build());
270+
ActivityController<Activity> activityController = Robolectric.buildActivity(Activity.class).create().start().resume();
255271
verify(IterableApi.sharedInstance).registerForPush();
256272
Mockito.reset(IterableApi.sharedInstance);
273+
activityController.pause().stop().destroy();
274+
IterableActivityMonitor.getInstance().unregisterLifecycleCallbacks(RuntimeEnvironment.application);
257275
}
258276

259277
@Test

0 commit comments

Comments
 (0)