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. ColorFilterColorTint).
  • 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 configuration
  • getAnnotationsForConfiguration() — 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 the setOverlaidAnnotationTypes() 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 MeasurementValueConfigurationEditor interface 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.
  • DeprecationsPdfFragment.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.AppCompat or its variants.
  • Apply these AppCompat-based themes to PdfActivity or when configuring PdfFragment.

You are not affected if:

  • You use the SDK’s provided PSPDFKit.Theme or PSPDFKit.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 themeMaterial Components equivalent
Theme.AppCompat.Light.NoActionBarTheme.MaterialComponents.Light.NoActionBar
Theme.AppCompat.Light.DarkActionBarTheme.MaterialComponents.Light.DarkActionBar
Theme.AppCompat.NoActionBarTheme.MaterialComponents.NoActionBar
Theme.AppCompatTheme.MaterialComponents
Theme.AppCompat.LightTheme.MaterialComponents.Light
Theme.AppCompat.DayNight.NoActionBarTheme.MaterialComponents.DayNight.NoActionBar

Additional considerations

You may encounter styling issues after migrating to Material Components themes:

  1. Color attributes — Material Components uses the Material Design color system. You may need to update color attributes like colorPrimary, colorSecondary, colorSurface, etc.
  2. Shape theming — Material Components includes shape theming. If shapes appear different, you can customize them using Material’s shape attributes.
  3. 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): Int

After:

suspend fun getUsageCount(configuration: MeasurementValueConfiguration): Int

getAnnotationsForConfiguration()

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__settingsModeLineSeparatorStyle
  • pspdf__settingsModeSectionTitleStyle
  • pspdf__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:

  1. 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 types
    pdfFragment.setOverlaidAnnotationTypes(EnumSet.of(AnnotationType.INK, AnnotationType.CIRCLE))
    // Or enable for all supported types
    pdfFragment.setOverlaidAnnotationTypes(EnumSet.allOf(AnnotationType::class.java))
  2. 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.