Skip to content

Commit 57bd9f9

Browse files
committed
Fix user state null pointer exception
* Have a sync getter method to avoid accessing null user state
1 parent abe7f5c commit 57bd9f9

File tree

4 files changed

+30
-20
lines changed

4 files changed

+30
-20
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class OSTaskController {
3838
static final String SEND_OUTCOME_WITH_VALUE = "sendOutcomeWithValue()";
3939
static final HashSet<String> METHODS_AVAILABLE_FOR_DELAY = new HashSet<>(Arrays.asList(
4040
GET_TAGS,
41+
SET_EMAIL,
42+
LOGOUT_EMAIL,
4143
SYNC_HASHED_EMAIL,
4244
SET_EXTERNAL_USER_ID,
4345
SET_SUBSCRIPTION,
@@ -49,8 +51,11 @@ class OSTaskController {
4951
SET_REQUIRES_USER_PRIVACY_CONSENT,
5052
UNSUBSCRIBE_WHEN_NOTIFICATION_ARE_DISABLED,
5153
HANDLE_NOTIFICATION_OPEN,
52-
SET_EMAIL,
53-
APP_LOST_FOCUS));
54+
APP_LOST_FOCUS,
55+
SEND_OUTCOME,
56+
SEND_UNIQUE_OUTCOME,
57+
SEND_OUTCOME_WITH_VALUE
58+
));
5459

5560
// The concurrent queue in which we pin pending tasks upon finishing initialization
5661
private final ConcurrentLinkedQueue<Runnable> taskQueueWaitingForInit = new ConcurrentLinkedQueue<>();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ void logoutEmail() {
145145
keysToRemove.add("email_auth_hash");
146146
keysToRemove.add("device_player_id");
147147
keysToRemove.add("external_user_id");
148-
toSyncUserState.removeFromSyncValues(keysToRemove);
149-
toSyncUserState.persistState();
148+
getToSyncUserState().removeFromSyncValues(keysToRemove);
149+
getToSyncUserState().persistState();
150150

151151
OneSignal.getEmailSubscriptionState().clearEmailAndId();
152152
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@ void onSuccess(String responseStr) {
5151
JSONObject lastGetTagsResponse = new JSONObject(responseStr);
5252
if (lastGetTagsResponse.has("tags")) {
5353
synchronized(LOCK) {
54-
JSONObject dependDiff = generateJsonDiff(currentUserState.getSyncValues().optJSONObject("tags"),
54+
JSONObject dependDiff = generateJsonDiff(getCurrentUserState().getSyncValues().optJSONObject("tags"),
5555
getToSyncUserState().getSyncValues().optJSONObject("tags"),
5656
null, null);
5757

58-
currentUserState.putOnSyncValues("tags", lastGetTagsResponse.optJSONObject("tags"));
59-
currentUserState.persistState();
58+
getCurrentUserState().putOnSyncValues("tags", lastGetTagsResponse.optJSONObject("tags"));
59+
getCurrentUserState().persistState();
6060

6161
// Allow server side tags to overwrite local tags expect for any pending changes
6262
// that haven't been successfully posted.
@@ -72,14 +72,14 @@ void onSuccess(String responseStr) {
7272
}
7373

7474
synchronized(LOCK) {
75-
return new GetTagsResult(serverSuccess, JSONUtils.getJSONObjectWithoutBlankValues(toSyncUserState.getSyncValues(), "tags"));
75+
return new GetTagsResult(serverSuccess, JSONUtils.getJSONObjectWithoutBlankValues(getToSyncUserState().getSyncValues(), "tags"));
7676
}
7777
}
7878

7979
@Override
8080
@Nullable String getExternalId(boolean fromServer) {
8181
synchronized(LOCK) {
82-
return toSyncUserState.getSyncValues().optString("external_user_id", null);
82+
return getToSyncUserState().getSyncValues().optString("external_user_id", null);
8383
}
8484
}
8585

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ boolean doRetry() {
144144
// currentUserState - Current known state of the user on OneSignal's server.
145145
// toSyncUserState - Pending state that will be synced to the OneSignal server.
146146
// diff will be generated between currentUserState when a sync call is made to the server.
147-
protected UserState currentUserState, toSyncUserState;
147+
private UserState currentUserState, toSyncUserState;
148148

149149
protected JSONObject generateJsonDiff(JSONObject cur, JSONObject changedTo, JSONObject baseOutput, Set<String> includeFields) {
150150
synchronized (LOCK) {
@@ -153,29 +153,34 @@ protected JSONObject generateJsonDiff(JSONObject cur, JSONObject changedTo, JSON
153153
}
154154

155155
protected UserState getCurrentUserState() {
156-
synchronized (LOCK) {
157-
if (currentUserState == null)
158-
currentUserState = newUserState("CURRENT_STATE", true);
156+
if (currentUserState == null) {
157+
synchronized (LOCK) {
158+
if (currentUserState == null)
159+
currentUserState = newUserState("CURRENT_STATE", true);
160+
}
159161
}
160162

161163
return currentUserState;
162164
}
163165

164166
protected UserState getToSyncUserState() {
165-
synchronized (LOCK) {
166-
if (toSyncUserState == null)
167-
toSyncUserState = newUserState("TOSYNC_STATE", true);
167+
if (toSyncUserState == null) {
168+
synchronized (LOCK) {
169+
if (toSyncUserState == null)
170+
toSyncUserState = newUserState("TOSYNC_STATE", true);
171+
}
168172
}
169173

170174
return toSyncUserState;
171175
}
172176

173177
void initUserState() {
174-
synchronized (LOCK) {
175-
if (currentUserState == null)
176-
currentUserState = newUserState("CURRENT_STATE", true);
178+
if (currentUserState == null) {
179+
synchronized (LOCK) {
180+
if (currentUserState == null)
181+
currentUserState = newUserState("CURRENT_STATE", true);
182+
}
177183
}
178-
179184
getToSyncUserState();
180185
}
181186

0 commit comments

Comments
 (0)