From c1bf0335c31549c84770911edd2a460a42058b55 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Tue, 11 Feb 2025 16:47:40 -0700 Subject: [PATCH 1/8] adds optional parameter to syncMessages --- .../iterable/iterableapi/IterableEmbeddedManager.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt index 4aafc6d72..f5b683707 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt @@ -80,12 +80,18 @@ public class IterableEmbeddedManager : IterableActivityMonitor.AppStateCallback return placementIds } - //Network call to get the embedded messages fun syncMessages() { + syncMessages(emptyArray()) + } + + //Network call to get the embedded messages + fun syncMessages(testPlacementIds: Array) { if (iterableApi.config.enableEmbeddedMessaging) { IterableLogger.v(TAG, "Syncing messages...") - IterableApi.sharedInstance.getEmbeddedMessages(SuccessHandler { data -> + //var testPlacementIds: Array = arrayOf(1132L) + + IterableApi.sharedInstance.getEmbeddedMessages(testPlacementIds, { data -> IterableLogger.v(TAG, "Got response from network call to get embedded messages") try { val previousPlacementIds = getPlacementIds() From 2ebc2331d3e8f92081d3eb34d19d4cc298f1d304 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Tue, 11 Feb 2025 17:00:44 -0700 Subject: [PATCH 2/8] updates naming --- .../iterable/iterableapi/IterableEmbeddedManager.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt b/iterableapi/src/main/java/com/iterable/iterableapi/IterableEmbeddedManager.kt index f5b683707..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,7 +77,7 @@ public class IterableEmbeddedManager : IterableActivityMonitor.AppStateCallback } fun getPlacementIds(): List { - return placementIds + return localPlacementIds } fun syncMessages() { @@ -85,13 +85,11 @@ public class IterableEmbeddedManager : IterableActivityMonitor.AppStateCallback } //Network call to get the embedded messages - fun syncMessages(testPlacementIds: Array) { + fun syncMessages(placementIds: Array) { if (iterableApi.config.enableEmbeddedMessaging) { IterableLogger.v(TAG, "Syncing messages...") - //var testPlacementIds: Array = arrayOf(1132L) - - IterableApi.sharedInstance.getEmbeddedMessages(testPlacementIds, { data -> + IterableApi.sharedInstance.getEmbeddedMessages(placementIds, { data -> IterableLogger.v(TAG, "Got response from network call to get embedded messages") try { val previousPlacementIds = getPlacementIds() @@ -141,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()) From fa4cafd32322dce550c215fa0156d1666be80b90 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Tue, 11 Feb 2025 17:56:28 -0700 Subject: [PATCH 3/8] adds unit tests --- .../IterableEmbeddedManagerTest.java | 20 +++++++++ ...mbedded_payload_single_placement_id_0.json | 42 +++++++++++++++++++ ...mbedded_payload_single_placement_id_2.json | 42 +++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 iterableapi/src/test/resources/embedded_payload_single_placement_id_0.json create mode 100644 iterableapi/src/test/resources/embedded_payload_single_placement_id_2.json diff --git a/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java index 30c4d7d1f..d2deafbc5 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 From 7a3f1c1c47adf459717f1936c010998050fe5532 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 12 Feb 2025 10:28:30 -0700 Subject: [PATCH 4/8] cleans up path for placement ids params --- .../iterableapi/IterableApiClient.java | 33 +++++++++++-------- .../IterableEmbeddedManagerTest.java | 4 +-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java index 0bd0337d7..21dd212d4 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java @@ -233,13 +233,7 @@ void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper. 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(); + String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onCallback); } else { sendGetRequest(IterableConstants.ENDPOINT_GET_EMBEDDED_MESSAGES, requestJSON, onCallback); @@ -261,13 +255,7 @@ void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper. 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(); + 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/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java index d2deafbc5..707cdb67f 100644 --- a/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java +++ b/iterableapi/src/test/java/com/iterable/iterableapi/IterableEmbeddedManagerTest.java @@ -89,7 +89,7 @@ public void testSyncEmbeddedMultiplePlacements() throws Exception { @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"))); + 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}); @@ -98,7 +98,7 @@ public void testSyncSpecifiedPlacement() throws Exception { 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"))); + 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(); From e800dd04e5fddfec0ea35c1e87033e1e785d1ddb Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 12 Feb 2025 10:55:13 -0700 Subject: [PATCH 5/8] cleans up path when there are no placement ids params --- .../main/java/com/iterable/iterableapi/IterableApi.java | 2 +- .../java/com/iterable/iterableapi/IterableApiClient.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java index 45c77ecb9..cab797d74 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java @@ -273,7 +273,7 @@ public void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull Iterable * @param onFailure */ - public void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { + public void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { if (!checkSDKInitialization()) { return; } diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java index 21dd212d4..9e97b41dd 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java @@ -222,7 +222,7 @@ public void getInAppMessages(int count, @NonNull IterableHelper.IterableActionHa } } - void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper.IterableActionHandler onCallback) { + void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.IterableActionHandler onCallback) { JSONObject requestJSON = new JSONObject(); try { @@ -232,7 +232,7 @@ 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) { + if (placementIds.length != 0) { String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onCallback); } else { @@ -244,7 +244,7 @@ void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper. } } - void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { + void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { JSONObject requestJSON = new JSONObject(); try { @@ -254,7 +254,7 @@ 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) { + if (placementIds.length != 0) { String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onSuccess, onFailure); } else { From 864fe24bee74d1f914d6037ef7f271c4b4e35e29 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 12 Feb 2025 10:59:39 -0700 Subject: [PATCH 6/8] keeps nullable annotations --- .../java/com/iterable/iterableapi/IterableApiClient.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java index 9e97b41dd..8234d533a 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java @@ -222,7 +222,7 @@ public void getInAppMessages(int count, @NonNull IterableHelper.IterableActionHa } } - void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.IterableActionHandler onCallback) { + void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper.IterableActionHandler onCallback) { JSONObject requestJSON = new JSONObject(); try { @@ -232,7 +232,7 @@ void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.IterableAc requestJSON.put(IterableConstants.ITBL_SYSTEM_VERSION, Build.VERSION.RELEASE); requestJSON.put(IterableConstants.KEY_PACKAGE_NAME, authProvider.getContext().getPackageName()); - if (placementIds.length != 0) { + if (placementIds != null &&placementIds.length != 0) { String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onCallback); } else { @@ -244,7 +244,7 @@ void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.IterableAc } } - void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { + void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { JSONObject requestJSON = new JSONObject(); try { @@ -254,7 +254,7 @@ void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.SuccessHan requestJSON.put(IterableConstants.ITBL_SYSTEM_VERSION, Build.VERSION.RELEASE); requestJSON.put(IterableConstants.KEY_PACKAGE_NAME, authProvider.getContext().getPackageName()); - if (placementIds.length != 0) { + if (placementIds != null && placementIds.length != 0) { String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onSuccess, onFailure); } else { From 01d7dacac1c92e0df61f6f62b3c5051e56c9f2ac Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 12 Feb 2025 11:02:26 -0700 Subject: [PATCH 7/8] added nullable annotation for IterableApi class --- .../src/main/java/com/iterable/iterableapi/IterableApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java index cab797d74..45c77ecb9 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java @@ -273,7 +273,7 @@ public void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull Iterable * @param onFailure */ - public void getEmbeddedMessages(Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { + public void getEmbeddedMessages(@Nullable Long[] placementIds, @NonNull IterableHelper.SuccessHandler onSuccess, @NonNull IterableHelper.FailureHandler onFailure) { if (!checkSDKInitialization()) { return; } From 3e840497f68b656af20cb8ab3823190036fe2372 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 12 Feb 2025 11:10:13 -0700 Subject: [PATCH 8/8] addresses check --- .../main/java/com/iterable/iterableapi/IterableApiClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java index 8234d533a..1afbffedb 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java @@ -232,7 +232,7 @@ 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 &&placementIds.length != 0) { + if (placementIds != null && placementIds.length != 0) { String path = getEmbeddedMessagesPath(placementIds); sendGetRequest(path, requestJSON, onCallback); } else {