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

# Version 9.1.0 Changelog (September 8, 2021)

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

Version: 9.1.0.78529

Release Date: September 8, 2021

## New features

* Adds support for custom font / stroke color / thickness / fill color / opacity in the freetext with rich content

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

* Adds support for adding and modifying text markup annotations in the reader (reflow) mode (Nougat+)

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-5d328d9c973e80db4ec454ec0da628751e0dca2c%2Fd5c23fd95f2d7ba2eedba01579d928d3e0387a5b-338x714.gif?alt=media)

* Adds ability to search in the user bookmarks, outline and annotations list

| Search in Annotation List                                                                                                                                                                                                                       | Search in Outline                                                                                                                                                                                                                               | Search in User Bookmarks                                                                                                                                                                                                                        |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-a6acdcf4a1a2ad27bb9071260bb40f97af435544%2F93b433e47521277758cca2620a80d38597cac5a1-540x1140.png?alt=media) | ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-9edfa01b1de4a503bab63990a9059b94b42dca79%2F0e187c2e1f713e025e27f7990281d241b29044cf-540x1140.png?alt=media) | ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-9b19b603aa33635ef2e45ad1ba2bb1a860384a5c%2Fe4c847f860523d2f2dd0fb00054b80d5e2e6094a-540x1140.png?alt=media) |

