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

# Version 9.2.1 Changelog (March 21, 2022)

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

Version: 9.2.1.79400

Release Date: March 21, 2022

## New features

* Updated UX for signature flow

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

* New free text rotation

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

* New [option to enable quick bookmark](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#quickBookmarkCreation\(boolean\)) creation

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

* Support for adding comments to text markup in reflow mode
* Support large font via device accessibility settings in the viewer
* New duplicate option for existing annotations
* New APIs to set [editing options](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#hideThumbnailEditOptions\(com.pdftron.pdf.controls.ThumbnailsViewFragment.ThumbnailsViewEditOptions\)) in the `ThumbnailsViewFragment`

## Breaking changes

* [`onBookmarkModified()`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/tools/ToolManager.PdfDocModificationListener.html#onBookmarkModified\(\)\(\)) has been replaced with [`onBookmarkModified(List<UserBookmarkItem>)`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/tools/ToolManager.PdfDocModificationListener.html#onBookmarkModified\(java.util.List<com.pdftron.pdf.model.UserBookmarkItem>\)).
* [`raiseBookmarkModified()`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/tools/ToolManager.html#raiseBookmarkModified\(\)\(\)) has been replaced with [`raiseBookmarkModified(List<UserBookmarkItem>)`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/tools/ToolManager.html#raiseBookmarkModified\(java.util.List<com.pdftron.pdf.model.UserBookmarkItem>\)).
* The constructor for [`PresetBarComponent`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/widget/preset/component/PresetBarComponent.html) now requires [`SignatureViewModel`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/widget/preset/signature/SignatureViewModel.html) as an additional parameter.

If you are experiencing issues with upgrading, please don't hesitate to [contact us](https://apryse.com/form/request).

## Fixed

* Fixed issue where annotation reply to sticky note is missing UUID
* Fixed issue where floating point width for stroke thickness would not work
* Fixed issue where object eraser would not behave properly
* Fixed issue where `usingFileExtension` would not work with XOD file without extension
* Fixed issue where quick menu for text markup would not appear if long press quick menu is disabled
* Fixed issue where keyboard would not come up for Free Text on Android 12
* Fixed issue where camera would not show up in the image stamp tool on Android 12
* Fixed issue where search previous and next buttons would have square ripple effect on Android 12
* Fixed issue where text markup menu items in reflow mode sometimes would not show up on Android 12
* Fixed issue where decimal could not be entered with Samsung keyboard on certain devices
* Fixed crash with moving grouped annotations
* \[collab] Fixed issue where sticky note annotation would not be selectable in some situations
* \[collab] Fixed issue where `addUser` would not create the correct id to name mapping for other users
* UX improvements on page cropping
* UX improvements on outline editing

## APIs

### PDFViewCtrlTools package

#### SavedSignatureAdapter

*new* method: `void setSignatures(List<File>)`

#### ViewerConfig.Builder

*new* method: `Builder hideThumbnailEditOptions(ThumbnailsViewEditOptions[])`

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

#### PdfViewCtrlTabBaseFragment

*new* method: `LiveData<BookmarksCache> getBookmarks()`

*new* method: `MutableLiveData<PageState> getPageChange()`

*new* method: `void onBookmarkModified(List<UserBookmarkItem>)`

#### ReflowControl

*new* method: `void setup(PDFDoc, ToolManager, OnPostProcessColorListener)`

#### ReflowPagerAdapter

*new* method: `void setToolManager(ToolManager)`

#### ThumbnailsViewAdapter

*new* method: `void rotateDocPage(int, boolean)`

#### ThumbnailsViewFragment

*new* static method: `ThumbnailsViewFragment newInstance(boolean, boolean, int[], String[])`

#### ThumbnailsViewEditOptions

*new* final class: `ThumbnailsViewEditOptions`

*new* static final field: `ThumbnailsViewEditOptions OPTION_DELETE_PAGES`

*new* static final field: `ThumbnailsViewEditOptions OPTION_DUPLICATE_PAGES`

*new* static final field: `ThumbnailsViewEditOptions OPTION_EXPORT_PAGES`

*new* static final field: `ThumbnailsViewEditOptions OPTION_INSERT_FROM_DOCUMENT`

*new* static final field: `ThumbnailsViewEditOptions OPTION_INSERT_FROM_IMAGE`

*new* static final field: `ThumbnailsViewEditOptions OPTION_INSERT_PAGES`

*new* static final field: `ThumbnailsViewEditOptions OPTION_PAGE_LABEL`

*new* static final field: `ThumbnailsViewEditOptions OPTION_ROTATE_PAGES`

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

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

#### UserCropApplyDialogFragment

*removed* class: `UserCropApplyDialogFragment`

*removed* constructor: `UserCropApplyDialogFragment()`

*removed* static final field: `String BUNDLE_IS_EVEN`

*removed* static final field: `Integer OPTION_ALL_PAGES`

*removed* static final field: `Integer OPTION_EDITED_PAGE`

*removed* static final field: `Integer OPTION_ODD_OR_EVEN_PAGES`

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

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

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

#### UserCropApplyDialogListener

*removed* interface: `UserCropApplyDialogListener`

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

#### ReflowAnnotEditBottomSheetDialog

*new* static final field: `int ITEM_NOTE`

#### SavedSignaturePickerFragment

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

#### SavedSignaturePickerFragment.DialogMode

*new* final field: `int value`

*new* static method: `DialogMode fromValue(int)`

#### SignatureDialogFragmentBuilder

*new* method: `SignatureDialogFragmentBuilder usingDialogMode(DialogMode)`

#### BookmarkButtonState

*new* class: `BookmarkButtonState`

*new* constructor: `BookmarkButtonState(boolean)`

*new* method: `boolean isSelected()`

#### PageState

*new* class: `PageState`

*new* constructor: `PageState(int)`

*new* method: `int getCurrentPage()`

#### UserBookmarkItem

*new* field: `boolean deleted`

#### DialogAnnotNote

*new* constructor: `DialogAnnotNote(Context, String, boolean)`

#### Signature

*new* method: `void showSignaturePickerDialog(OnCreateSignatureListener, OnDialogDismissListener, DialogMode)`

#### ToolManager

*new* method: `void raiseBookmarkModified(List<UserBookmarkItem>)`

#### ToolManager.PdfDocModificationListener

*new* method: `void onBookmarkModified(List<UserBookmarkItem>)`

#### UndoRedoManager

*new* method: `void onBookmarkModified(List<UserBookmarkItem>)`

#### AnalyticsHandlerAdapter

*new* static final field: `String EVENT_EDIT_OUTLINE_EDIT`

*removed* static final field: `String EVENT_EDIT_OUTLINE_RENAME`

#### AnnotUtils

*new* static field: `String KEY_ANNOT_ROTATION`

*new* static field: `String KEY_UNROTATED_BBOX`

*new* static method: `Rect deserializeRect(String)`

*new* static method: `String getAnnotContents(PDFDoc, Annot)`

*new* static method: `int getAnnotRotation(Annot)`

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

*new* static method: `Rect getUnrotatedBBox(Annot)`

*new* static method: `boolean hasPermission(PDFDoc, ToolManager, Annot, int)`

*new* static method: `boolean hasPermission(PDFViewCtrl, PDFDoc, ToolManager, Annot, int)`

*new* static method: `boolean hasRotation(Annot)`

*new* static method: `boolean hasRotation(PDFViewCtrl, Annot)`

*new* static method: `void saveUnrotatedBBox(Annot)`

*new* static method: `String serializeRect(Rect)`

*new* static method: `void setAnnotContents(PDFDoc, Markup, String)`

*new* static method: `void setBorderStyle(Annot, int, int, double[])`

#### OnClipboardTaskListener

*new* method: `void onClipboardTaskDone(String, ArrayList<Annot>)`

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

#### BookmarkManager

*new* static method: `void addUserBookmark(Context, PDFViewCtrl, String, long, int)`

*new* static method: `void importUserBookmarks(Context, PDFViewCtrl, String, String)`

*new* static method: `void onPageDeleted(Context, PDFViewCtrl, String, Long, int, int)`

*new* static method: `void onPageMoved(Context, PDFViewCtrl, String, long, long, int, int)`

*new* static method: `void removeUserBookmark(Context, PDFViewCtrl, String, long, int)`

*new* static method: `void saveUserBookmarks(Context, PDFViewCtrl, String, List<UserBookmarkItem>)`

*new* static method: `void updateUserBookmarkPageObj(Context, PDFViewCtrl, String, long, long, int)`

#### PdfViewCtrlSettingsManager

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

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

#### RotationUtils

*new* class: `RotationUtils`

*new* constructor: `RotationUtils()`

*new* static method: `double getRotationAngleInRadiansByDegrees(int)`

*new* static method: `Rect getUnrotatedDimensionsFromBBox(Rect, int)`

*new* static method: `RectF getUnrotatedDimensionsFromBBoxRectF(Rect, int)`

*new* static method: `boolean isDivisibleByPiOverFour(double)`

*new* static method: `boolean shouldMaintainAspectRatio(int)`

#### StampManager

*new* static method: `Single<File> getSignaturePreview(Context, String)`

#### Utils

*new* static method: `void handleEmptyPopup(PDFDoc, Markup)`

*new* static method: `Drawable tintDrawable(Context, Drawable)`

*new* static method: `void updateDashedLineColor(View, int)`

*removed* static method: `void handleEmptyPopup(PDFViewCtrl, Markup)`

#### ViewerUtils

*new* static method: `Annot getAnnotById(PDFDoc, String, int)`

#### BookmarksCache

*new* class: `BookmarksCache`

*new* constructor: `BookmarksCache()`

*new* method: `boolean containsBookmark(int)`

*new* method: `List<UserBookmarkItem> getBookmarkItems()`

*new* method: `void setBookmarkItems(List<UserBookmarkItem>)`

*new* method: `void updateCache(PDFViewCtrl, boolean)`

#### BookmarkButtonViewModel

*new* class: `BookmarkButtonViewModel`

*new* constructor: `BookmarkButtonViewModel(Application)`

*new* method: `void attachBookmarkData(LiveData<BookmarksCache>)`

*new* method: `void attachPageData(LiveData<PageState>)`

*new* final method: `void observe(LifecycleOwner, Observer<BookmarkButtonState>)`

#### BookmarksViewModel

*new* class: `BookmarksViewModel`

*new* constructor: `BookmarksViewModel(Application)`

*new* method: `LiveData<BookmarksCache> getBookmarks()`

*new* method: `void loadBookmarks(PDFViewCtrl, boolean)`

*new* final method: `void observe(LifecycleOwner, Observer<BookmarksCache>)`

*new* method: `void setBookmarks(List<UserBookmarkItem>)`

*new* method: `void toggleBookmark(Context, boolean, PDFViewCtrl, int)`

#### PageChangeViewModel

*new* class: `PageChangeViewModel`

*new* constructor: `PageChangeViewModel(Application)`

*new* method: `MutableLiveData<PageState> getPageState()`

*new* method: `void observe(LifecycleOwner, Observer<PageState>)`

*new* method: `void onPageChange(PageState)`

#### AnnotDrawingView

*new* method: `void setRotateImpl(RotationImpl)`

*removed* method: `PointF center()`

*removed* method: `RotateInfo handleRotation(PointF, PointF, boolean)`

*removed* method: `void snapToDegree(Integer, float)`

#### AnnotView

*new* method: `int getAnnotUIRotation()`

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

*new* method: `void snapToDegree(Integer, float)`

*removed* method: `InertRichEditor getRichEditor()`

#### AnnotViewImpl

*new* field: `int mAnnotUIRotation`

#### AutoScrollEditor

*new* method: `void rotateToDegree()`

*new* method: `void setRotateImpl(RotationImpl)`

#### PTCropImageViewBase

*new* method: `void setPTCropImageViewListener(PTCropImageViewListener)`

#### PTCropImageViewListener

*new* interface: `PTCropImageViewListener`

*new* method: `void cropWindowChanged()`

#### RotateHandleView

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

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

#### RotationImpl

*new* class: `RotationImpl`

*new* constructor: `RotationImpl(AnnotViewImpl)`

*new* field: `float mRotDegree`

*new* field: `float mRotDegreeSave`

*new* field: `boolean mRotated`

*new* field: `boolean mRotating`

*new* field: `Integer mSnapDegree`

*new* method: `PointF center()`

*new* method: `RotateInfo handleRotation(PointF, PointF, boolean)`

*new* method: `void snapToDegree(Integer, float)`

#### SelectionHandleView

*removed* method: `void setCustomSize(int)`

*removed* method: `void setImageResource(int)`

#### BottomBarComponent

*new* method: `void setItemIcon(int, Drawable)`

*new* method: `void setShowBackground(int, boolean)`

#### BottomBarView

*new* method: `void setItemIcon(int, Drawable)`

*new* method: `void setShowBackground(int, boolean)`

#### PresetBarComponent

*new* constructor: `PresetBarComponent(LifecycleOwner, FragmentManager, PresetBarViewModel, ToolManagerViewModel, SignatureViewModel, ViewGroup)`

*new* constructor: `PresetBarComponent(LifecycleOwner, FragmentManager, PresetBarViewModel, ToolManagerViewModel, SignatureViewModel, PresetBarView)`

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

*removed* constructor: `PresetBarComponent(LifecycleOwner, FragmentManager, PresetBarViewModel, ToolManagerViewModel, ViewGroup)`

*removed* constructor: `PresetBarComponent(LifecycleOwner, FragmentManager, PresetBarViewModel, ToolManagerViewModel, PresetBarView)`

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

#### PresetBarTheme

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

*new* final field: `int accentColor`

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

#### PresetBarView

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

#### PresetSingleButton

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

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

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

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

*removed* method: `void setIconColor(int)`

#### SignaturePresetComponent

*new* class: `SignaturePresetComponent`

*new* constructor: `SignaturePresetComponent(LifecycleOwner, SignatureViewModel, SignatureSelectionView, Context)`

*new* final field: `Context mContext`

*new* method: `void attachDialogToViewModel()`

*new* method: `void close()`

*new* method: `void setButtonEventListener(ButtonClickListener)`

*new* method: `void show()`

#### SignatureSelectionDialog

*new* class: `SignatureSelectionDialog`

*new* constructor: `SignatureSelectionDialog(FragmentManager)`

*new* static final field: `String TAG`

*new* method: `void close()`

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

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

*new* method: `void setButtonEventListener(ButtonClickListener)`

*new* method: `void setSignatures(List<String>)`

*new* method: `void show()`

#### ButtonClickListener

*new* interface: `ButtonClickListener`

*new* method: `void onCreateClicked()`

*new* method: `void onFirstSignatureClicked()`

*new* method: `void onManageClicked()`

*new* method: `void onSecondSignatureClicked()`

#### SignatureSelectionView

*new* interface: `SignatureSelectionView`

*new* method: `void close()`

*new* method: `void setButtonEventListener(ButtonClickListener)`

*new* method: `void setSignatures(List<String>)`

*new* method: `void show()`

#### SignatureViewModel

*new* class: `SignatureViewModel`

*new* constructor: `SignatureViewModel(Application)`

*new* method: `List<SignatureData> getSignatures()`

*new* method: `boolean hasSignatures()`

*new* method: `void observeSignatures(LifecycleOwner, Observer<List<SignatureData>>)`

*new* method: `void populateSignaturesAsync(Context)`

*new* method: `void populateSignaturesAsync(Context, Consumer<List<SignatureData>>)`

#### SignatureData

*new* class: `SignatureData`

*new* constructor: `SignatureData(String, long)`

*new* method: `String getFilePath()`

*new* method: `long getLastUsedRawDate()`

#### TabletAnnotationToolbarComponent

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

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

#### ActionButton

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

#### ActionToolbar

*new* method: `void setBackground(int, boolean)`

*new* method: `void setItemIcon(int, Drawable)`

#### ToolbarButton

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

#### BookmarkNode

*new* method: `BookmarkNode commitEditEntry()`

*removed* method: `BookmarkNode commitRename()`

#### ViewHolder

*new* method: `TextView getTvPageNumber()`


---

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