Skip to content

Commit 21658df

Browse files
committed
getTags now pulls from server once each cool start
1 parent f61557a commit 21658df

File tree

5 files changed

+153
-32
lines changed

5 files changed

+153
-32
lines changed

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
public class ShadowOneSignalRestClient {
3535

3636
public static JSONObject lastPost;
37+
public static String lastUrl;
3738
public static Thread testThread;
3839
public static boolean failNext, failAll;
3940
public static String failResponse = "{}", nextSuccessResponse;
@@ -76,6 +77,7 @@ private static boolean doFail(OneSignalRestClient.ResponseHandler responseHandle
7677
}
7778

7879
private static void mockPost(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
80+
lastUrl = url;
7981
networkCallCount++;
8082
lastPost = jsonBody;
8183

@@ -107,6 +109,7 @@ static void postSync(String url, JSONObject jsonBody, OneSignalRestClient.Respon
107109
}
108110

109111
static void putSync(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
112+
lastUrl = url;
110113
networkCallCount++;
111114
lastPost = jsonBody;
112115

@@ -121,6 +124,7 @@ static void putSync(String url, JSONObject jsonBody, OneSignalRestClient.Respons
121124
}
122125

123126
static void put(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
127+
lastUrl = url;
124128
networkCallCount++;
125129
lastPost = jsonBody;
126130

@@ -133,4 +137,20 @@ static void put(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHan
133137

134138
safeInterrupt();
135139
}
140+
141+
static void getSync(final String url, final OneSignalRestClient.ResponseHandler responseHandler) {
142+
lastUrl = url;
143+
networkCallCount++;
144+
doInterruptibleDelay();
145+
if (doFail(responseHandler)) return;
146+
147+
if (nextSuccessResponse != null) {
148+
responseHandler.onSuccess(nextSuccessResponse);
149+
nextSuccessResponse = null;
150+
}
151+
else
152+
responseHandler.onSuccess("{}");
153+
154+
safeInterrupt();
155+
}
136156
}

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

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.robolectric.util.ActivityController;
7171

7272
import java.lang.reflect.Field;
73+
import java.util.Arrays;
7374

7475
@Config(packageName = "com.onesignal.example",
7576
constants = BuildConfig.class,
@@ -335,7 +336,7 @@ public void testInvalidGoogleProjectNumber() throws Exception {
335336
}
336337

337338
@Test
338-
public void testUnsubcribeShouldMakeRegIdNullToIdsAvailable() throws Exception {
339+
public void testUnsubcribedShouldMakeRegIdNullToIdsAvailable() throws Exception {
339340
GetIdsAvailable();
340341
OneSignalInit();
341342
threadAndTaskWait();
@@ -588,7 +589,7 @@ public void shouldSendTagsWithRequestBatching() throws Exception {
588589

589590
Assert.assertEquals("value1", lastGetTags.getString("test1"));
590591
Assert.assertEquals("value2", lastGetTags.getString("test2"));
591-
Assert.assertEquals(2, ShadowOneSignalRestClient.networkCallCount);
592+
Assert.assertEquals(3, ShadowOneSignalRestClient.networkCallCount);
592593
}
593594

594595
@Test
@@ -616,6 +617,7 @@ public void testSendTagNonStringValues() throws Exception {
616617
OneSignalInit();
617618
OneSignal.sendTags("{\"int\": 122, \"bool\": true, \"null\": null, \"array\": [123], \"object\": {}}");
618619
GetTags();
620+
threadAndTaskWait(); threadAndTaskWait();
619621

620622
Assert.assertEquals(String.class, lastGetTags.get("int").getClass());
621623
Assert.assertEquals("122", lastGetTags.get("int"));
@@ -702,24 +704,25 @@ public void testDeleteTags() throws Exception {
702704
OneSignal.sendTags("{\"str\": \"str1\", \"int\": 122, \"bool\": true}");
703705
OneSignal.deleteTag("int");
704706
GetTags();
707+
threadAndTaskWait(); threadAndTaskWait(); threadAndTaskWait();
705708

706709
Assert.assertFalse(lastGetTags.has("int"));
707710
lastGetTags = null;
708711

709-
// Makes sure they get sent
712+
// Should only send the tag we added back.
710713
OneSignal.sendTags("{\"str\": \"str1\", \"int\": 122, \"bool\": true}");
711714
threadAndTaskWait();
712-
Assert.assertEquals("str1", ShadowOneSignalRestClient.lastPost.getJSONObject("tags").get("str"));
715+
Assert.assertEquals("{\"int\":\"122\"}", ShadowOneSignalRestClient.lastPost.getJSONObject("tags").toString());
713716

717+
// Make sure a single delete works.
714718
OneSignal.deleteTag("int");
715-
716719
GetTags();
717-
720+
threadAndTaskWait(); threadAndTaskWait();
718721
Assert.assertFalse(lastGetTags.has("int"));
719722

720-
// After the success response it should not store a "" string when saving to storage.
723+
// Delete all other tags, the 'tags' key should not exists in local storage.
724+
OneSignal.deleteTags(Arrays.asList("bool", "str"));
721725
threadAndTaskWait();
722-
723726
final SharedPreferences prefs = blankActivity.getSharedPreferences(OneSignal.class.getSimpleName(), Context.MODE_PRIVATE);
724727
String syncValues = prefs.getString("ONESIGNAL_USERSTATE_SYNCVALYES_CURRENT_STATE", null);
725728
Assert.assertFalse(new JSONObject(syncValues).has("tags"));
@@ -779,9 +782,41 @@ public void shouldGetTags() throws Exception {
779782
OneSignal.sendTags(new JSONObject("{\"test1\": \"value1\", \"test2\": \"value2\"}"));
780783
threadAndTaskWait();
781784
GetTags();
785+
threadAndTaskWait(); threadAndTaskWait();
786+
787+
Assert.assertEquals("value1", lastGetTags.getString("test1"));
788+
Assert.assertEquals("value2", lastGetTags.getString("test2"));
789+
}
790+
791+
@Test
792+
public void shouldGetTagsFromServerOnFirstCall() throws Exception {
793+
OneSignalInit();
794+
threadAndTaskWait();
795+
796+
ShadowOneSignalRestClient.nextSuccessResponse = "{\"tags\": {\"test1\": \"value1\", \"test2\": \"value2\"}}";
797+
GetTags();
798+
threadAndTaskWait(); threadAndTaskWait();
782799

800+
Assert.assertEquals(2, ShadowOneSignalRestClient.networkCallCount);
783801
Assert.assertEquals("value1", lastGetTags.getString("test1"));
784802
Assert.assertEquals("value2", lastGetTags.getString("test2"));
803+
804+
GetTags();
805+
threadAndTaskWait();
806+
Assert.assertEquals(2, ShadowOneSignalRestClient.networkCallCount);
807+
}
808+
809+
@Test
810+
public void getTagsDelayedAfterRegistering() throws Exception {
811+
OneSignalInit();
812+
GetTags();
813+
threadAndTaskWait();
814+
ShadowOneSignalRestClient.nextSuccessResponse = "{\"tags\": {\"test1\": \"value1\"}}";
815+
threadAndTaskWait(); threadAndTaskWait();
816+
817+
Assert.assertEquals(2, ShadowOneSignalRestClient.networkCallCount);
818+
Assert.assertEquals("value1", lastGetTags.getString("test1"));
819+
Assert.assertTrue(ShadowOneSignalRestClient.lastUrl.contains(ShadowOneSignalRestClient.testUserId));
785820
}
786821

787822
// ####### on_focus Tests ########

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

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public void init() {
160160
private static TrackGooglePurchase trackGooglePurchase;
161161
private static TrackAmazonPurchase trackAmazonPurchase;
162162

163-
public static final String VERSION = "020300";
163+
public static final String VERSION = "020301";
164164

165165
private static AdvertisingIdentifierProvider mainAdIdProvider = new AdvertisingIdProviderGPS();
166166

@@ -180,6 +180,9 @@ public void init() {
180180

181181
static Collection<JSONArray> unprocessedOpenedNotifis = new ArrayList<JSONArray>();
182182

183+
private static GetTagsHandler pendingGetTagsHandler;
184+
private static boolean getTagsCall;
185+
183186
public static OneSignal.Builder startInit(Context context) {
184187
return new OneSignal.Builder(context);
185188
}
@@ -686,7 +689,7 @@ public static void sendTags(JSONObject keyValues) {
686689

687690
if (keyValues == null) return;
688691

689-
JSONObject existingKeys = OneSignalStateSynchronizer.getTags();
692+
JSONObject existingKeys = OneSignalStateSynchronizer.getTags(false).result;
690693

691694
JSONObject toSend = new JSONObject();
692695

@@ -781,11 +784,27 @@ public static void getTags(final GetTagsHandler getTagsHandler) {
781784
return;
782785
}
783786

784-
JSONObject tags = OneSignalStateSynchronizer.getTags();
785-
if (tags == null || tags.toString().equals("{}"))
786-
getTagsHandler.tagsAvailable(null);
787-
else
788-
getTagsHandler.tagsAvailable(OneSignalStateSynchronizer.getTags());
787+
if (getUserId() == null) {
788+
pendingGetTagsHandler = getTagsHandler;
789+
return;
790+
}
791+
internalFireGetTagsCallback(getTagsHandler);
792+
}
793+
794+
private static void internalFireGetTagsCallback(final GetTagsHandler getTagsHandler) {
795+
if (getTagsHandler == null) return;
796+
797+
new Thread(new Runnable() {
798+
@Override
799+
public void run() {
800+
final OneSignalStateSynchronizer.GetTagsResult tags = OneSignalStateSynchronizer.getTags(!getTagsCall);
801+
if (tags.serverSuccess) getTagsCall = true;
802+
if (tags.result == null || tags.toString().equals("{}"))
803+
getTagsHandler.tagsAvailable(null);
804+
else
805+
getTagsHandler.tagsAvailable(tags.result);
806+
}
807+
}).start();
789808
}
790809

791810
public static void deleteTag(String key) {
@@ -1124,6 +1143,12 @@ static void saveUserId(String inUserId) {
11241143
editor.commit();
11251144
}
11261145

1146+
static void updateUserIdDependents(String userId) {
1147+
saveUserId(userId);
1148+
fireIdsAvailableCallback();
1149+
internalFireGetTagsCallback(pendingGetTagsHandler);
1150+
}
1151+
11271152
// If true(default) - Device will always vibrate unless the device is in silent mode.
11281153
// If false - Device will only vibrate when the device is set on it's vibrate only mode.
11291154
public static void enableVibrate(boolean enable) {

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,8 @@ public void run() {
6161
}).start();
6262
}
6363

64-
static void get(final String url, final ResponseHandler responseHandler) {
65-
new Thread(new Runnable() {
66-
public void run() {
67-
makeRequest(url, null, null, responseHandler);
68-
}
69-
}).start();
64+
static void getSync(final String url, final ResponseHandler responseHandler) {
65+
makeRequest(url, null, null, responseHandler);
7066
}
7167

7268
static void putSync(String url, JSONObject jsonBody, ResponseHandler responseHandler) {
@@ -83,17 +79,20 @@ private static void makeRequest(String url, String method, JSONObject jsonBody,
8379
String json = null;
8480

8581
try {
82+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, BASE_URL + url);
8683
con = (HttpURLConnection)new URL(BASE_URL + url).openConnection();
8784
con.setUseCaches(false);
88-
con.setDoOutput(true);
8985
con.setConnectTimeout(TIMEOUT);
9086
con.setReadTimeout(TIMEOUT);
9187

9288
if (jsonBody != null)
9389
con.setDoInput(true);
9490

95-
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
96-
con.setRequestMethod(method);
91+
if (method != null) {
92+
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
93+
con.setRequestMethod(method);
94+
con.setDoOutput(true);
95+
}
9796

9897
if (jsonBody != null) {
9998
String strJsonBody = jsonBody.toString();

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

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@
4646
class OneSignalStateSynchronizer {
4747
private static boolean onSessionDone = false, postSessionCalled = false, waitingForSessionResponse = false;
4848

49-
// currentUserState - current know state of the user on OneSignal's server.
50-
// toSyncUserState - pending state that will be synced to the OneSignal server.
51-
// diff will be generated between currentUserState when sync call is made to the server.
49+
// currentUserState - Current known state of the user on OneSignal's server.
50+
// toSyncUserState - Pending state that will be synced to the OneSignal server.
51+
// diff will be generated between currentUserState when a sync call is made to the server.
5252
private static UserState currentUserState, toSyncUserState;
5353

5454
static HashMap<Integer, NetworkHandlerThread> networkHandlerThreads = new HashMap<>();
@@ -537,9 +537,7 @@ void onSuccess(String response) {
537537

538538
if (jsonResponse.has("id")) {
539539
String userId = jsonResponse.getString("id");
540-
OneSignal.saveUserId(userId);
541-
542-
OneSignal.fireIdsAvailableCallback();
540+
OneSignal.updateUserIdDependents(userId);
543541

544542
OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "Device registered, UserId = " + userId);
545543
} else
@@ -647,8 +645,52 @@ static String getRegistrationId() {
647645
return toSyncUserState.syncValues.optString("identifier", null);
648646
}
649647

650-
static JSONObject getTags() {
651-
return getTagsWithoutDeletedKeys(toSyncUserState.syncValues);
648+
static class GetTagsResult {
649+
public boolean serverSuccess;
650+
public JSONObject result;
651+
652+
GetTagsResult(boolean serverSuccess, JSONObject result) {
653+
this.serverSuccess = serverSuccess; this.result = result;
654+
}
655+
}
656+
657+
private static JSONObject lastGetTagsResponse;
658+
static GetTagsResult getTags(boolean fromServer) {
659+
lastGetTagsResponse = null;
660+
661+
if (fromServer) {
662+
String userId = OneSignal.getUserId();
663+
OneSignalRestClient.getSync("players/" + userId, new OneSignalRestClient.ResponseHandler() {
664+
@Override
665+
void onSuccess(String responseStr) {
666+
try {
667+
lastGetTagsResponse = new JSONObject(responseStr);
668+
if (lastGetTagsResponse.has("tags")) {
669+
lastGetTagsResponse = lastGetTagsResponse.optJSONObject("tags");
670+
currentUserState.syncValues.put("tags", lastGetTagsResponse);
671+
currentUserState.persistState();
672+
673+
JSONObject tagsToSync = getTagsWithoutDeletedKeys(toSyncUserState.syncValues);
674+
if (tagsToSync != null) {
675+
Iterator<String> keys = tagsToSync.keys();
676+
while (keys.hasNext()) {
677+
String key = keys.next();
678+
lastGetTagsResponse.put(key, tagsToSync.optString(key));
679+
}
680+
}
681+
}
682+
else
683+
lastGetTagsResponse = null;
684+
} catch (JSONException e) {
685+
e.printStackTrace();
686+
}
687+
}
688+
});
689+
}
690+
691+
if (lastGetTagsResponse == null)
692+
return new GetTagsResult(false, getTagsWithoutDeletedKeys(toSyncUserState.syncValues));
693+
return new GetTagsResult(true, lastGetTagsResponse);
652694
}
653695

654696
static void resetCurrentState() {

0 commit comments

Comments
 (0)