diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSSubscriptionState.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSSubscriptionState.java index 4ef405ab1b..a00b2c8ffd 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSSubscriptionState.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSSubscriptionState.java @@ -28,6 +28,8 @@ package com.onesignal; +import android.support.annotation.Nullable; + import org.json.JSONObject; public class OSSubscriptionState implements Cloneable { @@ -64,8 +66,13 @@ void changed(OSPermissionState state) { setAccepted(state.getEnabled()); } - void setUserId(String id) { - boolean changed = !id.equals(userId); + void setUserId(@Nullable String id) { + boolean changed = false; + if (id == null) + changed = userId != null; + else if (!id.equals(userId)) + changed = true; + userId = id; if (changed) observable.notifyChange(this); diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateSynchronizer.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateSynchronizer.java index 67df76a4e9..053867d39e 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateSynchronizer.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateSynchronizer.java @@ -478,8 +478,10 @@ void setExternalUserId(final String externalId) throws JSONException { abstract void setSubscription(boolean enable); private void handlePlayerDeletedFromServer() { + OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "Creating new player based on missing player_id noted above."); OneSignal.handleSuccessfulEmailLogout(); resetCurrentState(); + updateIdDependents(null); scheduleSyncToServer(); } diff --git a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java index e7ce373b87..2b89a8067a 100644 --- a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java +++ b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java @@ -1229,14 +1229,14 @@ public void testChangeAppId_duringRuntime() throws Exception { @Test public void testUserDeletedFromServer() throws Exception { - // First cold boot normal + // 1. Open app and register for the first time. OneSignalInit(); threadAndTaskWait(); int normalCreateFieldCount = ShadowOneSignalRestClient.lastPost.length(); ShadowOneSignalRestClient.lastPost = null; - // Developer deletes user, cold boots apps should resend all fields + // 2. Developer deletes user and cold restarts the app restartAppAndElapseTimeToNextSession(); ShadowOneSignalRestClient.failNext = true; ShadowOneSignalRestClient.setNextFailureJSONResponse(new JSONObject() {{ @@ -1247,21 +1247,24 @@ public void testUserDeletedFromServer() throws Exception { OneSignalInit(); threadAndTaskWait(); + // 3. Assert the SDK handles the error above and make a new create call. + assertPlayerCreatePushAtIndex(4); + // Checking that the number of fields matches exactly to the original create call. assertEquals(normalCreateFieldCount, ShadowOneSignalRestClient.lastPost.length()); - - // Developer deletes users again from dashboard while app is running. - ShadowOneSignalRestClient.lastPost = null; + // 4. Developer deletes users again from dashboard while app is running. ShadowOneSignalRestClient.failNext = true; ShadowOneSignalRestClient.setNextFailureJSONResponse(new JSONObject() {{ - put("errors", new JSONArray() {{ - put("No user with this id found"); - }}); + put("errors", new JSONArray().put("No user with this id found")); }}); + // 5. Make some call the will attempt a player update OneSignal.sendTag("key1", "value1"); threadAndTaskWait(); - assertEquals(normalCreateFieldCount, ShadowOneSignalRestClient.lastPost.length() - 1); + // 6. Assert the SDK handles the error above and make a new create call. + assertPlayerCreatePushAtIndex(6); + // Checking that the number of fields matches original create call, +1 for tags + assertEquals(normalCreateFieldCount + 1, ShadowOneSignalRestClient.lastPost.length()); } @Test