Skip to content

Releases: Iterable/iterable-android-sdk

3.10.0

Choose a tag to compare

@joaodordio joaodordio released this 21 Jul 14:46
12748cf

Added

  • IterableUnknownUserHandler now reports unknown user criteria fetch results via two optional methods: onCriteriaReceived(JSONObject criteria) on a successful fetch and onCriteriaFetchFailed(String reason) on failure. This lets apps act (e.g. track an event or update the user) as soon as criteria are available, without racing the asynchronous criteria fetch. Both have default no-op implementations, so existing handlers are unaffected. Callbacks are delivered on the main thread and may fire on every fetch (initialization, foregrounding, and when visitor usage tracking is enabled), so implementations should handle being called repeatedly.
  • Notification small-icon resolution now falls back through standard conventions — the Firebase com.google.firebase.messaging.default_notification_icon meta-data, @drawable/notification_icon (Expo / React Native), and @drawable/ic_notification — before defaulting to the app launcher icon. This fixes white-square notification icons on Android 5.0+ for apps that configure their icon through these conventions but don't set iterable_notification_icon.
  • Added a DEFER response to IterableInAppHandler.InAppResponse, returned from onNewInApp(message). Unlike SKIP (which permanently drops the message), DEFER leaves the message pending so the SDK reconsiders it on a later display pass (next foreground, sync, or newly arrived message). Use it for temporary, per-message suppression — for example while a splash screen is showing. Existing handlers returning SHOW/SKIP are unaffected.
  • Added IterableInAppManager.resumeInAppDisplay() so apps can prompt the SDK to re-evaluate pending in-app messages once they become ready to display (e.g. after a splash screen is dismissed), without waiting for the next foreground/sync trigger. This is independent of setAutoDisplayPaused(boolean): if auto display is paused, resumeInAppDisplay() will not show anything (and logs a warning) until you also call setAutoDisplayPaused(false).
  • Added IterableApi.getInAppManagerOrNull() and IterableApi.getEmbeddedManagerOrNull(), which return null when the SDK has not been initialized instead of a no-op manager. Use these when you need to detect the uninitialized state explicitly.

Changed

  • IterableApi.getInAppManager() and IterableApi.getEmbeddedManager() no longer throw a RuntimeException when called before IterableApi.initialize(). They now log an error and return a no-op manager (empty lists, ignored commands). To detect the uninitialized state explicitly, use the new getInAppManagerOrNull() / getEmbeddedManagerOrNull().

Migration guide

No action required. Existing IterableInAppHandler implementations returning SHOW/SKIP are unaffected.

To suppress an in-app temporarily (e.g. during a splash screen), return the new DEFER instead of SKIP — the message stays pending and is re-offered on a later display pass:

new IterableConfig.Builder().setInAppHandler(message ->
    appIsShowingSplashScreen()
        ? IterableInAppHandler.InAppResponse.DEFER
        : IterableInAppHandler.InAppResponse.SHOW
).build();

Once ready, call IterableApi.getInstance().getInAppManager().resumeInAppDisplay() to re-check pending messages immediately instead of waiting for the next foreground/sync. Note that resumeInAppDisplay() does not unpause auto display — if you previously called setAutoDisplayPaused(true), call setAutoDisplayPaused(false) to resume.

Kotlin: add a DEFER branch to any exhaustive when over InAppResponse.

3.9.0

Choose a tag to compare

@franco-zalamena-iterable franco-zalamena-iterable released this 24 Jun 14:47
1cb555b

Added

  • Added support for in-app messages in fully Jetpack Compose apps using a Dialog-based renderer (IterableInAppDialogNotification), removing the requirement for a FragmentActivity.
  • New IterableInboxToolbarView — an opt-in, reusable toolbar component for the inbox UI. Configurable via the new Kotlin sealed interface InboxToolbarOption:
    • None (default) — no toolbar; behavior is unchanged from prior SDK versions.
    • Default — title-only toolbar above the inbox list.
    • WithBackButton — title plus a back navigation icon. The default back action calls OnBackPressedDispatcher; override it by having the host Activity or parent Fragment implement IterableInboxToolbarBackListener.
    • Custom(layoutRes) — inflates the integrator's own toolbar layout. Views tagged with the reserved ids @id/iterable_reserved_inbox_toolbar_action and @id/iterable_reserved_inbox_toolbar_title are auto-wired to the SDK's back handler and title binding respectively. Both ids are optional.
    • Configure programmatically via IterableInboxFragment.newInstance(...) (new 2-arg and 6-arg overloads) or via IterableInboxActivity intent extras (TOOLBAR_OPTION / TOOLBAR_TITLE).
    • Requires the host activity to use a Theme.AppCompat descendant when the toolbar is enabled.
  • Added appAlreadyRunning field to trackPushOpen. New trackPushOpen(int, int, String, boolean, JSONObject) overload sends the value through; existing overloads default to false.

