Skip to content

Commit a744570

Browse files
author
“Akshay
committed
Squashed commit of the following:
commit b374b12 Author: Akshay Ayyanchira <[email protected]> Date: Wed Jun 14 13:24:37 2023 -0700 [MOB 5730] Add callbacks to reading/removing in-app messages (#557) (#583) * [MOB 5730] Add callbacks to reading/removing in-app messages (#557) * add callback for setRead/removeMessage * modify test for setRead and added test for removeMessage * fixes * Update build.gradle * removed resultcallbackhandler * Update IterableInAppManager.java * fixes --------- Co-authored-by: Akshay Ayyanchira <[email protected]> Co-authored-by: Hardik Mashru <[email protected]> * Fixing and adding test method --------- Co-authored-by: devcsomnicg <[email protected]> Co-authored-by: Hardik Mashru <[email protected]> Co-authored-by: “Akshay <“[email protected]”>
1 parent 5fe48a2 commit a744570

File tree

6 files changed

+143
-15
lines changed

6 files changed

+143
-15
lines changed

iterableapi-ui/src/main/java/com/iterable/iterableapi/ui/inbox/IterableInboxFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public void onInboxUpdated() {
244244

245245
@Override
246246
public void onListItemTapped(@NonNull IterableInAppMessage message) {
247-
IterableApi.getInstance().getInAppManager().setRead(message, true);
247+
IterableApi.getInstance().getInAppManager().setRead(message, true, null);
248248

249249
if (inboxMode == InboxMode.ACTIVITY) {
250250
startActivity(new Intent(getContext(), IterableInboxMessageActivity.class).putExtra(IterableInboxMessageActivity.ARG_MESSAGE_ID, message.getMessageId()));
@@ -255,7 +255,7 @@ public void onListItemTapped(@NonNull IterableInAppMessage message) {
255255

256256
@Override
257257
public void onListItemDeleted(@NonNull IterableInAppMessage message, @NonNull IterableInAppDeleteActionType source) {
258-
IterableApi.getInstance().getInAppManager().removeMessage(message, source, IterableInAppLocation.INBOX);
258+
IterableApi.getInstance().getInAppManager().removeMessage(message, source, IterableInAppLocation.INBOX, null, null);
259259
}
260260

261261
@Override

iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,26 @@ public void inAppConsume(@NonNull String messageId) {
735735
IterableLogger.e(TAG, "inAppConsume: message is null");
736736
return;
737737
}
738-
inAppConsume(message, null, null);
738+
inAppConsume(message, null, null, null, null);
739+
IterableLogger.printInfo();
740+
}
741+
742+
/**
743+
* Consumes an InApp message.
744+
* @param messageId
745+
* @param successHandler The callback which returns `success`.
746+
* @param failureHandler The callback which returns `failure`.
747+
*/
748+
public void inAppConsume(@NonNull String messageId, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
749+
IterableInAppMessage message = getInAppManager().getMessageById(messageId);
750+
if (message == null) {
751+
IterableLogger.e(TAG, "inAppConsume: message is null");
752+
if (failureHandler != null) {
753+
failureHandler.onFailure("inAppConsume: message is null", null);
754+
}
755+
return;
756+
}
757+
inAppConsume(message, null, null, successHandler, failureHandler);
739758
IterableLogger.printInfo();
740759
}
741760

@@ -752,8 +771,25 @@ public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable Iterab
752771
if (!checkSDKInitialization()) {
753772
return;
754773
}
774+
apiClient.inAppConsume(message, source, clickLocation, inboxSessionId, null, null);
775+
}
755776

756-
apiClient.inAppConsume(message, source, clickLocation, inboxSessionId);
777+
/**
778+
* Tracks InApp delete.
779+
* This method from informs Iterable about inApp messages deleted with additional paramters.
780+
* Call this method from places where inApp deletion are invoked by user. The messages can be swiped to delete or can be deleted using the link to delete button.
781+
*
782+
* @param message message object
783+
* @param source An enum describing how the in App delete was triggered
784+
* @param clickLocation The module in which the action happened
785+
* @param successHandler The callback which returns `success`.
786+
* @param failureHandler The callback which returns `failure`.
787+
*/
788+
public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable IterableInAppDeleteActionType source, @Nullable IterableInAppLocation clickLocation, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
789+
if (!checkSDKInitialization()) {
790+
return;
791+
}
792+
apiClient.inAppConsume(message, source, clickLocation, inboxSessionId, successHandler, failureHandler);
757793
}
758794

759795
/**

iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ void trackInAppDelivery(@NonNull IterableInAppMessage message) {
317317
}
318318
}
319319

320-
public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable IterableInAppDeleteActionType source, @Nullable IterableInAppLocation clickLocation, @Nullable String inboxSessionId) {
320+
public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable IterableInAppDeleteActionType source, @Nullable IterableInAppLocation clickLocation, @Nullable String inboxSessionId, @Nullable final IterableHelper.SuccessHandler successHandler, @Nullable final IterableHelper.FailureHandler failureHandler) {
321321
JSONObject requestJSON = new JSONObject();
322322

323323
try {
@@ -336,7 +336,7 @@ public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable Iterab
336336
addInboxSessionID(requestJSON, inboxSessionId);
337337
}
338338

339-
sendPostRequest(IterableConstants.ENDPOINT_INAPP_CONSUME, requestJSON);
339+
sendPostRequest(IterableConstants.ENDPOINT_INAPP_CONSUME, requestJSON, successHandler, failureHandler);
340340
} catch (JSONException e) {
341341
e.printStackTrace();
342342
}

iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppFragmentHTMLNotification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ private void processMessageRemoval() {
417417
}
418418

419419
if (message.isMarkedForDeletion() && !message.isConsumed()) {
420-
IterableApi.sharedInstance.getInAppManager().removeMessage(message);
420+
IterableApi.sharedInstance.getInAppManager().removeMessage(message, null, null);
421421
}
422422
}
423423

iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,13 @@ public synchronized int getUnreadInboxMessagesCount() {
132132
* Set the read flag on an inbox message
133133
* @param message Inbox message object retrieved from {@link IterableInAppManager#getInboxMessages()}
134134
* @param read Read state flag. true = read, false = unread
135+
* @param successHandler The callback which returns `success`.
135136
*/
136-
public synchronized void setRead(@NonNull IterableInAppMessage message, boolean read) {
137+
public synchronized void setRead(@NonNull IterableInAppMessage message, boolean read, @Nullable IterableHelper.SuccessHandler successHandler) {
137138
message.setRead(read);
139+
if (successHandler != null) {
140+
successHandler.onSuccess(new JSONObject()); // passing blank json object here as onSuccess is @Nonnull
141+
}
138142
notifyOnChange();
139143
}
140144

@@ -239,7 +243,7 @@ public void execute(Uri url) {
239243
scheduleProcessing();
240244
}
241245
})) {
242-
setRead(message, true);
246+
setRead(message, true, null);
243247
if (consume) {
244248
message.markForDeletion(true);
245249
}
@@ -249,17 +253,19 @@ public void execute(Uri url) {
249253
/**
250254
* Remove message from the list
251255
* @param message The message to be removed
256+
* @param successHandler The callback which returns `success`.
257+
* @param failureHandler The callback which returns `failure`.
252258
*/
253-
public synchronized void removeMessage(@NonNull IterableInAppMessage message) {
259+
public synchronized void removeMessage(@NonNull IterableInAppMessage message, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
254260
message.setConsumed(true);
255-
api.inAppConsume(message.getMessageId());
261+
api.inAppConsume(message.getMessageId(), successHandler, failureHandler);
256262
notifyOnChange();
257263
}
258264

259-
public synchronized void removeMessage(@NonNull IterableInAppMessage message, @NonNull IterableInAppDeleteActionType source, @NonNull IterableInAppLocation clickLocation) {
265+
public synchronized void removeMessage(@NonNull IterableInAppMessage message, @NonNull IterableInAppDeleteActionType source, @NonNull IterableInAppLocation clickLocation, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
260266
IterableLogger.printInfo();
261267
message.setConsumed(true);
262-
api.inAppConsume(message, source, clickLocation);
268+
api.inAppConsume(message, source, clickLocation, successHandler, failureHandler);
263269
notifyOnChange();
264270
}
265271

@@ -432,7 +438,7 @@ private boolean canShowInAppAfterPrevious() {
432438

433439
private void handleIterableCustomAction(String actionName, IterableInAppMessage message) {
434440
if (IterableConstants.ITERABLE_IN_APP_ACTION_DELETE.equals(actionName)) {
435-
removeMessage(message, IterableInAppDeleteActionType.DELETE_BUTTON, IterableInAppLocation.IN_APP);
441+
removeMessage(message, IterableInAppDeleteActionType.DELETE_BUTTON, IterableInAppLocation.IN_APP, null, null);
436442
}
437443
}
438444

iterableapi/src/test/java/com/iterable/iterableapi/IterableInboxTest.java

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22

33
import android.app.Activity;
44

5+
import androidx.annotation.NonNull;
6+
import androidx.annotation.Nullable;
7+
58
import com.iterable.iterableapi.unit.PathBasedQueueDispatcher;
69

10+
import org.json.JSONObject;
711
import org.junit.After;
812
import org.junit.Before;
913
import org.junit.Test;
1014
import org.robolectric.Robolectric;
1115

1216
import java.io.IOException;
1317
import java.util.List;
18+
import java.util.concurrent.CountDownLatch;
19+
import java.util.concurrent.TimeUnit;
1420

1521
import okhttp3.mockwebserver.MockResponse;
1622
import okhttp3.mockwebserver.MockWebServer;
@@ -78,18 +84,98 @@ public void testInboxMessageOrdering() throws Exception {
7884
assertEquals("message4", inboxMessages.get(1).getMessageId());
7985
}
8086

87+
@Test
88+
public void testRemoveMessageSuccessCallbackOnSuccessfulResponse() throws Exception {
89+
final CountDownLatch signal = new CountDownLatch(1);
90+
dispatcher.enqueueResponse("/inApp/getMessages", new MockResponse().setBody(IterableTestUtils.getResourceString("inapp_payload_inbox_multiple.json")));
91+
final IterableInAppManager inAppManager = IterableApi.getInstance().getInAppManager();
92+
inAppManager.syncInApp();
93+
shadowOf(getMainLooper()).idle();
94+
List<IterableInAppMessage> inboxMessages = inAppManager.getInboxMessages();
95+
assertEquals(2, inboxMessages.size());
96+
assertEquals(1, inAppManager.getUnreadInboxMessagesCount());
97+
98+
final JSONObject responseData = new JSONObject("{\"key\":\"value\"}");
99+
dispatcher.enqueueResponse("/events/inAppConsume", new MockResponse().setResponseCode(200).setBody(responseData.toString()));
100+
101+
inAppManager.removeMessage(inboxMessages.get(0), new IterableHelper.SuccessHandler() {
102+
@Override
103+
public void onSuccess(@NonNull JSONObject data) {
104+
signal.countDown();
105+
}
106+
}, new IterableHelper.FailureHandler() {
107+
@Override
108+
public void onFailure(@NonNull String reason, @Nullable JSONObject data) {
109+
assertFalse(true);
110+
}
111+
});
112+
shadowOf(getMainLooper()).idle();
113+
assertTrue("Message remove success callback called", signal.await(1, TimeUnit.SECONDS));
114+
}
115+
116+
@Test
117+
public void testRemoveMessageFailureCallbackOnFailedResponse() throws Exception {
118+
final CountDownLatch signal = new CountDownLatch(1);
119+
dispatcher.enqueueResponse("/inApp/getMessages", new MockResponse().setBody(IterableTestUtils.getResourceString("inapp_payload_inbox_multiple.json")));
120+
final IterableInAppManager inAppManager = IterableApi.getInstance().getInAppManager();
121+
inAppManager.syncInApp();
122+
shadowOf(getMainLooper()).idle();
123+
List<IterableInAppMessage> inboxMessages = inAppManager.getInboxMessages();
124+
assertEquals(2, inboxMessages.size());
125+
assertEquals(1, inAppManager.getUnreadInboxMessagesCount());
126+
127+
final JSONObject responseData = new JSONObject("{\"key\":\"value\"}");
128+
dispatcher.enqueueResponse("/events/inAppConsume", new MockResponse().setResponseCode(500).setBody(responseData.toString()));
129+
130+
inAppManager.removeMessage(inboxMessages.get(0), new IterableHelper.SuccessHandler() {
131+
@Override
132+
public void onSuccess(@NonNull JSONObject data) {
133+
assertFalse(true);
134+
}
135+
}, new IterableHelper.FailureHandler() {
136+
@Override
137+
public void onFailure(@NonNull String reason, @Nullable JSONObject data) {
138+
signal.countDown();
139+
}
140+
});
141+
shadowOf(getMainLooper()).idle();
142+
assertTrue("Message remove failure callback called", signal.await(1, TimeUnit.SECONDS));
143+
}
144+
81145
@Test
82146
public void testSetRead() throws Exception {
147+
// Set up mock response
83148
dispatcher.enqueueResponse("/inApp/getMessages", new MockResponse().setBody(IterableTestUtils.getResourceString("inapp_payload_inbox_multiple.json")));
149+
150+
// Initialize in-app manager and wait for messages to be synced
84151
IterableInAppManager inAppManager = IterableApi.getInstance().getInAppManager();
85152
inAppManager.syncInApp();
86153
shadowOf(getMainLooper()).idle();
154+
155+
// Get inbox messages
87156
List<IterableInAppMessage> inboxMessages = inAppManager.getInboxMessages();
157+
158+
// Verify initial state
88159
assertEquals(1, inAppManager.getUnreadInboxMessagesCount());
89160
assertEquals(2, inboxMessages.size());
90161
assertFalse(inboxMessages.get(0).isRead());
91162
assertTrue(inboxMessages.get(1).isRead());
92-
inAppManager.setRead(inboxMessages.get(0), true);
163+
164+
// Set first message as read with a callback
165+
final boolean[] callbackCalled = { false };
166+
inAppManager.setRead(inboxMessages.get(0), true, new IterableHelper.SuccessHandler() {
167+
@Override
168+
public void onSuccess(@NonNull JSONObject data) {
169+
callbackCalled[0] = true;
170+
assertTrue(callbackCalled[0]);
171+
}
172+
});
173+
174+
// Wait for callback to be called
175+
shadowOf(getMainLooper()).idle();
176+
177+
// Verify that callback was called and that message is marked as read
178+
assertTrue(callbackCalled[0]);
93179
assertEquals(0, inAppManager.getUnreadInboxMessagesCount());
94180
assertEquals(2, inAppManager.getInboxMessages().size());
95181
assertTrue(inboxMessages.get(0).isRead());

0 commit comments

Comments
 (0)