diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java index 0bd0337d7..1afbffedb 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java @@ -232,14 +232,8 @@ void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper. requestJSON.put(IterableConstants.ITBL_SYSTEM_VERSION, Build.VERSION.RELEASE); requestJSON.put(IterableConstants.KEY_PACKAGE_NAME, authProvider.getContext().getPackageName()); - if (placementIds != null) { - StringBuilder pathBuilder = new StringBuilder(IterableConstants.ENDPOINT_GET_EMBEDDED_MESSAGES + "?"); - - for (Long placementId : placementIds) { - pathBuilder.append("&placementIds=").append(placementId); - } - - String path = pathBuilder.toString(); + if (placementIds != null && placementIds.length != 0) { + String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onCallback); } else { sendGetRequest(IterableConstants.ENDPOINT_GET_EMBEDDED_MESSAGES, requestJSON, onCallback); @@ -260,14 +254,8 @@ void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper. requestJSON.put(IterableConstants.ITBL_SYSTEM_VERSION, Build.VERSION.RELEASE); requestJSON.put(IterableConstants.KEY_PACKAGE_NAME, authProvider.getContext().getPackageName()); - if (placementIds != null) { - StringBuilder pathBuilder = new StringBuilder(IterableConstants.ENDPOINT_GET_EMBEDDED_MESSAGES + "?"); - - for (Long placementId : placementIds) { - pathBuilder.append("&placementIds=").append(placementId); - } - - String path = pathBuilder.toString(); + if (placementIds != null && placementIds.length != 0) { + String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onSuccess, onFailure); } else { sendGetRequest(IterableConstants.ENDPOINT_GET_EMBEDDED_MESSAGES, requestJSON, onSuccess, onFailure); @@ -278,6 +266,23 @@ void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper. } } + @NonNull + private static String getEmbeddedMessagesPath(Long[] placementIds) { + StringBuilder pathBuilder = new StringBuilder(IterableConstants.ENDPOINT_GET_EMBEDDED_MESSAGES + "?"); + + boolean isFirst = true; + for (Long placementId : placementIds) { + if (isFirst) { + pathBuilder.append("placementIds=").append(placementId); + isFirst = false; + } else { + pathBuilder.append("&placementIds=").append(placementId); + } + } + + return pathBuilder.toString(); + } + public void trackInAppOpen(@NonNull String messageId) { JSONObject requestJSON = new JSONObject(); diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt index 4aafc6d72..8b53171bc 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt @@ -13,7 +13,7 @@ public class IterableEmbeddedManager : IterableActivityMonitor.AppStateCallback // region variables private var localPlacementMessagesMap = mutableMapOf>() - private var placementIds = mutableListOf() + private var localPlacementIds = mutableListOf() private var updateHandleListeners = mutableListOf() private var iterableApi: IterableApi @@ -77,15 +77,19 @@ public class IterableEmbeddedManager : IterableActivityMonitor.AppStateCallback } fun getPlacementIds(): List { - return placementIds + return localPlacementIds } - //Network call to get the embedded messages fun syncMessages() { + syncMessages(emptyArray()) + } + + //Network call to get the embedded messages + fun syncMessages(placementIds: Array) { if (iterableApi.config.enableEmbeddedMessaging) { IterableLogger.v(TAG, "Syncing messages...") - IterableApi.sharedInstance.getEmbeddedMessages(SuccessHandler { data -> + IterableApi.sharedInstance.getEmbeddedMessages(placementIds, { data -> IterableLogger.v(TAG, "Got response from network call to get embedded messages") try { val previousPlacementIds = getPlacementIds() @@ -135,7 +139,7 @@ public class IterableEmbeddedManager : IterableActivityMonitor.AppStateCallback } //store placements from payload for next comparison - placementIds = currentPlacementIds + localPlacementIds = currentPlacementIds } catch (e: JSONException) { IterableLogger.e(TAG, e.toString()) diff --git a/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java index 30c4d7d1f..707cdb67f 100644 --- a/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java +++ b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java @@ -87,6 +87,26 @@ public void testSyncEmbeddedMultiplePlacements() throws Exception { assertEquals("grewdvb54ut87y", embeddedManager.getMessages(2L).get(0).getMetadata().getMessageId()); } + @Test + public void testSyncSpecifiedPlacement() throws Exception { + dispatcher.enqueueResponse("/embedded-messaging/messages?placementIds=0", new MockResponse().setBody(IterableTestUtils.getResourceString("embedded_payload_single_placement_id_0.json"))); + IterableEmbeddedManager embeddedManager = IterableApi.getInstance().getEmbeddedManager(); + + embeddedManager.syncMessages(new Long[] {0L}); + shadowOf(getMainLooper()).idle(); + assertEquals(1, embeddedManager.getMessages(0L).size()); + assertNull(embeddedManager.getMessages(1L)); + assertEquals("doibjo4590340oidiobnw", embeddedManager.getMessages(0L).get(0).getMetadata().getMessageId()); + + dispatcher.enqueueResponse("/embedded-messaging/messages?placementIds=2", new MockResponse().setBody(IterableTestUtils.getResourceString("embedded_payload_single_placement_id_2.json"))); + + embeddedManager.syncMessages(new Long[] {2L}); + shadowOf(getMainLooper()).idle(); + assertNull(embeddedManager.getMessages(1L)); + assertEquals(1, embeddedManager.getMessages(2L).size()); + assertEquals("grewdvb54ut87y", embeddedManager.getMessages(2L).get(0).getMetadata().getMessageId()); + } + @Test public void testSyncEmptyPlacementsPayload() throws Exception { dispatcher.enqueueResponse("/embedded-messaging/messages", new MockResponse().setBody(IterableTestUtils.getResourceString("embedded_payload_multiple_1.json"))); diff --git a/iterableapi/src/test/resources/embedded_payload_single_placement_id_0.json b/iterableapi/src/test/resources/embedded_payload_single_placement_id_0.json new file mode 100644 index 000000000..fb08627dc --- /dev/null +++ b/iterableapi/src/test/resources/embedded_payload_single_placement_id_0.json @@ -0,0 +1,42 @@ +{ + "placements": [ + { + "placementId": 0, + "embeddedMessages": [ + { + "metadata": { + "messageId": "doibjo4590340oidiobnw", + "placementId": 0, + "campaignId": 2324, + "isProof": true + }, + "elements": { + "title": "Iterable Coffee Shoppe", + "body": "SAVE 15% OFF NOW", + "mediaUrl": "http://placekitten.com/200/300", + "defaultAction": { + "type": "someType", + "data": "someData" + }, + "buttons": [{ + "id": "reward-button", + "title": "REDEEM MEOW", + "action": { + "type": "openUrl", + "data": "https://www.google.com" + } + }], + "text": [{ + "id": "body", + "text": "CATS RULE!!!", + "label": "label" + }] + }, + "payload": { + "someKey": "someValue" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/iterableapi/src/test/resources/embedded_payload_single_placement_id_2.json b/iterableapi/src/test/resources/embedded_payload_single_placement_id_2.json new file mode 100644 index 000000000..770af111a --- /dev/null +++ b/iterableapi/src/test/resources/embedded_payload_single_placement_id_2.json @@ -0,0 +1,42 @@ +{ + "placements": [ + { + "placementId": 2, + "embeddedMessages": [ + { + "metadata": { + "messageId": "grewdvb54ut87y", + "placementId": 2, + "campaignId": 1910, + "isProof": true + }, + "elements": { + "title": "Experience the great outdoors", + "body": "Trips are going fast!", + "mediaUrl": "http://placekitten.com/200/300", + "defaultAction": { + "type": "someType", + "data": "someData" + }, + "buttons": [{ + "id": "reward-button", + "title": "REDEEM MEOW", + "action": { + "type": "openUrl", + "data": "https://www.google.com" + } + }], + "text": [{ + "id": "body", + "text": "CATS RULE!!!", + "label": "label" + }] + }, + "payload": { + "someKey": "someValue" + } + } + ] + } + ] +} \ No newline at end of file