From cb81e744b6072a124320bbbbcb96cdd903dbd600 Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Fri, 16 Feb 2018 16:32:13 -0800 Subject: [PATCH] Fixed callback issue with set email after logout --- .../onesignal/UserStateEmailSynchronizer.java | 17 ++++++++++++++--- .../onesignal/MainOneSignalClassRunner.java | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateEmailSynchronizer.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateEmailSynchronizer.java index 3f3e13f73c..4693924085 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateEmailSynchronizer.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateEmailSynchronizer.java @@ -56,11 +56,17 @@ protected void scheduleSyncToServer() { void setEmail(String email, String emailAuthHash) { JSONObject syncValues = getUserStateForModification().syncValues; - if (email.equals(syncValues.optString("identifier")) && syncValues.optString("email_auth_hash").equals(emailAuthHash == null ? "" : emailAuthHash)) { + boolean noChange = email.equals(syncValues.optString("identifier")) && + syncValues.optString("email_auth_hash").equals(emailAuthHash == null ? "" : emailAuthHash); + if (noChange) { OneSignal.fireEmailUpdateSuccess(); return; } + String existingEmail = syncValues.optString("identifier", null); + if (existingEmail == null) + setSyncAsNewSession(); + try { JSONObject emailJSON = new JSONObject(); emailJSON.put("identifier", email); @@ -69,7 +75,6 @@ void setEmail(String email, String emailAuthHash) { emailJSON.put("email_auth_hash", emailAuthHash); if (emailAuthHash == null) { - String existingEmail = syncValues.optString("identifier", null); if (existingEmail != null && !existingEmail.equals(email)) { OneSignal.saveEmailId(""); resetCurrentState(); @@ -78,6 +83,7 @@ void setEmail(String email, String emailAuthHash) { } generateJsonDiff(syncValues, emailJSON, syncValues, null); + scheduleSyncToServer(); } catch (JSONException e) { e.printStackTrace(); @@ -107,8 +113,13 @@ protected void addOnSessionOrCreateExtras(JSONObject jsonBody) { @Override void logoutEmail() { OneSignal.saveEmailId(""); + resetCurrentState(); - nextSyncIsSession = false; + toSyncUserState.syncValues.remove("identifier"); + toSyncUserState.syncValues.remove("email_auth_hash"); + toSyncUserState.syncValues.remove("device_player_id"); + toSyncUserState.persistState(); + OneSignal.getPermissionSubscriptionState().emailSubscriptionStatus.clearEmailAndId(); } 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 1efd1728f8..afb5414a84 100644 --- a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java +++ b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java @@ -972,6 +972,7 @@ public void shouldFireOnSuccessOfEmailUpdate() throws Exception { OneSignalInit(); TestEmailUpdateHandler testEmailUpdateHandler = new TestEmailUpdateHandler(); OneSignal.setEmail("josh@onesignal.com", testEmailUpdateHandler); + Assert.assertFalse(testEmailUpdateHandler.emailFiredSuccess); threadAndTaskWait(); Assert.assertTrue(testEmailUpdateHandler.emailFiredSuccess); @@ -1005,6 +1006,19 @@ public void shouldFireOnFailureOfEmailUpdateOnNetworkFailure() throws Exception Assert.assertEquals(OneSignal.EmailErrorType.NETWORK, testEmailUpdateHandler.emailFiredFailure.getType()); } + @Test + public void shouldFireOnSuccessOnlyAfterNetworkCallAfterLogout() throws Exception { + OneSignalInit(); + emailSetThenLogout(); + TestEmailUpdateHandler testEmailUpdateHandler = new TestEmailUpdateHandler(); + OneSignal.setEmail("josh@onesignal.com", testEmailUpdateHandler); + Assert.assertFalse(testEmailUpdateHandler.emailFiredSuccess); + threadAndTaskWait(); + + Assert.assertTrue(testEmailUpdateHandler.emailFiredSuccess); + Assert.assertNull(testEmailUpdateHandler.emailFiredFailure); + } + // Should create a new email instead of updating existing player record when no auth hash @Test public void shouldDoPostOnEmailChange() throws Exception {