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

# Version 9.1.1 Changelog (October 14, 2021)

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

Version: 9.1.1.78619

Release Date: October 14, 2021

## New features

* Adds support for nested OCG layers

| Normal state                                                                                                                                                                                                                                    | Disabled state                                                                                                                                                                                                                                  |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-5e48a2e973230bf2bfb526467bddd00ea1aa0887%2Fce74ed4df201ffd2d2b917cb3691e8ea131be586-500x1056.png?alt=media) | ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-b3db7b1da28e26fe6e9d72208c7dd7f60baf2f43%2F29db886af0df4d29f8a8695f0013464226782e30-500x1055.png?alt=media) |

* Adds support for moving annotations between pages, turn on with [`setMoveAnnotationBetweenPages`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ToolManagerBuilder.html#setMoveAnnotationBetweenPages\(boolean\))

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-565f525e81be5081234de0d6cc1af7fb386cd17a%2F0c2994fcd46da280ba924fb1d10abd2cdf572b9d-600x1233.gif?alt=media)

* Cropping dialog UX updates

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-71a5fdede2581087fd151ace31f64db1b75692a3%2F37873f5729a54dc15d1bcffe7ae5b10e8c0a29e1-500x1055.png?alt=media)

* Viewer scrollbar UX updates
* Adds ability to allow users enter password to remote PDF documents
* Adds ability to scroll with 1 finger when in sticky note, free text, sound and file attachment tool creation mode
* Adds ability to collapse all nodes in outline UI
* Outline UI now respects bold/italic flags on each node
* New API to specify [edit modes](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/collab/ui/viewer/CollabViewerBuilder2.html#usingAnnotationManagerEditMode\(com.pdftron.pdf.tools.AnnotManager.EditPermissionMode\)) and [undo modes](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/collab/ui/viewer/CollabViewerBuilder2.html#usingAnnotationManagerUndoMode\(com.pdftron.pdf.PDFViewCtrl.AnnotationManagerMode\)) for collaboration viewer
* New API to [reload user bookmarks](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/controls/PdfViewCtrlTabHostBaseFragment.html#reloadUserBookmarks\(\)) list after importing bookmarks JSON

## Fixed

* Fixed issue where links clicked in reflow mode would not go through the intercept callback
* Fixed issue where user bookmark events trigger after lifecycle events in certain situations
* Fixed issue where long press on read-only fields would not show long press menu
* Fixed issue where saving identical copy would not work with non-PDF documents
* Fixed issue where internal link jumping behaves strangely in vertical reflow mode
* Fixed issue where free text custom fonts would not appear correctly on remote client in collaboration mode
* Fixed issue where empty rich text still gets created
* Fixed issue where adding images through long press menu would not work in certain situations
* Fixed issue where undo button would show up twice in certain situations
* Fixed incorrect layout and theme in signature related UI

## APIs

### PDFViewCtrlTools package

#### ToolManagerBuilder

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

#### AnnotationsAdapter

*new* class: `AnnotationsAdapter`

*new* constructor: `AnnotationsAdapter(ArrayList<AnnotationInfo>, boolean, RecyclerView, PDFViewCtrl, AnalyticsEventListener)`

*new* method: `void addAll(List<AnnotationInfo>)`

*new* method: `void clear()`

*new* method: `AnnotationInfo getItem(int)`

*new* method: `int getItemCount()`

*new* method: `ArrayList<AnnotationInfo> getItems()`

*new* method: `ArrayList<AnnotationInfo> getItemsOnPage(int)`

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

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

*new* method: `boolean remove(AnnotationInfo)`

*new* method: `void removeAll(List<AnnotationInfo>)`

*new* method: `void replaceAll(List<AnnotationInfo>)`

#### AnnotationsAdapter.ViewHolder

*new* class: `ViewHolder`

*new* constructor: `ViewHolder(AnnotationsAdapter, View)`

*new* field: `ImageView icon`

*new* field: `TextView line1`

*new* field: `TextView line2`

*new* field: `TextView separator`

*new* method: `void onCreateContextMenu(ContextMenu, View, ContextMenuInfo)`

#### OutlineDialogFragment

*modified* class: `OutlineDialogFragment`

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

#### PdfViewCtrlTabBaseFragment

*new* static final field: `String BUNDLE_TAB_ANNOTATION_MANAGER_EDIT_MODE`

*new* static final field: `String BUNDLE_TAB_ANNOTATION_MANAGER_UNDO_MODE`

*new* method: `void showBackAndForwardButtons()`

*removed* static final field: `String BUNDLE_TAB_ANNOTATION_MANAGER_MODE`

#### PdfViewCtrlTabFragment2

*removed* method: `void startSeekBarTimer()`

*removed* method: `void stopSeekBarTimer()`

#### PdfViewCtrlTabHostBaseFragment

*new* method: `void reloadUserBookmarks()`

*new* method: `void showUserCropDialog(PDFViewCtrl)`

#### ReflowControl

*new* method: `void setReflowUrlLoadedListener(ReflowUrlLoadedListener)`

#### ReflowUrlLoadedListener

*new* interface: `ReflowUrlLoadedListener`

*new* method: `boolean onReflowExternalUrlLoaded(WebView, String)`

*new* method: `boolean onReflowInternalUrlLoaded(WebView, String)`

#### ReflowPagerAdapter

*new* method: `void setReflowUrlLoadedListener(ReflowUrlLoadedListener)`

#### UserBookmarkDialogFragment

*new* method: `void loadBookmarks()`

#### UserCropApplyDialogFragment

*new* class: `UserCropApplyDialogFragment`

*new* constructor: `UserCropApplyDialogFragment()`

*new* static final field: `String BUNDLE_IS_EVEN`

*new* static final field: `Integer OPTION_ALL_PAGES`

*new* static final field: `Integer OPTION_EDITED_PAGE`

*new* static final field: `Integer OPTION_ODD_OR_EVEN_PAGES`

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

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

*new* method: `void setUserCropApplyDialogListener(UserCropApplyDialogListener)`

#### UserCropApplyDialogListener

*new* interface: `UserCropApplyDialogListener`

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

#### UserCropDialogFragment

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

*removed* static method: `UserCropDialogFragment newInstance(boolean, boolean)`

*removed* method: `void setImageToCropBitmap(Bitmap)`

#### BookmarksDialogFragment

*new* method: `Fragment getCurrentFragment()`

#### PdfLayer

*new* class: `PdfLayer`

*new* constructor: `PdfLayer(Group, String, Boolean, boolean, int, PdfLayer)`

*new* method: `Boolean getChecked()`

*new* method: `ArrayList<PdfLayer> getChildren()`

*new* method: `Group getGroup()`

*new* method: `int getLevel()`

*new* method: `String getName()`

*new* method: `PdfLayer getParent()`

*new* method: `boolean hasChildren()`

*new* method: `Boolean isChecked()`

*new* method: `boolean isEnabled()`

*new* method: `boolean isLocked()`

*new* method: `void setChecked(Boolean)`

*new* method: `void setChildren(ArrayList<PdfLayer>)`

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

*new* method: `void setGroup(Group)`

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

*new* method: `void setName(String)`

*new* method: `void setParent(PdfLayer)`

#### PdfLayerDialogFragment

*new* class: `PdfLayerDialogFragment`

*new* constructor: `PdfLayerDialogFragment()`

*new* method: `boolean isEmpty()`

*new* static method: `PdfLayerDialogFragment newInstance()`

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

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

*new* method: `View onCreateView(LayoutInflater, ViewGroup, Bundle)`

*new* method: `void onDestroyView()`

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

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

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

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

*new* method: `PdfLayerDialogFragment setPdfViewCtrl(PDFViewCtrl)`

#### PdfLayerUtils

*modified* static method: `ArrayList<LayerInfo> getLayers(PDFViewCtrl, PDFDoc)`

|       | Declaration                                                                   |
| ----- | ----------------------------------------------------------------------------- |
| From: | public static ArrayList getLayers(PDFViewCtrl, PDFDoc) throws PDFNetException |
| To:   | public static ArrayList getLayers(PDFViewCtrl, PDFDoc) throws PDFNetException |

#### LayerInfo

*removed* class: `LayerInfo`

*removed* field: `boolean checked`

*removed* field: `Group group`

#### PdfLayerView

*new* method: `void setup(ArrayList<PdfLayer>)`

*removed* method: `void setup(ArrayList<LayerInfo>)`

#### PdfLayerViewAdapter

*new* constructor: `PdfLayerViewAdapter(ArrayList<PdfLayer>)`

*removed* constructor: `PdfLayerViewAdapter(ArrayList<LayerInfo>)`

*modified* method: `LayerInfo getItem(int)`

|       | Declaration                   |
| ----- | ----------------------------- |
| From: | public LayerInfo getItem(int) |
| To:   | public PdfLayer getItem(int)  |

#### EditListAdapter

*new* method: `void commitEditing()`

#### FreeTextInfo

*removed* constructor: `FreeTextInfo(int, int, String)`

*removed* method: `void setFont(Context, PDFViewCtrl)`

*modified* static method: `void setFont(PDFViewCtrl, FreeText, String)`

|       | Declaration                                                                                        |
| ----- | -------------------------------------------------------------------------------------------------- |
| From: | public static void setFont(PDFViewCtrl, FreeText, String) throws JSONException, PDFNetException    |
| To:   | public static boolean setFont(PDFViewCtrl, FreeText, String) throws JSONException, PDFNetException |

#### AnnotManager

*new* method: `EditPermissionMode getEditMode()`

*new* method: `AnnotationManagerMode getUndoMode()`

*removed* method: `AnnotationManagerMode getMode()`

#### AnnotManager.EditPermissionMode

*new* final class: `EditPermissionMode`

*new* static final field: `EditPermissionMode EDIT_OTHERS`

*new* static final field: `EditPermissionMode EDIT_OWN`

*new* static method: `EditPermissionMode valueOf(String)`

*new* static method: `EditPermissionMode[] values()`

#### ToolManager

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

*new* method: `boolean isMoveAnnotationBetweenPages()`

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

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

#### PdfViewCtrlSettingsManager

*removed* static method: `boolean getShowScrollbarOption(Context)`

*removed* static method: `void setShowScrollbarOption(Context, boolean)`

#### UserCropUtilities

*new* static method: `void removeUserCrop(PDFDoc)`

*new* static method: `Completable removeUserCropAsync(PDFDoc)`

#### ButtonId

*new* static final field: `ButtonId MORE`

#### BookmarkNode

*new* method: `int getFontStyle()`

#### PdfLayerNode

*new* class: `PdfLayerNode`

*new* constructor: `PdfLayerNode(PdfLayer)`

*new* static final field: `String PLACEHOLDER_TAG`

*new* field: `boolean mIsOpen`

*new* field: `boolean mIsSelected`

*new* method: `int getLayoutId()`

*new* method: `PdfLayer getPdfLayer()`

*new* method: `String getTitle()`

*new* method: `boolean isOpen()`

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

#### PdfLayerNodeBinder

*new* class: `PdfLayerNodeBinder`

*new* constructor: `PdfLayerNodeBinder(PdfLayerNodeClickListener)`

*new* method: `void bindView(ViewHolder, int, TreeNode)`

*new* method: `void bindView(ViewHolder, int, TreeNode)`

*new* method: `int getLayoutId()`

*new* method: `ViewHolder provideViewHolder(View)`

### pdftron-collab package

#### CollabViewerBuilder2

*new* method: `CollabViewerBuilder2 usingAnnotationManagerEditMode(EditPermissionMode)`

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

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


---

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