> For the complete documentation index, see [llms.txt](https://docs.apryse.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.apryse.com/android/changelogs/version-9/v9-0-0.md).

# Version 9.0.0 Changelog (April 20, 2021)

World's #1 PDF SDK Library for Web, Mobile, Server, Desktop

Version: 9.0.0.77656

Release Date: April 20, 2021

## New features

* Lasso tool now supports splitting ink annotation by strokes

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-298cb112ed27cf38a0571e1d89388ef9d3452b2c%2F23c5381ed305ad69cc8bd266617311ebb6553efb-410x862.gif?alt=media)

* New optional [compact toolbar UI](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#useCompactViewer\(boolean\)) with single line instead of two lines

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-549929a9bd2e1237f96bcb369871eb959772d2e3%2Fea3b26715791b516c983efc9e4b73d81f4bc6b67-540x1110.png?alt=media)

* New admin mode for collaboration viewer, available modes are: [`AnnotationManagerMode.ADMIN_UNDO_OWN`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/PDFViewCtrl.AnnotationManagerMode.html) and [`AnnotationManagerMode.ADMIN_UNDO_OTHERS`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/PDFViewCtrl.AnnotationManagerMode.html)
* Theme revamp: most of the viewer components now come with a theme that can be modified in your application, check out theme guide here: [Customize the viewer's theme](/android/ui-customization/custom-theme-a.md)
* Compile SDK version and target SDK version have been updated to API 30
* Adds ability to change annotation style properties when using group selection tools (rectangle selection and lasso selection)
* New text diffing showcase sample

## Notes

This release of Apryse for Android brings the core PDF functionality inline with version 9.0.0 of the Apryse cross-platform APIs. More information can be found on [What's new for cross-platform APIs](/core/changelogs/version-9/9-0-0.md). All none-module related changes apply to Android.

## Fixed

* Fixed issue where search redaction edit text does not respond to keyboard enter key
* Fixed issue where adding freetext in RTL does not generate correct appearance
* Fixed issue where the document viewer does not work in navigation component
* Fixed issue where annotation list button is visible in reply dialog when it is disabled in config
* Fixed issue where bottom bar items are not centered
* Fixed issue where tool buttons such as add page, page redact, search redact are missing from favorite toolbar editor
* Fixed issue where search redaction does not work on documents with invalid sections
* Fixed issue where movement is not allowed when using multi-select on annotation types such as stamp
* Fixed issue where long press does not work when using stylus as pen mode for smart pen

## APIs

### PDFViewCtrlTools package

#### BaseViewerBuilderImpl

*new* method: `BaseViewerBuilderImpl usingAnnotationManagerMode(AnnotationManagerMode)`

#### ViewerConfig.Builder

*new* method: `Builder showDocumentSlider(boolean)`

*new* method: `Builder useCompactViewer(boolean)`

#### AnnotStyleDialogFragment.Builder

*new* method: `Builder setGroupAnnotTypes(ArrayList<AnnotStyle>)`

#### AnnotStyleView

*new* method: `void setGroupAnnotStyles(ArrayList<AnnotStyle>)`

#### AnnotationDialogFragment

*new* static final field: `String BUNDLE_ANNOTATION_FILTER_ICON`

*new* method: `int getAnnotationFilterIcon()`

*new* method: `void setAnnotationFilterIcon(int)`

#### PdfViewCtrlTabBaseFragment

*new* static final field: `String BUNDLE_TAB_ANNOTATION_MANAGER_MODE`

*new* method: `void addPageStackListener(PageStackListener)`

*new* method: `BookmarksDialogFragment getBookmarksNavigationList()`

*new* method: `ExternalFileInfo getExportUriDirectory()`

*new* method: `void handlePrintAnnotationSummary()`

*new* method: `boolean isExportDirectoryContentUri()`

*new* method: `void removePageStackListener(PageStackListener)`

*removed* method: `void addAnnotationToolbarListener(AnnotationToolbarListener)`

*removed* method: `void removeAnnotationToolbarListener(AnnotationToolbarListener)`

#### PdfViewCtrlTabBaseFragment.PageStackListener

*new* interface: `PageStackListener`

*new* method: `void onPostJumpPageBack(Deque<PageBackButtonInfo>, Deque<PageBackButtonInfo>)`

*new* method: `void onPostJumpPageForward(Deque<PageBackButtonInfo>, Deque<PageBackButtonInfo>)`

*new* method: `boolean onPreJumpPageBack(Deque<PageBackButtonInfo>, Deque<PageBackButtonInfo>)`

*new* method: `boolean onPreJumpPageForward(Deque<PageBackButtonInfo>, Deque<PageBackButtonInfo>)`

#### PdfViewCtrlTabFragment

*new* method: `void addAnnotationToolbarListener(AnnotationToolbarListener)`

*new* method: `void removeAnnotationToolbarListener(AnnotationToolbarListener)`

#### PdfViewCtrlTabHostFragment2

*new* method: `void addOnPreBuildToolbarListener(OnPreBuildToolbarListener)`

*new* method: `void handleToolSwitcherClicked(View)`

*new* method: `void onConfigurationChanged(Configuration)`

*new* method: `void onSystemUiVisibilityChange(int)`

*new* method: `void removeOnPreBuildToolbarListener(OnPreBuildToolbarListener)`

*new* method: `void setViewerOverlayUIVisible(boolean)`

#### PdfViewCtrlTabHostFragment2.OnPreBuildToolbarListener

*new* interface: `OnPreBuildToolbarListener`

#### PdfViewCtrlTabHostFragment2.OnToolbarChangedListener

*removed* method: `void onToolbarChanged(String)`

*modified* interface: `OnToolbarChangedListener`

|       | Declaration                                                                |
| ----- | -------------------------------------------------------------------------- |
| From: | public interface OnToolbarChangedListener                                  |
| To:   | public interface OnToolbarChangedListener extends OnToolbarChangedListener |

#### BookmarksDialogFragment

*new* method: `void updateAnnotationFilterIcon(int)`

#### AnnotationFilterDialogFragment

*removed* field: `Fragment parentFragment`

#### DiffUtils

*new* static method: `PDFDoc getPdfDoc(Context, Uri)`

#### TabSwitcherAdapter

*new* constructor: `TabSwitcherAdapter(Context)`

*removed* constructor: `TabSwitcherAdapter()`

#### ToolbarSwitcherButtonTheme

*new* constructor: `ToolbarSwitcherButtonTheme(int, int, int)`

*new* final field: `int backgroundColorCompact`

*removed* constructor: `ToolbarSwitcherButtonTheme(int, int)`

#### ToolbarSwitcherCompactButton

*new* class: `ToolbarSwitcherCompactButton`

*new* constructor: `ToolbarSwitcherCompactButton(Context)`

*new* constructor: `ToolbarSwitcherCompactButton(Context, AttributeSet)`

*new* constructor: `ToolbarSwitcherCompactButton(Context, AttributeSet, int)`

*new* constructor: `ToolbarSwitcherCompactButton(Context, AttributeSet, int, int)`

#### ToolbarSwitcherAdapter

*new* class: `ToolbarSwitcherAdapter`

*new* method: `int getItemCount()`

*new* method: `void onBindViewHolder(ViewHolder, int)`

*new* method: `void onBindViewHolder(ToolbarSwitcherViewHolder, int)`

*new* method: `ViewHolder onCreateViewHolder(ViewGroup, int)`

*new* method: `void setToolbarSwitcherState(ToolbarSwitcherState)`

#### ToolbarSwitcherViewHolder

*new* class: `ToolbarSwitcherViewHolder`

*new* constructor: `ToolbarSwitcherViewHolder(View)`

#### ToolbarSwitcherDialogTheme

*new* constructor: `ToolbarSwitcherDialogTheme(int, int, int, int, int)`

*new* final field: `int selectedIconColor`

*removed* constructor: `ToolbarSwitcherDialogTheme(int, int, int, int)`

#### AnnotStyle

*new* static final field: `int CUSTOM_ADD_PAGE`

*new* static final field: `int CUSTOM_PAGE_REDACTION`

*new* static final field: `int CUSTOM_SEARCH_REDACTION`

#### AnnotStyleProperty

*new* method: `boolean canShowBorderEffect()`

*new* method: `AnnotStyleProperty setCanShowBorderEffect(boolean)`

#### AnnotManager

*new* method: `AnnotationManagerMode getMode()`

*removed* constructor: `AnnotManager(ToolManager, String, AnnotationSyncingListener)`

*removed* constructor: `AnnotManager(ToolManager, String, String, Bundle, AnnotationSyncingListener)`

*removed* constructor: `AnnotManager(ToolManager, String, String, AnnotationSyncingListener)`

#### ToolManager

*new* method: `void enableAnnotManager(String, String, AnnotationManagerMode, AnnotationSyncingListener)`

*new* static method: `ToolModeBase getDefaultToolModeBase(ToolModeBase)`

*new* method: `EdgeEffectListener getEdgeEffectListener()`

*new* method: `void setEdgeEffectListener(EdgeEffectListener)`

*removed* method: `void enableAnnotManager(String, String, Bundle, AnnotationSyncingListener)`

#### ToolManager.EdgeEffectListener

*new* interface: `EdgeEffectListener`

*new* method: `boolean onPreDrawEdgeEffects(Canvas, int, int)`

*new* method: `void onPrePullEdgeEffects(int, float)`

*new* method: `void onPreReleaseEdgeEffects()`

#### AnnotUtils

*new* static final field: `String KEY_INK_LIST`

#### AnnotationFilterOptionAdapter

*new* constructor: `AnnotationFilterOptionAdapter(Context, Theme)`

*removed* constructor: `AnnotationFilterOptionAdapter()`

#### PdfViewCtrlSettingsManager

*new* static final field: `String KEY_PREF_STYLUS_AS_PEN`

*new* static method: `boolean getDrawWithFinger(Context)`

*new* static method: `void setDrawWithFinger(Context, boolean)`

*removed* static final field: `String DEFAULT_STYLUS_TOOL_MODE`

#### PressureInkUtils

*new* static method: `void eraseSubPath(Ink, int)`

#### Utils

*new* static method: `void applyPrimaryTextTintToButton(ImageView)`

*new* static method: `void applySecondaryTextTintToButton(ImageView)`

*new* static method: `int getPrimaryTextColor(Context)`

*new* static method: `int getSecondaryTextColor(Context)`

#### ViewerUtils

*new* static method: `void keepOnScreenAfterClick(Context, MenuItem)`

#### AutoScrollEditText

*new* method: `boolean getIsRTL()`

#### PresetBarComponent

*new* method: `void setCompactMode(boolean)`

#### PresetBarTheme

*new* constructor: `PresetBarTheme(int, int, int, int, int, int)`

*new* final field: `int expandIconColor`

*removed* constructor: `PresetBarTheme(int, int, int, int, int)`

#### PresetActionButton

*new* method: `void setBackgroundWidth(int)`

*new* method: `void setExpandStyleIconColor(int)`

#### PresetBarView

*new* method: `void setCompactMode(boolean)`

*new* method: `void updateTheme()`

#### AnnotationToolbarBuilder

*new* method: `AnnotationToolbarBuilder addCustomSelectableLeadingStickyButton(int, int, int)`

*new* method: `AnnotationToolbarBuilder addLeadingCustomStickyButton(int, int, int)`

*new* method: `AnnotationToolbarBuilder addLeadingToolStickyButton(ToolbarButtonType, int)`

*new* method: `AnnotationToolbarBuilder addToolLeadingStickyButton(ToolbarButtonType, int)`

*new* method: `AnnotationToolbarBuilder addToolStickyOptionButton(ToolbarButtonType, int)`

*new* method: `List<ToolbarItem> getLeadingStickyToolbarItems()`

*new* method: `AnnotationToolbarBuilder removeToolLeadingStickyButton(int)`

#### ToolbarButtonType

*new* static final field: `ToolbarButtonType ADD_PAGE`

*new* static final field: `ToolbarButtonType NAVIGATION`

*new* static final field: `ToolbarButtonType PAGE_REDACTION`

*new* static final field: `ToolbarButtonType SEARCH_REDACTION`

*new* static final field: `ToolbarButtonType TOOLBAR_SWITCHER`

#### ToolbarItem

*new* constructor: `ToolbarItem(String, ToolbarButtonType, int, boolean, boolean, int, int, int, boolean, int)`

*new* constructor: `ToolbarItem(String, ToolbarButtonType, int, boolean, boolean, int, int, int, int)`

*new* final field: `boolean hasOption`

*new* method: `void setIcon(int)`

*new* method: `void setVisible(boolean)`

*removed* constructor: `ToolbarItem(String, ToolbarButtonType, int, boolean, int, int, int, boolean, int)`

*modified* final field: `int icon`

|       | Declaration           |
| ----- | --------------------- |
| From: | public final int icon |
| To:   | public int icon       |

*modified* final field: `boolean isVisible`

|       | Declaration                    |
| ----- | ------------------------------ |
| From: | public final boolean isVisible |
| To:   | public boolean isVisible       |

#### AnnotationToolbarComponent

*new* method: `void addOnPreBuildToolbarListener(OnPreBuildToolbarListener)`

*new* method: `void addOnToolbarChangedListener(OnToolbarChangedListener)`

*new* method: `void addToolbarActionsRightOptionalContainer(View)`

*new* method: `AppCompatButton buildRedactionApplyButton()`

*new* method: `void removeOnPreBuildToolbarListener(OnPreBuildToolbarListener)`

*new* method: `void removeOnToolbarChangedListener(OnToolbarChangedListener)`

*new* method: `void setCompactMode(boolean)`

*new* method: `void setEmptyToolText(int)`

*new* method: `void setEmptyToolTextOnClickListener(OnClickListener)`

*new* method: `void setEmptyToolTextVisible(boolean)`

*new* method: `void setNavigationIcon(int)`

*new* method: `void setNavigationIconProperty(int, int)`

*new* method: `void setNavigationIconVisible(boolean)`

*new* method: `void setToolRegionVisible(boolean)`

*new* method: `void setToolbarHeight(int)`

#### AnnotationButtonClickListener

*new* method: `boolean onInterceptItemClick(ToolbarItem, MenuItem)`

*new* method: `void onPostItemClick(ToolbarItem, MenuItem)`

*new* method: `void onPreItemClick(ToolbarItem, MenuItem)`

*removed* method: `boolean onInterceptItemClick(MenuItem)`

*removed* method: `void onPostItemClick(MenuItem)`

*removed* method: `void onPreItemClick(MenuItem)`

#### AnnotationToolbarTheme

*new* constructor: `AnnotationToolbarTheme(int, int, int, int, int, int, int, int, int, int, int)`

*new* field: `int backgroundColorCompact`

*new* field: `int dividerColor`

*new* final field: `int highlightIconColor`

*removed* constructor: `AnnotationToolbarTheme(int, int, int, int, int, int, int, int, int)`

*removed* final field: `int editMenuButton`

#### DefaultToolbars

*new* static field: `AnnotationToolbarBuilder defaultAnnotateToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultDrawToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultFavoriteToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultFillAndSignToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultInsertToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultMeasureToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultPensToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultPrepareFormToolbarCompact`

*new* static field: `AnnotationToolbarBuilder defaultRedactionToolbarCompact`

#### ButtonId

*new* static final field: `ButtonId NAVIGATION`

#### TabletAnnotationToolbarComponent

*new* constructor: `TabletAnnotationToolbarComponent(Fragment, FragmentManager, AnnotationToolbarViewModel, PresetBarViewModel, ToolManagerViewModel, AnnotationToolbarView, boolean)`

*new* method: `void setCompactMode(boolean)`

*new* method: `void setTabletMode(boolean)`

*removed* constructor: `TabletAnnotationToolbarComponent(Fragment, FragmentManager, AnnotationToolbarViewModel, PresetBarViewModel, ToolManagerViewModel, AnnotationToolbarView)`

#### ToolbarSharedPreferences

*new* static method: `Observable<Boolean> clearToolbarItemsInDb(Context, String)`

*new* method: `AnnotationToolbarBuilder getCompactAnnotateToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactDrawToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactFavoriteToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactFillAndSignToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactInsertToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactMeasureToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactPensToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactPrepareFormToolbar(Context)`

*new* method: `AnnotationToolbarBuilder getCompactRedactToolbar(Context)`

*modified* static method: `void updateToolbarItemsInDb(Context, String, String, List<MenuEditorItem>, boolean)`

|       | Declaration                                                                             |
| ----- | --------------------------------------------------------------------------------------- |
| From: | public static void updateToolbarItemsInDb(Context, String, String, List, boolean)       |
| To:   | public static Observable updateToolbarItemsInDb(Context, String, String, List, boolean) |

#### ActionButton

*new* method: `boolean hasOption()`

*new* method: `void setHasOption(boolean)`

#### ActionToolbar

*new* method: `void addOnButtonLongClickListener(OnLongClickListener)`

*new* method: `void addToolbarActionsRightOptionalContainer(View)`

*new* method: `void setCompactMode(boolean)`

*new* method: `void setEmptyToolText(int)`

*new* method: `void setEmptyToolTextOnClickListener(OnClickListener)`

*new* method: `void setEmptyToolTextVisible(boolean)`

*new* method: `void setNavigationIcon(int)`

*new* method: `void setNavigationIconProperty(int, int)`

*new* method: `void setNavigationIconVisible(boolean)`

*new* method: `void setToolRegionVisible(boolean)`

*removed* static field: `boolean AUTO_PAD_TOOLBAR`

#### AnnotationToolbarView

*new* method: `void addOnButtonLongClickListener(OnLongClickListener)`

*new* method: `void addToolbarActionsRightOptionalContainer(View)`

*new* method: `void setCompactMode(boolean)`

*new* method: `void setEmptyToolText(int)`

*new* method: `void setEmptyToolTextOnClickListener(OnClickListener)`

*new* method: `void setEmptyToolTextVisible(boolean)`

*new* method: `void setNavigationIcon(int)`

*new* method: `void setNavigationIconProperty(int, int)`

*new* method: `void setNavigationIconVisible(boolean)`

*new* method: `void setToolRegionVisible(boolean)`

*new* method: `void setToolbarHeight(int)`

*new* method: `void updateTheme()`

#### SingleButtonToolbar

*new* method: `void inflateDefaultEditToolbar(ToolMode)`

*new* method: `void setCompactMode(boolean)`

#### TabActionButtonTheme

*new* class: `TabActionButtonTheme`

*new* constructor: `TabActionButtonTheme(int, int)`

*new* final field: `int iconColor`

*new* final field: `int textColor`

*new* static method: `TabActionButtonTheme fromContext(Context)`

#### ToolbarButton

*new* method: `boolean hasOption()`

*new* method: `void setHasOption(boolean)`

#### ToolbarItemDao

*new* constructor: `ToolbarItemDao()`

*new* method: `void clearAndInsertAll(String, )`

*removed* method: `void delete()`

*removed* method: `void update()`

*modified* interface: `ToolbarItemDao`

|       | Declaration                          |
| ----- | ------------------------------------ |
| From: | public interface ToolbarItemDao      |
| To:   | public abstract class ToolbarItemDao |

#### ToolbarItemDao\_Impl

*new* method: `void clearAndInsertAll(String, )`

*removed* method: `void delete()`

*removed* method: `void update()`

*modified* final class: `ToolbarItemDao_Impl`

|       | Declaration                                                       |
| ----- | ----------------------------------------------------------------- |
| From: | public final class ToolbarItemDao\_Impl implements ToolbarItemDao |
| To:   | public final class ToolbarItemDao\_Impl extends ToolbarItemDao    |

### pdfnet-demo-utils package

#### FileBrowserTheme

*new* class: `FileBrowserTheme`

*new* final field: `int contentBodyTextColor`

*new* final field: `int contentSecondaryTextColor`

*new* final field: `int emptyTextBackground`

*new* final field: `int headerBackgroundColor`

*new* final field: `int headerChevronColor`

*new* final field: `int headerTextColor`

*new* final field: `int iconColor`

*new* final field: `int itemDividerColor`

*new* static method: `FileBrowserTheme fromContext(Context)`

#### BaseFileAdapter

*new* static method: `int getFolderIconColor(Context)`

#### MiscUtils

*removed* static method: `void keepOnScreenAfterClick(Context, MenuItem)`

### pdftron-collab package

#### ReplyHeaderUIView

*new* method: `void setAnnotationListIcon(boolean)`

#### BaseHeaderUIView

*new* abstract method: `void setAnnotationListIcon(boolean)`

#### ReplyHeader

*new* constructor: `ReplyHeader(Context, Annot, boolean, boolean)`

*new* constructor: `ReplyHeader(String, String, int, int, float, boolean, boolean, AnnotReviewState)`

*new* method: `boolean hasAnnotationList()`

*removed* constructor: `ReplyHeader(Context, Annot, boolean)`

*removed* constructor: `ReplyHeader(String, String, int, int, float, boolean, AnnotReviewState)`

#### CollabViewerBuilder2

*new* method: `CollabViewerBuilder2 usingAnnotationManagerMode(AnnotationManagerMode)`

#### CollabTabListener

*new* method: `void onUpdateUndoRedoState()`

#### CollabViewerTabHostFragment2

*new* method: `void onUpdateUndoRedoState()`


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.apryse.com/android/changelogs/version-9/v9-0-0.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
