From a0a9cdc2cac463acc157dfb7deb8b25221f754b1 Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Thu, 21 Nov 2019 16:26:25 -0800 Subject: [PATCH] Create new player if missing player_id on put * If we get a "No user with this id found" message on any player update make a follow up player create call. * There was handling for this already but it was not making a player create until a new session - Test was incorrectly just checking for a player call without checking the endpoint which is now fixed. --- .../com/onesignal/OSSubscriptionState.java | 11 ++++++++-- .../com/onesignal/UserStateSynchronizer.java | 2 ++ .../onesignal/MainOneSignalClassRunner.java | 21 +++++++++++-------- 3 files changed, 23 insertions(+), 11 deletions(-) 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