Nutrient Android SDK 11.3.1 release notes
RSS9 Apr 2026
Nutrient Android SDK 11.3.1 converts PopupToolbarMenuItem from a mutable Java class to an immutable Kotlin data class. This provides structural equality, copy() support, and a cleaner API with default parameter values.
This is a source-breaking change for code that uses PopupToolbarMenuItem setters. Refer to the migration guide below for details on updating your code.
This release also fixes several ANRs, improves redaction stability and performance for complex documents, and resolves issues with annotation rendering and Instant attachment downloads. For the full list of changes, refer to our changelog.
UI improvements
- The popup toolbar now supports showing both icons and text in menu items.
- Text selection and annotation selection animation timing has been unified for smoother transitions.
Bug fixes
This release addresses several crashes, rendering issues, and performance regressions.
UI
- Fixed an ANR caused by eager WebView initialization in
PdfReaderView. - Fixed a visual mismatch where multiline free text annotations appeared shorter when selected than when unselected.
- Fixed an ANR when selecting free text annotations on large documents.
- Fixed an issue where tapping to dismiss the annotation popup incorrectly toggled immersive mode.
- Fixed layout issues in the popup toolbar expanded list where items could overflow their configured width.
Model
- Improved PDF redaction stability and memory usage for complex documents with nested shared forms and repeated standard-font parsing, reducing cases where applying redactions could consume excessive memory or fail to complete.
- Improved performance for PDFs with large content streams.
- Fixed a potential ANR and
windowRecomposerwarning when page views are composed before being attached during page injection. - Fixed flattened annotations losing their blend mode, causing freeform highlights to appear opaque after export.
- Fixed garbled text on non-redacted pages when the document uses shared font resources across pages.
- Fixed a SIGABRT crash caused by the evaluation terminator when the SDK was auto-initialized without a license key. Passing a
nulllicense key no longer activates trial mode — use an empty string instead.
Instant
- Fixed a race condition where concurrent Instant attachment download completions could fail.
Migration guide
This section covers source-breaking changes in this release and how to update your code.
PopupToolbarMenuItem is now a Kotlin data class
PopupToolbarMenuItem has been converted from a mutable Java class with multiple constructors and setters to an immutable Kotlin data class with default parameter values.
What changed
- All properties are now
val(immutable). Setters likesetTintColor(),setIconRes(),setIconDrawable(),setEnabled(), andsetShowIconAndText()have been removed. - The three Java constructors have been replaced by a single constructor with default values.
equals(),hashCode(),toString(), andcopy()are now automatically generated by the data class.
New constructor signature
data class PopupToolbarMenuItem( @IdRes val id: Int, @StringRes val title: Int, @DrawableRes val iconRes: Int = 0, val isEnabled: Boolean = true, val iconDrawable: Drawable? = null, @ColorInt val tintColor: Int = 0, val isShowIconAndText: Boolean = false,)Constructors — no changes needed
Existing constructor calls continue to work without modification:
// Two-arg (text-only item) — unchanged.PopupToolbarMenuItem(R.id.my_item, R.string.my_title)
// Four-arg (icon + enabled) — unchanged.PopupToolbarMenuItem(R.id.my_item, R.string.my_title, R.drawable.my_icon, true)The removed three-arg Java constructor PopupToolbarMenuItem(id, title, isEnabled) must now use a named parameter:
// Before (Java-style three-arg constructor).PopupToolbarMenuItem(R.id.my_item, R.string.my_title, false)
// After.PopupToolbarMenuItem(R.id.my_item, R.string.my_title, isEnabled = false)Migrating setter calls
Since all properties are now immutable, set values at construction time using named parameters.
Tint color:
// Before.PopupToolbarMenuItem( R.id.delete, R.string.delete, R.drawable.ic_delete, true,).apply { tintColor = Color.RED }
// After.PopupToolbarMenuItem( R.id.delete, R.string.delete, R.drawable.ic_delete, tintColor = Color.RED,)Icon drawable:
// Before.val item = PopupToolbarMenuItem(R.id.picker, R.string.picker, 0, true)item.iconDrawable = myDrawable
// After.val item = PopupToolbarMenuItem( R.id.picker, R.string.picker, isEnabled = true, iconDrawable = myDrawable,)Show icon and text:
// Before.PopupToolbarMenuItem( R.id.note, R.string.note, R.drawable.ic_note, true,).apply { isShowIconAndText = true }
// After.PopupToolbarMenuItem( R.id.note, R.string.note, R.drawable.ic_note, isShowIconAndText = true,)Modifying items after creation
Use copy() to create a modified copy instead of mutating in place:
val original = PopupToolbarMenuItem(R.id.my_item, R.string.my_title)val disabled = original.copy(isEnabled = false)val tinted = original.copy(tintColor = Color.RED)Java interop
All getter methods remain unchanged — getId(), getTitle(), getIconRes(), isEnabled(), getIconDrawable(), getTintColor(), and isShowIconAndText() continue to work from Java code. Setter methods are no longer available; pass all values at construction time or use copy() from Kotlin.