From 1fd841cb92da722aa71399d326eea23e386745b8 Mon Sep 17 00:00:00 2001 From: Jena Date: Tue, 6 Oct 2026 18:27:18 -0500 Subject: [PATCH 1/2] fix: skip setRead when the in-app message is no longer queued Passing a missing message into the Android SDK crashes the app with a NullPointerException. --- .../iterable/reactnative/RNIterableAPIModuleImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java index b25432d4b..3e266b224 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java @@ -301,7 +301,14 @@ public void execute(@Nullable Uri url) { public void setReadForMessage(String messageId, boolean read) { IterableLogger.v(TAG, "setReadForMessage"); - IterableApi.getInstance().getInAppManager().setRead(RNIterableInternal.getMessageById(messageId), read); + IterableInAppMessage message = RNIterableInternal.getMessageById(messageId); + + if (message == null) { + IterableLogger.d(TAG, "Failed to get in-app for message ID: " + messageId); + return; + } + + IterableApi.getInstance().getInAppManager().setRead(message, read); } public void removeMessage(String messageId, double location, double deleteSource) { From e49a57a55cbc6869cb5630cc3e954bac87cd3428 Mon Sep 17 00:00:00 2001 From: Jena Date: Wed, 7 Oct 2026 09:42:33 -0500 Subject: [PATCH 2/2] docs: add the 3.2.1 changelog for the Android setRead crash fix --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d423c1936..f244d4cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 3.2.1 + +### Fixes + +- Fixed an Android crash when marking an in-app message as read after that message was no longer in the native queue. + - `setReadForMessage` logs and returns when the message id is missing, matching the iOS bridge. The Android bridge was passing that missing message into `IterableInAppManager.setRead`, which threw a `NullPointerException` and killed the app process. + ## 3.2.0 ### Updates