Skip to content

Commit 2936169

Browse files
committed
Fix for extra player PUT network calls
* These extra calls were made if there was a delay in registering with GCM or with location prompting enabled and sendTags or other player updating calls were made.
1 parent f200921 commit 2936169

File tree

7 files changed

+51
-17
lines changed

7 files changed

+51
-17
lines changed

OneSignalSDK/app/src/main/java/com/onesignal/example/OneSignalExampleApp.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ public void onCreate() {
5050
.setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
5151
.setNotificationReceivedHandler(new ExampleNotificationReceivedHandler())
5252
.init();
53+
54+
OneSignal.sendTag("test1", "test1");
5355
}
5456

5557
private class ExampleNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {

OneSignalSDK/app/src/test/java/com/onesignal/ShadowOneSignalRestClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,12 @@ private static void mockPost(String url, JSONObject jsonBody, OneSignalRestClien
101101
}
102102

103103
static void post(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
104+
System.out.println("POST:URL:" + url + " jsonBody: " + jsonBody.toString());
104105
mockPost(url, jsonBody, responseHandler);
105106
}
106107

107108
static void postSync(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
109+
System.out.println("POST Sync:URL:" + url + " jsonBody: " + jsonBody.toString());
108110
mockPost(url, jsonBody, responseHandler);
109111
}
110112

OneSignalSDK/app/src/test/java/com/onesignal/ShadowPushRegistratorGPS.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class ShadowPushRegistratorGPS {
3838
public static final String regId = "aspdfoh0fhj02hr-2h";
3939

4040
public static boolean fail = false;
41-
public static int waitTimer = 0;
41+
public static boolean skipComplete;
4242

4343
private static PushRegistrator.RegisteredHandler lastCallback;
4444

@@ -49,9 +49,11 @@ public static void manualFireRegisterForPush() {
4949
public void registerForPush(Context context, String googleProjectNumber, PushRegistrator.RegisteredHandler callback) {
5050
lastCallback = callback;
5151

52-
if (waitTimer > 0)
53-
SystemClock.sleep(waitTimer);
52+
if (!skipComplete)
53+
callback.complete(fail ? null : regId, 1);
54+
}
5455

55-
callback.complete(fail ? null : regId, 1);
56+
public static void fireLastCallback() {
57+
lastCallback.complete(fail ? null : regId, 1);
5658
}
5759
}

OneSignalSDK/app/src/test/java/com/onesignal/StaticResetHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class StaticResetHelper {
1919
classes.add(new StaticResetHelper().new ClassState(OneSignal.class, new OtherFieldHandler() {
2020
@Override
2121
public boolean onOtherField(Field field) throws Exception {
22-
if (field.getName() == "unprocessedOpenedNotifis") {
22+
if (field.getName().equals("unprocessedOpenedNotifis")) {
2323
field.set(null, new ArrayList<JSONArray>());
2424
return true;
2525
}
@@ -30,7 +30,7 @@ public boolean onOtherField(Field field) throws Exception {
3030
classes.add(new StaticResetHelper().new ClassState(OneSignalStateSynchronizer.class, new OtherFieldHandler() {
3131
@Override
3232
public boolean onOtherField(Field field) throws Exception {
33-
if (field.getName() == "currentUserState" || field.getName() == "toSyncUserState") {
33+
if (field.getName().equals("currentUserState") || field.getName().equals("toSyncUserState")) {
3434
field.set(null, null);
3535
return true;
3636
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@ private static void cleanUp() {
143143
ShadowOneSignalRestClient.networkCallCount = 0;
144144
ShadowOneSignalRestClient.testThread = Thread.currentThread();
145145

146+
ShadowPushRegistratorGPS.skipComplete = false;
146147
ShadowPushRegistratorGPS.fail = false;
148+
147149
notificationOpenedMessage = null;
148150
lastGetTags = null;
149151
}
@@ -735,6 +737,26 @@ public void shouldSendTagsWithRequestBatching() throws Exception {
735737
Assert.assertEquals(4, ShadowOneSignalRestClient.networkCallCount);
736738
}
737739

740+
@Test
741+
public void shouldNotAttemptToSendTagsBeforeGettingPlayerId() throws Exception {
742+
ShadowPushRegistratorGPS.skipComplete = true;
743+
OneSignalInit();
744+
GetIdsAvailable();
745+
746+
threadAndTaskWait();
747+
Assert.assertEquals(1, ShadowOneSignalRestClient.networkCallCount);
748+
749+
// Should not attempt to make a network call yet as we don't have a player_id
750+
OneSignal.sendTags(new JSONObject("{\"test1\": \"value1\"}"));
751+
threadAndTaskWait();
752+
Assert.assertEquals(1, ShadowOneSignalRestClient.networkCallCount);
753+
754+
ShadowPushRegistratorGPS.fireLastCallback();
755+
threadAndTaskWait();
756+
Assert.assertEquals(2, ShadowOneSignalRestClient.networkCallCount);
757+
Assert.assertNotNull(callBackUseId);
758+
}
759+
738760
@Test
739761
public void testOldIntValues() throws Exception {
740762
final SharedPreferences prefs = blankActivity.getSharedPreferences(OneSignal.class.getSimpleName(), Context.MODE_PRIVATE);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public void init() {
167167
private static TrackGooglePurchase trackGooglePurchase;
168168
private static TrackAmazonPurchase trackAmazonPurchase;
169169

170-
public static final String VERSION = "030000";
170+
public static final String VERSION = "030001";
171171

172172
private static AdvertisingIdentifierProvider mainAdIdProvider = new AdvertisingIdProviderGPS();
173173

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -491,18 +491,20 @@ static void syncUserState(boolean fromSyncService) {
491491
currentUserState.persistStateAfterSync(dependDiff, null);
492492
return;
493493
}
494-
495494
toSyncUserState.persistState();
495+
496+
// Prevent non-create player network calls when we don't have a player id yet.
497+
if (userId == null && !nextSyncIsSession)
498+
return;
499+
496500
if (!isSessionCall || fromSyncService) {
497501
OneSignalRestClient.putSync("players/" + userId, jsonBody, new OneSignalRestClient.ResponseHandler() {
498502
@Override
499503
void onFailure(int statusCode, String response, Throwable throwable) {
500504
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "Failed last request. statusCode: " + statusCode + "\nresponse: " + response);
501505

502-
if (response400WithErrorsContaining(statusCode, response, "No user with this id found")) {
503-
resetCurrentState();
504-
postNewSyncUserState();
505-
}
506+
if (response400WithErrorsContaining(statusCode, response, "No user with this id found"))
507+
handlePlayerDeletedFromServer();
506508
else
507509
getNetworkHandlerThread(NetworkHandlerThread.NETWORK_HANDLER_USERSTATE).doRetry();
508510
}
@@ -527,10 +529,8 @@ void onFailure(int statusCode, String response, Throwable throwable) {
527529
waitingForSessionResponse = false;
528530
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "Failed last request. statusCode: " + statusCode + "\nresponse: " + response);
529531

530-
if (response400WithErrorsContaining(statusCode, response, "not a valid device_type")) {
531-
resetCurrentState();
532-
postNewSyncUserState();
533-
}
532+
if (response400WithErrorsContaining(statusCode, response, "not a valid device_type"))
533+
handlePlayerDeletedFromServer();
534534
else
535535
getNetworkHandlerThread(NetworkHandlerThread.NETWORK_HANDLER_USERSTATE).doRetry();
536536
}
@@ -599,7 +599,7 @@ static void postUpdate(UserState postSession, boolean isSession) {
599599
JSONObject dependValues = getUserStateForModification().dependValues;
600600
generateJsonDiff(dependValues, postSession.dependValues, dependValues, null);
601601

602-
nextSyncIsSession = nextSyncIsSession || isSession;
602+
nextSyncIsSession = nextSyncIsSession || isSession || OneSignal.getUserId() == null;
603603
}
604604

605605
static void sendTags(JSONObject newTags) {
@@ -728,4 +728,10 @@ static void resetCurrentState() {
728728
currentUserState.persistState();
729729
OneSignal.setLastSessionTime(-60 * 61);
730730
}
731+
732+
static void handlePlayerDeletedFromServer() {
733+
resetCurrentState();
734+
nextSyncIsSession = true;
735+
postNewSyncUserState();
736+
}
731737
}

0 commit comments

Comments
 (0)