---
title: "Nutrient Android SDK 11.4 release notes"
canonical_url: "https://www.nutrient.io/guides/android/releases/11-4/"
md_url: "https://www.nutrient.io/guides/android/releases/11-4.md"
last_updated: "2026-05-30T02:20:01.169Z"
description: "Release notes for Nutrient Android SDK 11.4, including progressive page rendering and a new Material 3 loading indicator."
---

28 Apr 2026

Nutrient Android SDK 11.4 introduces progressive page rendering: Page content is rendered in parts, so portions of the page appear as soon as they’re ready instead of waiting for the entire page to finish. This is most noticeable on very large or complex pages — for example, detailed floor plans — where some paths and shapes show up first while the rest of the page continues to render. The legacy per-page loading throbber is replaced by a thin Material 3 progress bar at the bottom of the page and fragment, exposed as the new `LoadingIndicatorStyle` configuration.

This release also deprecates the multithreaded rendering toggle (rendering is now always multithreaded) and renames the fixed-resolution render configuration to better reflect what it controls under progressive rendering.

These changes include source-breaking API changes. Refer to the [migration guide](#migration-guide) below for details on updating your code.

This release contains several additional fixes and enhancements. For the full list of changes, refer to our [changelog](https://www.nutrient.io/guides/android/changelog.md#11.4.0).

## UI improvements

- Pages now render progressively. Page content is split into parts so portions of the page appear as they’re ready rather than waiting for the entire page to finish — most noticeable on very large or complex pages such as detailed floor plans, where some paths and shapes appear before others.

- The per-page and fragment-level loading throbbers have been replaced with a thin Material 3 progress bar. The new `LoadingIndicatorStyle` configuration exposes color, track color, and height customization.

- The electronic signature tool now matches the iOS SDK behavior. The signature dialog opens immediately when the tool is activated, and the signature is placed at the center of the visible page area.

## Bug fixes

This release addresses issues in both the user interface and underlying model layer.

### UI

- Improved Samsung keyboard handling to prevent spaces from being swallowed after Korean text composition during content editing.

- Fixed fonts configured via `pspdf__outlineViewStyle` not being applied to the `PdfOutlineView`.

- Fixed missing rounded corners on the vertical floating annotation toolbar when it contains only a single item.

- Fixed a visual artifact (ghost/shadow) that appeared on annotations immediately after creation.

- Fixed annotation creation mode being exited when changing the current page via the thumbnail bar.

- Fixed double-tap word selection and long-press text selection inside a newly created free text annotation.

### Model

- Fixed Multiply and Overlay blend modes rendering too dark in DeviceCMYK transparency groups.

- Fixed content editing where bold or italic was only applied to part of a selection when the embedded subset font didn’t cover every selected character. Fallback glyphs are now rendered in the requested weight or style instead of regular.

- Fixed applying redactions producing burned overlay text that didn’t honor the configured redaction font size.

- Fixed corrupted rendering of indexed JPEG2000 image tiles in clipped renders.

- Fixed incorrect text selection and highlighting for ligatures in some PDFs.

---

## Migration guide

This section covers source-breaking changes in this release and how to update your code.

### Loading indicator replaces loading drawable

The per-page and fragment-level loading throbbers have been replaced by a thin Material 3 linear progress bar at the bottom of the page and fragment. The drawable-based configuration has been removed and replaced by a new `LoadingIndicatorStyle` configuration.

#### Removed methods

| Removed method                                               | Replacement                                                |
| ------------------------------------------------------------ | ---------------------------------------------------------- |
| `PdfConfiguration.Builder.loadingProgressDrawable()`         | `PdfConfiguration.Builder.loadingIndicatorStyle()`         |
| `PdfActivityConfiguration.Builder.loadingProgressDrawable()` | `PdfActivityConfiguration.Builder.loadingIndicatorStyle()` |

#### What to remove from your code

- **Custom loading `Drawable` instances** passed to `loadingProgressDrawable()` — Remove these. The new progress bar is configured with colors and a height instead of a drawable.

- **References to `loadingProgressDrawable` in custom configurations** — Replace with `loadingIndicatorStyle` and a `LoadingIndicatorStyle` instance.

**Before:**

```kotlin

val configuration = PdfActivityConfiguration.Builder(context).loadingProgressDrawable(myCustomLoadingDrawable).build()

```

**After:**

```kotlin

val configuration = PdfActivityConfiguration.Builder(context).loadingIndicatorStyle(
        LoadingIndicatorStyle(
            color = Color.BLUE,
            trackColor = Color.LTGRAY,
            heightDp = 2,
        )
    ).build()

```

If you don’t need to customize the indicator, omit the call and the SDK will use defaults from your theme.

### Multithreaded rendering is always enabled

Multithreaded rendering is now always on. The toggle that previously allowed disabling it has been deprecated and the document loader overloads that took the toggle have been removed.

#### Deprecated (still available)

- `PdfConfiguration.Builder#setMultithreadedRenderingEnabled(Boolean)`

- `PdfActivityConfiguration.Builder#setMultithreadedRenderingEnabled(Boolean)`

- `PdfConfiguration#isMultithreadedRenderingEnabled`

These will be removed in a future version. Remove calls to them — the value is ignored, and rendering always runs multithreaded.

#### Removed document loader overloads

The `PdfDocumentLoader` overloads that accepted a `multithreadedRenderingEnabled` argument have been removed. Use the overloads without that argument.

| Removed                                                                                 | Replacement                                              |
| --------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `PdfDocumentLoader.openDocument(context, source, multithreadedRenderingEnabled)`        | `PdfDocumentLoader.openDocument(context, source)`        |
| `PdfDocumentLoader.openDocuments(context, sources, multithreadedRenderingEnabled)`      | `PdfDocumentLoader.openDocuments(context, sources)`      |
| `PdfDocumentLoader.openDocumentAsync(context, source, multithreadedRenderingEnabled)`   | `PdfDocumentLoader.openDocumentAsync(context, source)`   |
| `PdfDocumentLoader.openDocumentsAsync(context, sources, multithreadedRenderingEnabled)` | `PdfDocumentLoader.openDocumentsAsync(context, sources)` |

**Before:**

```kotlin

val document = PdfDocumentLoader.openDocument(context, source, false)

```

**After:**

```kotlin

val document = PdfDocumentLoader.openDocument(context, source)

```

### setFixedLowResRenderPixelCount renamed to setFixedFullPageRenderPixelCount

With progressive rendering in place, the configuration value previously called `FixedLowResRenderPixelCount` now controls the full-page render and has been renamed to better reflect that.

| Old name                                                    | New name                                                      |
| ----------------------------------------------------------- | ------------------------------------------------------------- |
| `PdfConfiguration.Builder#setFixedLowResRenderPixelCount()` | `PdfConfiguration.Builder#setFixedFullPageRenderPixelCount()` |

| `PdfConfiguration#getFixedLowResRenderPixelCount()`         | `PdfConfiguration#getFixedFullPageRenderPixelCount()`         |

**Before:**

```kotlin

val configuration = PdfConfiguration.Builder().setFixedLowResRenderPixelCount(2_000_000).build()

val pixels = configuration.fixedLowResRenderPixelCount

```

**After:**

```kotlin

val configuration = PdfConfiguration.Builder().setFixedFullPageRenderPixelCount(2_000_000).build()

val pixels = configuration.fixedFullPageRenderPixelCount

```

The semantics of the value are unchanged.
---

## Related pages

- [10 7](/guides/android/releases/10-7.md)
- [10 6](/guides/android/releases/10-6.md)
- [10 10 1](/guides/android/releases/10-10-1.md)
- [10 10](/guides/android/releases/10-10.md)
- [10 8](/guides/android/releases/10-8.md)
- [11 0](/guides/android/releases/11-0.md)
- [11 1](/guides/android/releases/11-1.md)
- [11 3 1](/guides/android/releases/11-3-1.md)
- [10 9](/guides/android/releases/10-9.md)
- [11 2](/guides/android/releases/11-2.md)
- [11 3](/guides/android/releases/11-3.md)
- [11 5](/guides/android/releases/11-5.md)

