Nutrient Android SDK 10.9 release notes
21 November 2025
Nutrient Android SDK 10.9 focuses on theming system refinements, enhanced styling documentation, and continued performance improvements.
Key highlights include the requirement for Material Components themes (replacing legacy AppCompat themes), comprehensive theming attribute cleanup with removal of unused styles, measurement API improvements with suspend functions, and extensive documentation updates for previously undocumented styling options.
This release contains several fixes and enhancements. For the full list of changes, refer to our changelog.
Material Components theme requirement
Starting with Nutrient Android SDK 10.9, the theme used for SDK activities and fragments must inherit from a Material Components theme (e.g. Theme.MaterialComponents.Light.NoActionBar) rather than a legacy AppCompat theme (e.g. Theme.AppCompat.Light.NoActionBar).
Your application can use any theme you prefer. Only the theme specifically applied to PdfActivity or PdfFragment needs to be Material Components-based. If you use the SDK’s provided PSPDFKit.Theme or already use a Material Components theme for the SDK, no action is required.
For migration instructions, refer to the theme requirement changes section in the migration guide.
Theme and styling improvements
This release focuses on refining and documenting the SDK’s theming system:
- Attribute cleanup — Removed unused styling attributes that were declared but never used in the codebase, reducing confusion and maintenance burden.
- Naming consistency — Renamed attributes to follow Android naming conventions (e.g.
ColorFilter→ColorTint). - Comprehensive documentation — Added documentation for many previously undocumented styling attributes, including AI Assistant, content editing, audio annotations, and UI component styles.
- Improved styling guide — Updated the appearance styling guide with complete attribute references and usage examples.
For detailed migration steps, refer to the theme and styling changes section in the migration guide.
Measurement value configuration improvements
The MeasurementValueConfigurationEditor interface has been updated to better support asynchronous operations. Two methods that query annotation usage have been converted to suspend functions:
getUsageCount()— Returns the number of annotations using a specific measurement configurationgetAnnotationsForConfiguration()— Returns a list of all annotations using a specific measurement configuration
These methods now require calling from a coroutine context. For migration details, refer to the measurement API changes section in the migration guide.
Deprecations
This release deprecates the following APIs:
PdfFragment.setOverlaidAnnotations()— This method has been deprecated and is currently a no-op (it doesn’t perform any operation). It’ll be removed in a future release. Note that by default, most annotation types are now rendered in overlay mode, so you typically won’t need to customize this behavior. If you do need control over the annotation overlay, use thesetOverlaidAnnotationTypes()API to configure which annotation types should be rendered in overlay mode. If you require fine-grained control to set individual annotations in overlay mode, contact Support(opens in a new tab) to discuss alternative solutions.
For migration details, refer to the deprecations section in the migration guide.
Additional improvements
This release includes several other enhancements:
- ANR fixes — Fixed Application Not Responding (ANR) on complex documents. If you encounter any ANRs, please contact Support(opens in a new tab) for assistance.
- Bug fixes — Various stability and performance improvements throughout the SDK.
- Dependency updates — Updated dependencies to their latest versions for better compatibility and security.
- Documentation polish — Improved clarity and completeness across API documentation and guides.
Migration guide
This section provides technical details about API changes, breaking changes, and migration steps required when upgrading to Nutrient Android SDK 10.9.
API changes
This release includes the following API updates:
- Theme requirement — Application themes must now inherit from Material Components themes rather than AppCompat themes. Refer to the Material Components theme requirement section for migration details.
- Measurement configuration API — Two methods in the
MeasurementValueConfigurationEditorinterface have been converted to suspend functions. Refer to the measurement API changes section for migration details. - Theming and styling — Removed unused styling attributes and updated documentation. Refer to the theme and styling changes section for details.
- Deprecations —
PdfFragment.setOverlaidAnnotations()has been deprecated and is now a no-op. Refer to the deprecations section for details.
Material Components theme requirement
Starting with Nutrient Android SDK 10.9, the theme used for SDK activities and fragments must inherit from a Material Components theme instead of a legacy AppCompat theme. This ensures proper styling and compatibility with modern Android UI components used by the SDK.
Your application can use any theme you prefer. Only the theme specifically applied to PdfActivity or PdfFragment (via the activity’s theme in the manifest or programmatically via PdfConfiguration) needs to be Material Components-based.
Who is affected?
This change only affects applications that:
- Created custom themes for use with the SDK based on
Theme.AppCompator its variants. - Apply these AppCompat-based themes to
PdfActivityor when configuringPdfFragment.
You are not affected if:
- You use the SDK’s provided
PSPDFKit.ThemeorPSPDFKit.Theme.Dark(these already use Material Components). - Your SDK theme already inherits from a Material Components theme (e.g.
Theme.MaterialComponents.Light.NoActionBar). - Your main application uses an AppCompat theme but you use a Material Components theme for the SDK.
Migration steps
If the theme you use for the SDK currently inherits from an AppCompat theme, update it to inherit from the corresponding Material Components theme.
Before:
<style name="MyApp.Theme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Your custom attributes --> <item name="pspdf__mainToolbarStyle">@style/MyApp.MainToolbar</item> <item name="colorPrimary">@color/my_primary</item></style>After:
<style name="MyApp.Theme" parent="Theme.MaterialComponents.Light.NoActionBar"> <!-- Your custom attributes --> <item name="pspdf__mainToolbarStyle">@style/MyApp.MainToolbar</item> <item name="colorPrimary">@color/my_primary</item></style>Common theme migrations
| AppCompat theme | Material Components equivalent |
|---|---|
Theme.AppCompat.Light.NoActionBar | Theme.MaterialComponents.Light.NoActionBar |
Theme.AppCompat.Light.DarkActionBar | Theme.MaterialComponents.Light.DarkActionBar |
Theme.AppCompat.NoActionBar | Theme.MaterialComponents.NoActionBar |
Theme.AppCompat | Theme.MaterialComponents |
Theme.AppCompat.Light | Theme.MaterialComponents.Light |
Theme.AppCompat.DayNight.NoActionBar | Theme.MaterialComponents.DayNight.NoActionBar |
Additional considerations
You may encounter styling issues after migrating to Material Components themes:
- Color attributes — Material Components uses the Material Design color system. You may need to update color attributes like
colorPrimary,colorSecondary,colorSurface, etc. - Shape theming — Material Components includes shape theming. If shapes appear different, you can customize them using Material’s shape attributes.
- Dependency — Ensure your app includes the Material Components dependency:implementation 'com.google.android.material:material:1.9.0' // or newer
For more information about Material Components themes, refer to the Material Design documentation(opens in a new tab).
Measurement API changes
The MeasurementValueConfigurationEditor interface has been updated to improve performance when querying measurement annotation usage. The following two methods are now suspend functions and must be called from a coroutine context.
getUsageCount()
Before:
fun getUsageCount(configuration: MeasurementValueConfiguration): IntAfter:
suspend fun getUsageCount(configuration: MeasurementValueConfiguration): IntgetAnnotationsForConfiguration()
Before:
fun getAnnotationsForConfiguration(configuration: MeasurementValueConfiguration?): List<Annotation>After:
suspend fun getAnnotationsForConfiguration(configuration: MeasurementValueConfiguration?): List<Annotation>Migration
Update any code calling these methods to use them within a coroutine context.
Before:
val editor = pdfFragment.getMeasurementValueConfigurationEditor()val count = editor.getUsageCount(configuration)val annotations = editor.getAnnotationsForConfiguration(configuration)After:
val editor = pdfFragment.getMeasurementValueConfigurationEditor()
// Option 1: Using `lifecycleScope` in an Activity or Fragment.lifecycleScope.launch { val count = editor.getUsageCount(configuration) val annotations = editor.getAnnotationsForConfiguration(configuration) // Process results on main thread}
// Option 2: Using `coroutineScope` if already in a suspend function.suspend fun processConfiguration() { val count = editor.getUsageCount(configuration) val annotations = editor.getAnnotationsForConfiguration(configuration) // Process results.}If you need the results on the main thread, you can use withContext(Dispatchers.Main) after the suspend call, or the coroutine will automatically resume on the main thread when using lifecycleScope.
Theme and styling changes
Nutrient Android SDK 10.9 includes important updates to theming and styling attributes as part of ongoing maintenance and cleanup efforts.
Removed styling attributes
The following unused styling attributes have been removed from the SDK:
Settings mode styles — These attributes were declared but never used in the codebase:
pspdf__settingsModeLineSeparatorStylepspdf__settingsModeSectionTitleStylepspdf__settingsModeSectionLabelStyle
Action required: If you reference these attributes in your custom themes, simply remove them. They had no functionality, so their removal has no impact on your application.
New styling options
This release adds comprehensive documentation for previously undocumented styling attributes. Many new attributes have been added during recent releases to support features like AI Assistant, content editing, audio annotations, and more. For a complete list of all available styling options, refer to our updated appearance styling guide.
If you require additional customizations that aren't currently supported by the SDK’s theming system, contact Support(opens in a new tab) for assistance.
Deprecations
PdfFragment.setOverlaidAnnotations()
The PdfFragment.setOverlaidAnnotations() method has been deprecated in this release. This method is now a no-op (it doesn’t perform any operation) and will be removed in a future release.
Why was this deprecated?
This method provided fine-grained control over individual annotations in overlay mode, but its usage was limited and added complexity to the overlay system. Additionally, by default, most annotation types are now rendered in overlay mode, so customization is typically unnecessary. Most use cases are better served by configuring annotation types via setOverlaidAnnotationTypes().
Migration path
If you’re currently using setOverlaidAnnotations(), you have the following options:
Use
setOverlaidAnnotationTypes()instead — Configure which annotation types should be rendered in overlay mode. This is the recommended approach for most use cases:// Enable overlay mode for specific annotation typespdfFragment.setOverlaidAnnotationTypes(EnumSet.of(AnnotationType.INK, AnnotationType.CIRCLE))// Or enable for all supported typespdfFragment.setOverlaidAnnotationTypes(EnumSet.allOf(AnnotationType::class.java))Contact Support for fine-grained control — If you require fine-grained control to set individual annotations in overlay mode (not just by type), please contact Support(opens in a new tab). We can work with you to design an alternative solution that meets your specific requirements.
Action required
Remove any calls to setOverlaidAnnotations() from your code, as they currently have no effect. If you need overlay control, use setOverlaidAnnotationTypes() instead, or contact Support for assistance with more complex use cases.