> 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-2.md).

# Version 9.0.2 Changelog (July 21, 2021)

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

Version: 9.0.2.77870

Release Date: July 21, 2021

## New features

* Updated UX for `OutlineDialogFragment` and new ability to edit PDF outline

| Updated Outline Component                                                                                                                                                                                                                       | New Outline Editing                                                                                                                                                                                                                             |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-0dc9b3ee1285edce541c524a7b2dce6ac30f0504%2F892000578ab8c2ded1cd5b780c05348d863b5b71-540x1140.png?alt=media) | ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-c4f332f92759ce470dfb3a66a71cd1670b755730%2F6298319ae5bb15857800452e8800e6ea1a3c5d70-540x1140.png?alt=media) |

* New config to disable saving toolbar item ordering, see [`saveToolbarItemOrder`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#saveToolbarItemOrder\(boolean\))
* New config to disable tablet layout, see [`tabletLayoutEnabled`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#tabletLayoutEnabled\(boolean\))
* New config to disable conversion dialog for XOD files, see [`showConversionDialog`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#showConversionDialog\(boolean\))
* New config to disable open newly saved copy to new tab, [`openSavedCopyInNewTab`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#openSavedCopyInNewTab\(boolean\))
* New config to disable ink multi-stroke mode, see [`ToolManagerBuilder.setInkMultiStrokeEnabled`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ToolManagerBuilder.html#setInkMultiStrokeEnabled\(boolean\))
* Undo/redo option is now part of the default View toolbar

## Fixed

* Fixes issue where page number indicator would not show when scrollbar is not showing
* Fixes issue where search was still active when switching to reading mode
* Fixes issue where system status bar color was incorrect when annotation style dialog is showing
* Fixes issue where user bookmark changes were not committed right away
* Fixes issue where smart pen had inconsistent behaviour between markup and inking
* Fixes issue where conversion option was not used for content URI files
* Fixes issue where default eraser type was not actually used in the style picker
* Fixes issue where annotation modification event is raised for stamp rotation when no rotation was changed
* Improves performance when inflating the annoation toolbars

## APIs

### PDFViewCtrlTools package

#### ToolManagerBuilder

*new* method: `ToolManagerBuilder setInkMultiStrokeEnabled(boolean)`

#### ToolStyleConfig

*new* method: `EraserType getDefaultEraserType()`

*new* method: `void setDefaultEraserType(EraserType)`

#### ViewerConfig.Builder

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

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

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

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

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

#### NavigationListDialogFragment

*new* method: `boolean handleBackPress()`

#### OutlineDialogFragment

*new* static final field: `String BUNDLE_EDITING_ENABLED`

*new* method: `void enterEditMode()`

*new* method: `void exitEditMode()`

*new* method: `boolean handleBackPress()`

*new* method: `boolean isEditingEnabled()`

*new* method: `boolean isEmpty()`

*new* method: `boolean moveBookmarkSelected(Bookmark)`

*new* static method: `OutlineDialogFragment newInstance(boolean)`

*new* method: `boolean onClick(TreeNode<BookmarkNode>, ViewHolder)`

*new* method: `void onCreate(Bundle)`

*new* method: `void onDestroyView()`

*new* method: `void onExpandNode(TreeNode<BookmarkNode>, int)`

*new* method: `void onNodeCheckBoxSelected(TreeNode<BookmarkNode>, ViewHolder)`

*new* method: `boolean onOptionsItemSelected(MenuItem)`

*new* method: `void onPause()`

*new* method: `void onStartDrag(TreeNode<BookmarkNode>, int, ViewHolder)`

*new* method: `void onToggle(boolean, ViewHolder)`

*new* method: `void onViewCreated(View, Bundle)`

*modified* class: `OutlineDialogFragment`

|       | Declaration                                                                                                                                                  |
| ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| From: | public class OutlineDialogFragment extends NavigationListDialogFragment                                                                                      |
| To:   | public class OutlineDialogFragment extends NavigationListDialogFragment implements BookmarkNodeClickListener,OnTreeNodeListener,EditOutlineMoveClickListener |

#### ToolManager

*new* method: `void addPdfOutlineModificationListener(PdfOutlineModificationListener)`

*new* method: `boolean isInkMultiStrokeEnabled()`

*new* method: `void raisePdfOutlineModified()`

*new* method: `void removePdfOutlineModificationListener(PdfOutlineModificationListener)`

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

#### ToolManager.PdfOutlineModificationListener

*new* interface: `PdfOutlineModificationListener`

*new* method: `void onOutlineChanged()`

#### UndoRedoManager

*new* method: `void onOutlineChanged()`

*modified* class: `UndoRedoManager`

|       | Declaration                                                                                                                                                  |
| ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| From: | public class UndoRedoManager implements AnnotationModificationListener,PdfDocModificationListener,PdfTextModificationListener                                |
| To:   | public class UndoRedoManager implements AnnotationModificationListener,PdfDocModificationListener,PdfTextModificationListener,PdfOutlineModificationListener |

#### Utils

*new* static field: `boolean CHECK_ALL_FILES_ACCESS_PERMISSION`

*new* static method: `boolean isAndroidR()`

*new* static method: `boolean isBackupFolderFile(Context, File)`

*new* static method: `void validateContentResolver(ContentResolver, Uri)`

#### AnnotationToolbarComponent

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

#### ToolbarSharedPreferences

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

*new* static method: `void setLastUsedTool(Context, int)`

*removed* static method: `int getLastUsedTool(Context, String)`

*removed* static method: `void setLastUsedTool(Context, String, int)`

#### UndoActionButton

*new* class: `UndoActionButton`

*new* constructor: `UndoActionButton(Context)`

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

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

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

#### BookmarkNode

*new* class: `BookmarkNode`

*new* constructor: `BookmarkNode(Bookmark)`

*new* constructor: `BookmarkNode(PDFDoc, Bookmark)`

*new* static final field: `String PLACEHOLDER_TAG`

*new* field: `boolean mIsOpen`

*new* field: `boolean mIsSelected`

*new* method: `BookmarkNode commitAdd(BookmarkNode)`

*new* method: `BookmarkNode commitDelete()`

*new* method: `BookmarkNode commitMoveToNewParent(BookmarkNode)`

*new* method: `BookmarkNode commitMoveToNext(BookmarkNode)`

*new* method: `BookmarkNode commitMoveToPrev(BookmarkNode)`

*new* method: `BookmarkNode commitOpen()`

*new* method: `BookmarkNode commitRename()`

*new* method: `Bookmark getBookmark()`

*new* method: `int getLayoutId()`

*new* method: `int getPageNumber()`

*new* method: `String getTitle()`

*new* method: `boolean isOpen()`

*new* method: `BookmarkNode setOpen(boolean)`

*new* method: `BookmarkNode setPageNumber(int)`

*new* method: `BookmarkNode setTitle(String)`

#### EditOutlineMoveDialog

*new* class: `EditOutlineMoveDialog`

*new* constructor: `EditOutlineMoveDialog(int, ArrayList<Bookmark>, PDFViewCtrl, EditOutlineMoveClickListener, Bookmark)`

*new* method: `Dialog onCreateDialog(Bundle)`

#### TreeViewAdapter

*new* class: `TreeViewAdapter`

*new* constructor: `TreeViewAdapter(List<? extends TreeViewBinder>, PDFViewCtrl)`

*new* constructor: `TreeViewAdapter(List<TreeNode<BookmarkNode>>, List<? extends TreeViewBinder>, PDFViewCtrl, float)`

*new* method: `void addChildNode(TreeNode<BookmarkNode>, TreeNode<BookmarkNode>)`

*new* method: `int addChildNodes(TreeNode<BookmarkNode>, int)`

*new* static method: `void addPlaceHolderNode(TreeNode<BookmarkNode>)`

*new* method: `void addToRoot(TreeNode<BookmarkNode>)`

*new* static method: `List<TreeNode<BookmarkNode>> buildBookmarkTreeNodeList(PDFViewCtrl, Bookmark)`

*new* method: `void collapseAll()`

*new* method: `void collapseBrotherNode(TreeNode<BookmarkNode>)`

*new* method: `void collapseNode(TreeNode<BookmarkNode>)`

*new* method: `void disableEditOutline()`

*new* method: `void enableEditOutline()`

*new* method: `void expandAll(List<TreeNode<BookmarkNode>>)`

*new* method: `void expandAllNodes(TreeNode<BookmarkNode>)`

*new* method: `void expandNodes(List<TreeNode<BookmarkNode>>)`

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

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

*new* method: `TreeNode<BookmarkNode> findNode(Bookmark)`

*new* method: `Iterator<TreeNode<BookmarkNode>> getDisplayNodesIterator()`

*new* method: `int getExpandableStartPosition(TreeNode<BookmarkNode>)`

*new* method: `int getItemCount()`

*new* method: `long getItemId(int)`

*new* method: `int getItemViewType(int)`

*new* method: `int getSelectedPosition(TreeNode<BookmarkNode>)`

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

*new* method: `boolean isEditingOutline()`

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

*new* method: `void moveChildNode(TreeNode<BookmarkNode>, TreeNode<BookmarkNode>)`

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

*new* method: `void onBindViewHolder(ViewHolder, int, List<Object>)`

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

*new* method: `void onItemDrag(TreeNode<BookmarkNode>, int)`

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

*new* method: `void refresh(List<TreeNode<BookmarkNode>>)`

*new* method: `int removeChildNodes(TreeNode<BookmarkNode>, boolean)`

*new* method: `int removeNode(TreeNode<BookmarkNode>)`

*new* static method: `void setBookMarkTreeNode(PDFViewCtrl, TreeNode<BookmarkNode>)`

*new* method: `void setItems(List<TreeNode<BookmarkNode>>)`

*new* method: `void setOnTreeNodeListener(OnTreeNodeListener)`

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

*new* method: `void setTheme(Theme)`


---

# 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-2.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.