Fixed

  • Fixed a TransactionTooLargeException crash when displaying in-app messages with oversized HTML payloads. The HTML is no longer serialized into the fragment's saved instance state; it is reloaded from storage on recreation. In-apps with missing HTML now dismiss gracefully without registering tracking events, and a warning is logged for HTML payloads exceeding the recommended size.

3.8.0

Choose a tag to compare

@joaodordio joaodordio released this 27 May 23:39
6b4dc1a

What's new

  • Better control over how in-app messages interact with system bars via the new IterableInAppDisplayMode config option (FORCE_EDGE_TO_EDGE default, FOLLOW_APP_LAYOUT, FORCE_FULLSCREEN, FORCE_RESPECT_BOUNDS). Use this to fix close buttons hidden behind the status bar in fullscreen in-apps. No action required for existing apps.
  • Polished embedded card views with a configurable imageScaleType, proper 16:9 image aspect ratio, correct card sizing, button spacing, and rounded-corner image clipping. IterableEmbeddedViewConfig parameters now have sensible defaults.

Fixed

  • ConcurrentModificationException crash during device token registration.
  • NoSuchMethodException crash on Android 5–10 from an unsupported Map.of() call.

Removed

  • Legacy AES/CBC/PKCS5Padding encryption path in IterableDataEncryptor. The SDK now uses AES/GCM/NoPadding exclusively. Only impacted Android versions below API 19, which haven't been supported since minSdkVersion 21.

Full Changelog: 3.7.0...3.8.0

3.7.0

Choose a tag to compare

@joaodordio joaodordio released this 31 Mar 17:11
6e8509a

Fixed

  • Replaced the deprecated AsyncTask-based push notification handling with WorkManager for improved reliability and compatibility with modern Android versions. No action is required.
  • Fixed lost event tracking and missed API calls with an auto-retry feature for JWT token failures.
  • Added onEmbeddedMessagingSyncSucceeded() and onEmbeddedMessagingSyncFailed() callbacks to IterableEmbeddedUpdateHandler for monitoring embedded message sync results.

Full Changelog: 3.6.6...3.7.0

3.6.6

Choose a tag to compare

@franco-zalamena-iterable franco-zalamena-iterable released this 12 Mar 11:57
ce8b322

Fixed

  • Fixed push notifications killing the existing activity when opened
  • Fixed in-app message crash caused by WebView creation issues
  • Fixed BROADCAST_CLOSE_SYSTEM_DIALOGS permission error on Android 12+ by restricting usage to Android SDK 30 and below

3.6.5

Choose a tag to compare

@franco-zalamena-iterable franco-zalamena-iterable released this 13 Feb 17:36
3a0ac5c

Fixed

  • Fixed IterableEmbeddedView not having an empty constructor and causing crashes
  • Fixed custom actions not working in background when SDK is not initialized
  • Fixed double callback problem for setEmail with auto push registration

3.6.4

Choose a tag to compare

@joaodordio joaodordio released this 29 Jan 12:06
a336b3a

Fixed

  • Updated customPayload of In-App Messages to be @Nullable

Added

  • Made isIterableDeepLink method public

3.6.3

Choose a tag to compare

@Ayyanchira Ayyanchira released this 03 Dec 23:40
ae4f949

Fixed

  • Improved in-app message sizing and positioning calculations for better stability and performance, especially during device orientation changes

3.6.2

Choose a tag to compare

@Ayyanchira Ayyanchira released this 31 Oct 20:42
fbf54f7

Added

  • Added background initialization support to prevent ANRs during app startup. Use IterableApi.initializeInBackground() instead of initialize() to run initialization on a background thread while automatically queuing API calls until ready. See README for implementation details.
  • Added IterableApi.onSDKInitialized() callback method to subscribe to initialization completion from multiple places in your app.
  • Added setWebViewBaseUrl() configuration option to IterableConfig to support CORS for self-hosted custom fonts and external resources in WebView-based messages (in-app, inbox, embedded messages).

3.6.1

Choose a tag to compare

@joaodordio joaodordio released this 03 Oct 10:10
1a5cb2c

Added

  • Added edge-to-edge support for in-app messages to ensure proper display on devices with notches, cutouts, and system bars. Test your in-app messages on various devices to ensure optimal display.

Note

⚠️ Important: The system applies white insets by default, which may contrast with dark-themed apps. Marketers can control the visual appearance using the background overlay option in the Iterable UI to choose appropriate background colors that work well with their app's theme.