Skip to content

Commit cb81e74

Browse files
committed
Fixed callback issue with set email after logout
1 parent 713ead3 commit cb81e74

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,17 @@ protected void scheduleSyncToServer() {
5656
void setEmail(String email, String emailAuthHash) {
5757
JSONObject syncValues = getUserStateForModification().syncValues;
5858

59-
if (email.equals(syncValues.optString("identifier")) && syncValues.optString("email_auth_hash").equals(emailAuthHash == null ? "" : emailAuthHash)) {
59+
boolean noChange = email.equals(syncValues.optString("identifier")) &&
60+
syncValues.optString("email_auth_hash").equals(emailAuthHash == null ? "" : emailAuthHash);
61+
if (noChange) {
6062
OneSignal.fireEmailUpdateSuccess();
6163
return;
6264
}
6365

66+
String existingEmail = syncValues.optString("identifier", null);
67+
if (existingEmail == null)
68+
setSyncAsNewSession();
69+
6470
try {
6571
JSONObject emailJSON = new JSONObject();
6672
emailJSON.put("identifier", email);
@@ -69,7 +75,6 @@ void setEmail(String email, String emailAuthHash) {
6975
emailJSON.put("email_auth_hash", emailAuthHash);
7076

7177
if (emailAuthHash == null) {
72-
String existingEmail = syncValues.optString("identifier", null);
7378
if (existingEmail != null && !existingEmail.equals(email)) {
7479
OneSignal.saveEmailId("");
7580
resetCurrentState();
@@ -78,6 +83,7 @@ void setEmail(String email, String emailAuthHash) {
7883
}
7984

8085
generateJsonDiff(syncValues, emailJSON, syncValues, null);
86+
scheduleSyncToServer();
8187
}
8288
catch (JSONException e) {
8389
e.printStackTrace();
@@ -107,8 +113,13 @@ protected void addOnSessionOrCreateExtras(JSONObject jsonBody) {
107113
@Override
108114
void logoutEmail() {
109115
OneSignal.saveEmailId("");
116+
110117
resetCurrentState();
111-
nextSyncIsSession = false;
118+
toSyncUserState.syncValues.remove("identifier");
119+
toSyncUserState.syncValues.remove("email_auth_hash");
120+
toSyncUserState.syncValues.remove("device_player_id");
121+
toSyncUserState.persistState();
122+
112123
OneSignal.getPermissionSubscriptionState().emailSubscriptionStatus.clearEmailAndId();
113124
}
114125

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ public void shouldFireOnSuccessOfEmailUpdate() throws Exception {
972972
OneSignalInit();
973973
TestEmailUpdateHandler testEmailUpdateHandler = new TestEmailUpdateHandler();
974974
OneSignal.setEmail("josh@onesignal.com", testEmailUpdateHandler);
975+
Assert.assertFalse(testEmailUpdateHandler.emailFiredSuccess);
975976
threadAndTaskWait();
976977

977978
Assert.assertTrue(testEmailUpdateHandler.emailFiredSuccess);
@@ -1005,6 +1006,19 @@ public void shouldFireOnFailureOfEmailUpdateOnNetworkFailure() throws Exception
10051006
Assert.assertEquals(OneSignal.EmailErrorType.NETWORK, testEmailUpdateHandler.emailFiredFailure.getType());
10061007
}
10071008

1009+
@Test
1010+
public void shouldFireOnSuccessOnlyAfterNetworkCallAfterLogout() throws Exception {
1011+
OneSignalInit();
1012+
emailSetThenLogout();
1013+
TestEmailUpdateHandler testEmailUpdateHandler = new TestEmailUpdateHandler();
1014+
OneSignal.setEmail("josh@onesignal.com", testEmailUpdateHandler);
1015+
Assert.assertFalse(testEmailUpdateHandler.emailFiredSuccess);
1016+
threadAndTaskWait();
1017+
1018+
Assert.assertTrue(testEmailUpdateHandler.emailFiredSuccess);
1019+
Assert.assertNull(testEmailUpdateHandler.emailFiredFailure);
1020+
}
1021+
10081022
// Should create a new email instead of updating existing player record when no auth hash
10091023
@Test
10101024
public void shouldDoPostOnEmailChange() throws Exception {

0 commit comments

Comments
 (0)