From 7b5179f0cab88bd7713f00a659909711f3bf7a4b Mon Sep 17 00:00:00 2001 From: NicK Kelly Date: Tue, 26 May 2026 11:21:48 -0400 Subject: [PATCH] Add callback for unkown user criteria fetching Scenarios exist where userdata needs to be updated shortly after initialization. This update call fails since the unknown user criteria is fetched asynchronously and the criteria are needed to create the unknown user. This callback will allow implementing apps to update the user after the criteria are fetched. --- .../iterable/iterableapi/IterableConfig.java | 17 +++++++++++++++++ .../UnknownCriteriaReceivedCallback.kt | 5 +++++ .../iterableapi/UnknownUserManager.java | 4 +++- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 iterableapi/src/main/java/com/iterable/iterableapi/UnknownCriteriaReceivedCallback.kt diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java index d9e6b2542..3d392def0 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java @@ -146,6 +146,12 @@ public class IterableConfig { */ final IterableInAppDisplayMode inAppDisplayMode; + /** + * Callback to allow the implementor to perform logic following a call to fetch + * unknown user creation criteria + */ + final UnknownCriteriaReceivedCallback unknownCriteriaReceivedCallback; + /** * Base URL for Webview content loading. Specifically used to enable CORS for external resources. * If null or empty, defaults to empty string (original behavior with about:blank origin). @@ -190,6 +196,7 @@ private IterableConfig(Builder builder) { mobileFrameworkInfo = builder.mobileFrameworkInfo; webViewBaseUrl = builder.webViewBaseUrl; inAppDisplayMode = builder.inAppDisplayMode; + unknownCriteriaReceivedCallback = builder.unknownCriteriaReceivedCallback; } public static class Builder { @@ -219,6 +226,7 @@ public static class Builder { private IterableUnknownUserHandler iterableUnknownUserHandler; private String webViewBaseUrl; private IterableInAppDisplayMode inAppDisplayMode = IterableInAppDisplayMode.FORCE_EDGE_TO_EDGE; + private UnknownCriteriaReceivedCallback unknownCriteriaReceivedCallback; public Builder() {} @@ -461,6 +469,15 @@ public Builder setMobileFrameworkInfo(@NonNull IterableAPIMobileFrameworkInfo mo return this; } + /** + * Set a callback to signal completion of api calls to fetch criteria for unknown user creation. + * @param unknownCriteriaReceivedCallback Listener for unknown criteria api calls provided by the app + */ + public Builder setUnknownCriteriaResultCallback(UnknownCriteriaReceivedCallback unknownCriteriaReceivedCallback) { + this.unknownCriteriaReceivedCallback = unknownCriteriaReceivedCallback; + return this; + } + /** * Set how in-app messages interact with the system bars (status bar, navigation bar). * Defaults to {@link IterableInAppDisplayMode#FORCE_EDGE_TO_EDGE}, which preserves existing behavior. diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/UnknownCriteriaReceivedCallback.kt b/iterableapi/src/main/java/com/iterable/iterableapi/UnknownCriteriaReceivedCallback.kt new file mode 100644 index 000000000..7d0d9d652 --- /dev/null +++ b/iterableapi/src/main/java/com/iterable/iterableapi/UnknownCriteriaReceivedCallback.kt @@ -0,0 +1,5 @@ +package com.iterable.iterableapi + +interface UnknownCriteriaReceivedCallback { + fun criteriaReceived() +} \ No newline at end of file diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/UnknownUserManager.java b/iterableapi/src/main/java/com/iterable/iterableapi/UnknownUserManager.java index a6ee48d45..4da40ce58 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/UnknownUserManager.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/UnknownUserManager.java @@ -181,7 +181,9 @@ void getUnknownCriteria() { SharedPreferences.Editor editor = sharedPref.edit(); editor.putString(IterableConstants.SHARED_PREFS_CRITERIA, mockDataObject.toString()); editor.apply(); - + if (IterableApi.getInstance().config.unknownCriteriaReceivedCallback != null) { + IterableApi.getInstance().config.unknownCriteriaReceivedCallback.criteriaReceived(); + } } catch (JSONException e) { e.printStackTrace(); }