* Adds support for floating signature on top of a widget so it is recognized as associated with the widget
* New API to [hide individual save copy options](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#hideSaveCopyOptions\(int\)) menu
* New API to [hide annotation review state](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#showAnnotationReplyReviewState\(boolean\))
* New API to [hide annotation of certain type](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#excludeAnnotationListTypes\(int\)) in the annotation list
* New API to [add selectable button](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#bottomBarBuilder\(com.pdftron.pdf.widget.bottombar.builder.BottomBarBuilder\)) to the bottom bar
* New API to [hide preset bar](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#hidePresetBars\(com.pdftron.pdf.widget.toolbar.builder.ToolbarButtonType\)) for certain tools

## Dependency changes

* AndroidX libs are updated from `1.0.0` to `1.2.0`
* `com.google.android.material:material` is updated from `1.0.0` to `1.4.0`
* `androidx.constraintlayout:constraintlayout` is updated from `1.1.3` to `2.1.0`

## Notes

This release of Apryse for Android brings the core PDF functionality inline with version 9.1.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-1-0.md). All none-module related changes apply to Android.

## Fixed

* Matches Web behaviour where the first comment by the same author is added as comment instead of reply
* Fixes issue where annotation without ID in XFDF does not appear in the collaboration viewer
* Fixes issue where grouped annotations do not show copy option
* Fixes issue where toolbars have extra padding when fullscreenModeEnabled is false
* Various fixes for the outline UI

## APIs

### PDFViewCtrlTools package

#### HtmlPostProcessColorTask

*removed* class: `HtmlPostProcessColorTask`

*removed* constructor: `HtmlPostProcessColorTask(Context, String)`

*removed* method: `void setCallback(Callback)`

*removed* method: `void setOnPostProcessColorListener(OnPostProcessColorListener)`

#### HtmlPostProcessColorTask.Callback

*removed* interface: `Callback`

*removed* method: `void onPostProcessColorFinished(HtmlPostProcessColorTask, String)`

#### LoadFontAsyncTask

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

#### PopulateUserBookmarkListTask

*new* constructor: `PopulateUserBookmarkListTask(Context, String, Bookmark, boolean, String)`

*removed* constructor: `PopulateUserBookmarkListTask(Context, String, Bookmark, boolean)`

#### ToolManagerBuilder

*new* method: `ToolManagerBuilder setFreeTextFontsFromAssets(String[])`

*new* method: `ToolManagerBuilder setFreeTextFontsFromStorage(String[])`

#### ViewerConfig

*new* method: `int[] getExcludedAnnotationListTypes()`

*new* method: `int[] getHideSaveCopyOptions()`

*new* method: `int[] getPresetBarsToHide()`

*new* method: `boolean isShowAnnotationReplyReviewState()`

#### ViewerConfig.Builder

*new* method: `Builder excludeAnnotationListTypes(int[])`

*new* method: `Builder hidePresetBars(ToolbarButtonType[])`

*new* method: `Builder hideSaveCopyOptions(int[])`

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

#### AnnotStyleView

*new* method: `void setFontListFromAsset(Set<String>)`

*new* method: `void setFontListFromStorage(Set<String>)`

#### AnnotationDialogFragment

*new* static final field: `String BUNDLE_ANNOTATION_TYPE_EXCLUDE_LIST`

*new* method: `String getQueryText()`

*new* method: `boolean handleBackPress()`

*new* method: `void initOptionsMenu(Menu)`

*new* method: `void onPause()`

*new* method: `boolean onQueryTextChange(String)`

*new* method: `boolean onQueryTextSubmit(String)`

*new* method: `void resetAnnotationListSearchFilter()`

*modified* class: `AnnotationDialogFragment`

|       | Declaration                                                                                               |
| ----- | --------------------------------------------------------------------------------------------------------- |
| From: | public class AnnotationDialogFragment extends NavigationListDialogFragment                                |
| To:   | public class AnnotationDialogFragment extends NavigationListDialogFragment implements OnQueryTextListener |

#### OutlineDialogFragment

*new* static final field: `String BUNDLE_CREATE_BUTTON`

*new* static final field: `String BUNDLE_EDIT_BUTTON`

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

*new* method: `String getQueryText()`

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

*new* method: `boolean onQueryTextChange(String)`

*new* method: `boolean onQueryTextSubmit(String)`

*new* method: `void onResume()`

*new* method: `void prepareOutlineSearch(Menu)`

*new* method: `void resetBookmarkListFilter()`

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

*removed* method: `void exitEditMode()`

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

*modified* class: `OutlineDialogFragment`

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

#### PdfViewCtrlTabBaseFragment

*new* method: `String getFileName(boolean, String)`

*new* method: `void handleViewSelectedFileAttachment(File, ExternalFileInfo, Uri)`

#### SaveFolderWrapper

*new* constructor: `SaveFolderWrapper(PdfViewCtrlTabBaseFragment, Uri)`

*new* method: `Uri getTargetUri()`

*removed* method: `String getFileName(boolean, String)`

#### ReflowControl

*new* method: `void setAnnotStyleProperties(HashMap<Integer, AnnotStyleProperty>)`

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

#### ReflowPagerAdapter

*new* method: `boolean isEditingEnabled()`

*new* method: `void setAnnotStyleProperties(HashMap<Integer, AnnotStyleProperty>)`

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

*removed* method: `void RequestHandlerProc(JobRequestResult, String, Object)`

*modified* class: `ReflowPagerAdapter`

|       | Declaration                                                                                                  |
| ----- | ------------------------------------------------------------------------------------------------------------ |
| From: | public class ReflowPagerAdapter extends PagerAdapter implements ReflowWebViewCallback,RequestHandlerCallback |
| To:   | public class ReflowPagerAdapter extends PagerAdapter implements ReflowWebViewCallback                        |

#### ReflowAppCallback

*new* interface: `ReflowAppCallback`

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

*new* method: `void onCleanSelectedAnnot()`

#### ReflowAppInterface

*new* class: `ReflowAppInterface`

*new* static final field: `String sName`

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

*new* method: `void cleanSelectedAnnot()`

*new* method: `String setAnnot(String, int)`

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

#### UserBookmarkDialogFragment

*new* method: `String getQueryText()`

*new* method: `boolean handleBackPress()`

*new* method: `boolean onQueryTextChange(String)`

*new* method: `boolean onQueryTextSubmit(String)`

*new* method: `void prepareOptionsMenu(Menu)`

*new* method: `void resetBookmarkListFilter()`

*modified* class: `UserBookmarkDialogFragment`

|       | Declaration                                                                                                 |
| ----- | ----------------------------------------------------------------------------------------------------------- |
| From: | public class UserBookmarkDialogFragment extends NavigationListDialogFragment                                |
| To:   | public class UserBookmarkDialogFragment extends NavigationListDialogFragment implements OnQueryTextListener |

#### BookmarksDialogFragment

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

#### AnnotationListUtil

*new* static method: `Observable<List<AnnotationInfo>> from(PDFViewCtrl, ArrayList<Integer>)`

*new* static method: `AnnotationInfo toAnnotationInfo(Annot, Page, TextExtractor, ArrayList<Integer>)`

*removed* static method: `Observable<List<AnnotationInfo>> from(PDFViewCtrl)`

*removed* static method: `AnnotationInfo toAnnotationInfo(Annot, Page, TextExtractor)`

#### ReflowAnnotEditAdapter

*new* class: `ReflowAnnotEditAdapter`

*new* constructor: `ReflowAnnotEditAdapter(List<ReflowAnnotEditItem>)`

*new* method: `int getItemCount()`

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

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

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

#### ReflowAnnotEditBottomSheetDialog

*new* class: `ReflowAnnotEditBottomSheetDialog`

*new* constructor: `ReflowAnnotEditBottomSheetDialog(Context)`

*new* static final field: `int ITEM_DELETE`

*new* static final field: `int ITEM_STYLE`

*new* method: `void setOnItemClickListener(OnItemClickListener)`

#### ReflowAnnotEditItem

*new* class: `ReflowAnnotEditItem`

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

*new* method: `int getIcon()`

*new* method: `int getTitle()`

#### FontResource

*new* static final field: `String FONT_FOLDER`

*new* static method: `Single<Set<String>> writeFontAssetsToCache(Context, Set<String>)`

*new* static method: `Single<Set<String>> writeFontFileToCache(Context, Set<String>)`

#### AnnotEdit

*new* method: `void setupAnnotProperty(AnnotStyle)`

#### ToolManager

*new* method: `Set<String> getFreeTextFontsFromAssets()`

*new* method: `Set<String> getFreeTextFontsFromStorage()`

*new* method: `void setFreeTextFontsFromAssets(Set<String>)`

*new* method: `void setFreeTextFontsFromStorage(Set<String>)`

#### AnnotUtils

*new* static method: `void createCustomFreeTextAppearance(View, PDFViewCtrl, Annot, int, Rect, boolean, AnnotStyle)`

*new* static method: `void createRCFreeTextAppearance(PTRichEditor, PDFViewCtrl, Annot, int, AnnotStyle)`

*new* static method: `Annot getAssociatedAnnotation(PDFViewCtrl, SignatureWidget, int)`

*removed* static method: `void createRCFreeTextAppearance(PTRichEditor, PDFViewCtrl, Annot, int)`

#### BookmarkManager

*new* static method: `ArrayList<Bookmark> getBookmarkListByTitle(PDFDoc, String, boolean)`

*new* static method: `List<UserBookmarkItem> getPdfBookmarks(Bookmark, String)`

*new* static method: `List<UserBookmarkItem> getPdfBookmarks(PDFDoc, String)`

*new* static method: `List<UserBookmarkItem> getUserBookmarks(Context, String, String)`

#### InlineEditText

*new* method: `void setFontResource(FontResource)`

#### ReflowWebView

*new* method: `void finishActionMode()`

*new* method: `void setTextSelectionCallback(TextSelectionCallback)`

*new* method: `ActionMode startActionMode(Callback)`

*new* method: `ActionMode startActionMode(Callback, int)`

#### TextSelectionCallback

*new* interface: `TextSelectionCallback`

*new* method: `boolean onMenuItemClick(WebView, MenuItem)`

#### RequestCode

*new* static final field: `int CREATE_FILE_IN_SYSTEM`

#### Utils

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

*removed* static method: `String getRealPathFromURI(Context, Uri)`

#### ViewerUtils

*new* static method: `void createFileIntent(Activity, Fragment, String, String)`

*new* static method: `String extractFileFromPortfolio(int, Context, PDFDoc, String, Uri, String)`

*new* static method: `Single<String> extractFileFromPortfolioDisposable(int, Context, PDFDoc, String, Uri, String)`

*removed* static method: `Single<String> extractFileFromPortfolioDisposable(int, Context, PDFDoc, String, String)`

#### AutoScrollEditText

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

*new* method: `void setSize(float, float)`

#### BottomBarBuilder

*new* method: `BottomBarBuilder addCustomSelectableButton(int, int, int)`

#### PresetBarComponent

*new* constructor: `PresetBarComponent(LifecycleOwner, FragmentManager, PresetBarViewModel, ToolManagerViewModel, PresetBarView, HashSet<ToolbarButtonType>)`

#### ToolbarButtonType

*removed* static final field: `ToolbarButtonType TOOLBAR_SWITCHER`

#### AnnotationToolbarComponent

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

#### TabletAnnotationToolbarComponent

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

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

#### ActionToolbar

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

#### AnnotationToolbarView

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

#### TreeViewAdapter

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

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

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

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

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

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

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

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

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

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

#### PTAREditText

*new* method: `void setFontResource(FontResource)`

*new* method: `void updateFont(FontResource)`

#### MyStyleSpan

*new* class: `MyStyleSpan`

*new* constructor: `MyStyleSpan(int)`

*new* method: `void updateDrawState(TextPaint)`

*new* method: `void updateMeasureState(TextPaint)`

#### MyTypefaceSpan

*new* constructor: `MyTypefaceSpan(Typeface, String)`

*new* static field: `String sFontPath`

*removed* constructor: `MyTypefaceSpan(Typeface)`

### pdftron-collab package

#### DataRepository

*new* method: `Flowable<AnnotationEntity> getAnnotation(String)`

#### AnnotationDao

*new* method: `Flowable<AnnotationEntity> getAnnotation(String)`

#### AnnotationDao\_Impl

*new* method: `Flowable<AnnotationEntity> getAnnotation(String)`

#### CustomServiceUtils

*new* static method: `String addLastXfdf(CollabDatabase, String, String)`

*removed* static method: `String addLastXfdf(CollabDatabase, String)`

#### AnnotationListUIComponent

*new* constructor: `AnnotationListUIComponent(ViewGroup, LifecycleOwner, AnnotationListViewModel, AnnotationViewModel, PDFViewCtrl, CollabAnnotationListSorter, ArrayList<Integer>)`

*removed* constructor: `AnnotationListUIComponent(ViewGroup, LifecycleOwner, AnnotationListViewModel, AnnotationViewModel, PDFViewCtrl, CollabAnnotationListSorter)`

#### ReplyHeaderUIView

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

#### ReplyUIViewModel

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

#### BaseHeaderUIView

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

#### ReplyHeader

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

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

*new* method: `boolean hasReviewState()`

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

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

#### XfdfUtils

*new* static method: `Pair<String, HashMap<String, AnnotationEntity>> parseAndProcessXfdf(String, String)`

*new* static method: `Pair<String, HashMap<String, AnnotationEntity>> parseAndProcessXfdfCommand(String, String)`

*new* static method: `String validateXfdf(String, String)`

*removed* static method: `HashMap<String, AnnotationEntity> parseXfdfCommand(String, String)`

#### ReplyViewModel

*new* method: `Flowable<AnnotationEntity> getParentAnnotation()`


---

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