Skip to content

Commit 2d04a71

Browse files
committed
adding page impression rest call and page changed logic
1 parent 24d41f0 commit 2d04a71

File tree

2 files changed

+65
-3
lines changed

2 files changed

+65
-3
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,12 @@ void addClickId(String clickId) {
216216
clickedClickIds.add(clickId);
217217
}
218218

219+
@NonNull
220+
Set<String> getViewedPageIds() { return viewedPageIds; }
221+
219222
void clearPageIds() { viewedPageIds.clear(); }
220223

221-
void addPageIds(String pageId) { viewedPageIds.add(pageId); }
224+
void addPageId(String pageId) { viewedPageIds.add(pageId); }
222225

223226
OSInAppMessageRedisplayStats getRedisplayStats() {
224227
return redisplayStats;

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

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,14 +281,24 @@ void onFailure(int statusCode, String response, Throwable throwable) {
281281
}
282282
}
283283

284+
void onPageChanged(@NonNull final OSInAppMessage message, @NonNull final OSInAppMessagePage newPage) {
285+
if (message.isPreview) {
286+
return;
287+
}
288+
if (message.getViewedPageIds().contains(newPage.getPageId())) {
289+
return;
290+
}
291+
fireRESTCallForPageChange(message, newPage);
292+
}
293+
284294
void onMessageActionOccurredOnMessage(@NonNull final OSInAppMessage message, @NonNull final JSONObject actionJson) throws JSONException {
285295
final OSInAppMessageAction action = new OSInAppMessageAction(actionJson);
286296
action.setFirstClick(message.takeActionAsUnique());
287297

288298
firePublicClickHandler(message.messageId, action);
289299
beginProcessingPrompts(message, action.getPrompts());
290300
fireClickAction(action);
291-
fireRESTCallForClick(message, action);
301+
fireRESTCallForClick(message, action, action.getPageId());
292302
fireTagCallForClick(action);
293303
fireOutcomesForClick(message.messageId, action.getOutcomes());
294304
}
@@ -409,7 +419,54 @@ else if (action.getUrlTarget() == OSInAppMessageAction.OSInAppMessageActionUrlTy
409419
}
410420
}
411421

412-
private void fireRESTCallForClick(@NonNull final OSInAppMessage message, @NonNull final OSInAppMessageAction action) {
422+
private void fireRESTCallForPageChange(@NonNull final OSInAppMessage message, @NonNull final OSInAppMessagePage page) {
423+
final String variantId = variantIdForMessage(message);
424+
if (variantId == null)
425+
return;
426+
427+
final String pageId = page.getPageId();
428+
429+
430+
// Never send multiple page impressions for the same message UUID unless that page change is from an IAM with redisplay
431+
if (message.getViewedPageIds().contains(pageId))
432+
return;
433+
434+
message.addPageId(page.getPageId());
435+
436+
try {
437+
JSONObject json = new JSONObject() {{
438+
put("app_id", OneSignal.appId);
439+
put("player_id", OneSignal.getUserId());
440+
put("variant_id", variantId);
441+
put("device_type", new OSUtils().getDeviceType());
442+
put("page_id", pageId);
443+
}};
444+
445+
OneSignalRestClient.post("in_app_messages/" + message.messageId + "/pageImpression", json, new ResponseHandler() {
446+
@Override
447+
void onSuccess(String response) {
448+
printHttpSuccessForInAppMessageRequest("page impression", response);
449+
/*OneSignalPrefs.saveStringSet(
450+
OneSignalPrefs.PREFS_ONESIGNAL,
451+
OneSignalPrefs.PREFS_OS_PAGE_IMPRESSIONED_IAMS,
452+
// Post success, store impressioned page to disk
453+
impressionedMessages);*/
454+
}
455+
456+
@Override
457+
void onFailure(int statusCode, String response, Throwable throwable) {
458+
printHttpErrorForInAppMessageRequest("page impression", statusCode, response);
459+
// Post failed, impressionedMessage should be removed and this way another post can be attempted
460+
message.getViewedPageIds().remove(page.getPageId());
461+
}
462+
});
463+
} catch (JSONException e) {
464+
e.printStackTrace();
465+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR, "Unable to execute in-app message impression HTTP request due to invalid JSON");
466+
}
467+
}
468+
469+
private void fireRESTCallForClick(@NonNull final OSInAppMessage message, @NonNull final OSInAppMessageAction action, @Nullable final String pageId) {
413470
final String variantId = variantIdForMessage(message);
414471
if (variantId == null)
415472
return;
@@ -433,6 +490,7 @@ private void fireRESTCallForClick(@NonNull final OSInAppMessage message, @NonNul
433490
put("player_id", OneSignal.getUserId());
434491
put("click_id", clickId);
435492
put("variant_id", variantId);
493+
if (pageId != null) { put("page_id", pageId); }
436494
if (action.isFirstClick())
437495
put("first_click", true);
438496
}};
@@ -495,6 +553,7 @@ private void setDataForRedisplay(OSInAppMessage message) {
495553
dismissedMessages.remove(message.messageId);
496554
impressionedMessages.remove(message.messageId);
497555
message.clearClickIds();
556+
message.clearPageIds();
498557
}
499558
}
500559
}

0 commit comments

Comments
 (0)