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

# Version 9.2.3 Changelog (June 1, 2022)

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

Version: 9.2.3.79556

Release Date: June 1, 2022

## New features

* New measurement count tool in the Measure toolbar

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-1ae7a2fd0a108dd4ba6ceb7879965e7b45394936%2Fa14b245c76d354185fa8a7878499f22022bbc033-353x746.png?alt=media)

* Adds ability to snap annotations to each other as well as with the page

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-36380403af4052efe0af14190ec40304b285ea28%2Ff15388a2419a0631ec0e0889849254e9e64fbb2c-350x742.gif?alt=media)

* Adds ability to open HTML and SVG files directly in the viewer, use [`usingFileExtension`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerBuilder2.html#usingFileExtension\(java.lang.String\)) to specify the extension
* \[collab] Adds ability to dynamically change the writing hint for the reply fragment
* New API to [disable editing options](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#userBookmarksListEditingMode\(int\)) in the [user bookmarks dialog](/android/bookmarks/user-bookmarks-a.md)
* New API to [hide typed signature](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ToolManagerBuilder.html#setShowTypedSignature\(boolean\)) button

## Dependency changes

* [Room](https://developer.android.com/jetpack/androidx/releases/room/) libraries are updated from `2.2.5` to `2.4.2`

## Fixed

* Selected icon color in the annotation toolbar will now change color when the same type annotation is being modified
* Fixes issue where the progress bar in search mode is white making it invisible in light theme
* Fixes issue where the eraser tool from long press is not consistent with other tools for showing presets
* Fixes the ripple effect for custom sticky button in the annotation toolbar component
* Fixes issue where the annotation toolbar component will flash 2 line toolbar then change to 1 line in some situations
* Fixes issue where FreeText does not behave correctly on rotated pages

## APIs

### PDFViewCtrlTools package

#### ToolManagerBuilder

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

#### ViewerConfig.Builder

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

*new* method: `Builder userBookmarksListEditingMode(int)`

#### AdvancedColorView

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

#### ColorPickerView

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

#### PdfViewCtrlTabBaseFragment

*new* method: `boolean isWebViewConvertibleFormat()`

#### PdfViewCtrlTabFragment2

*new* method: `void setComponentListener(ComponentListener)`

*new* method: `void setSnackbarListener(SnackbarListener)`

#### ComponentListener

*new* interface: `ComponentListener`

*new* method: `PresetBarComponent getPresetBarComponent()`

#### PdfViewCtrlTabHostFragment2

*new* method: `PresetBarComponent getPresetBarComponent()`

*new* method: `void onShowSnackbar(CharSequence, int, CharSequence, OnClickListener)`

*modified* class: `PdfViewCtrlTabHostFragment2`

|       | Declaration                                                                                                                               |
| ----- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| From: | public class PdfViewCtrlTabHostFragment2 extends PdfViewCtrlTabHostBaseFragment implements TabListener                                    |
| To:   | public class PdfViewCtrlTabHostFragment2 extends PdfViewCtrlTabHostBaseFragment implements TabListener,SnackbarListener,ComponentListener |

#### ThumbnailsViewAdapter

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

#### UserBookmarkDialogFragment

*new* static final field: `String BUNDLE_EDITING_MODE`

*new* static final field: `int CONTEXT_MENU_DELETE_ALL_BIT`

*new* static final field: `int CONTEXT_MENU_DELETE_ITEM_BIT`

*new* static final field: `int CONTEXT_MENU_EDIT_ITEM_BIT`

#### CountToolCreatePresetDialog

*new* class: `CountToolCreatePresetDialog`

*new* constructor: `CountToolCreatePresetDialog()`

*new* static final field: `String TAG`

*new* method: `void dismiss()`

*new* method: `AnnotationPropertyPreviewView getAnnotPreview()`

*new* method: `SparseArray<AnnotationPropertyPreviewView> getAnnotPreviews()`

*new* method: `AnnotStyle getAnnotStyle()`

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

*new* method: `void onAnnotStyleLayoutUpdated()`

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

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

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

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

*new* method: `void saveAnnotStyles()`

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

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

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

*new* method: `void setListener(CountToolCreatePresetDialogListener)`

*new* method: `void setMeasureCountToolViewModel(MeasureCountToolViewModel)`

*new* method: `void setPresetBarViewModel(PresetBarViewModel)`

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

#### CountToolCreatePresetDialog.Builder

*new* class: `Builder`

*new* constructor: `Builder()`

*new* constructor: `Builder(AnnotStyle)`

*new* method: `CountToolCreatePresetDialog build()`

*new* method: `Builder setAnnotStyle(AnnotStyle)`

#### CountToolCreatePresetDialogListener

*new* interface: `CountToolCreatePresetDialogListener`

*new* method: `void onPresetChanged(String, String, AnnotStyle)`

#### CountToolDialogFragment

*new* class: `CountToolDialogFragment`

*new* constructor: `CountToolDialogFragment()`

*new* static final field: `String COUNT_MODE`

*new* static final field: `String EDIT_MODE`

*new* static final field: `String PRESET_MODE`

*new* static final field: `String TAG`

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

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

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

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

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

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

*new* method: `void setPresetViewModel(PresetBarViewModel)`

*new* method: `void setToolManagerViewModel(ToolManagerViewModel)`

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

#### MeasureCountTool

*new* class: `MeasureCountTool`

*new* constructor: `MeasureCountTool()`

*new* field: `int annotCount`

*new* field: `String annotStyleJson`

*new* field: `long id`

*new* field: `String label`

#### MeasureCountToolViewModel

*new* class: `MeasureCountToolViewModel`

*new* constructor: `MeasureCountToolViewModel(Application)`

*new* method: `void delete(MeasureCountTool)`

*new* method: `void insert(MeasureCountTool)`

*new* method: `void observeCountToolPresets(LifecycleOwner, Observer<List<MeasureCountTool>>)`

*new* method: `void update(String, String, AnnotStyle)`

#### CreateSignatureFragment

*new* static method: `CreateSignatureFragment newInstance(int, float, boolean, boolean, boolean, boolean, boolean, HashMap<Integer, AnnotStyleProperty>, boolean, boolean)`

#### SignatureDialogFragmentBuilder

*new* method: `SignatureDialogFragmentBuilder usingShowTypedSignature(boolean)`

#### SignatureFragmentAdapter

*new* method: `SignatureFragmentAdapter setShowTypedSignature(boolean)`

#### OnAnnotStyleChangedListener

*new* interface: `OnAnnotStyleChangedListener`

*new* method: `void OnAnnotStyleDismiss(AnnotStyleDialogFragment)`

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

#### AnnotStyle

*new* static final field: `int CUSTOM_ANNOT_TYPE_COUNT_MEASUREMENT`

*new* method: `boolean isCountMeasurement()`

#### AnnotEdit

*new* method: `boolean hasAnnotSelected()`

#### AnnotEditRectGroup

*new* method: `boolean hasAnnotSelected()`

#### AnnotEditTextMarkup

*new* method: `boolean hasAnnotSelected()`

#### CountMeasurementCreateTool

*new* class: `CountMeasurementCreateTool`

*new* constructor: `CountMeasurementCreateTool(PDFViewCtrl)`

*new* static final field: `String COUNT_MEASURE_CHECKMARK_ICON`

*new* static final field: `String COUNT_MEASURE_KEY`

*new* static final field: `String COUNT_MEASURE_LABEL_KEY`

*new* method: `int getCreateAnnotType()`

*new* method: `ToolModeBase getToolMode()`

*new* method: `void setTargetPoint(PointF)`

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

*new* method: `void setupAnnotProperty(int, float, float, int, String, String)`

#### Tool

*new* method: `boolean hasAnnotSelected()`

#### ToolManager

*new* method: `AnnotSnappingManager getAnnotSnappingManager()`

*new* method: `OnAnnotStyleChangedListener getOnStyleChangedListener()`

*new* method: `SnackbarListener getSnackbarListener()`

*new* method: `boolean isShowTypedSignature()`

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

*new* method: `void onAnnotStyleDismiss(AnnotStyleDialogFragment)`

*new* method: `Tool safeCreateTool(ToolModeBase)`

*new* method: `void setOnStyleChangedListener(OnAnnotStyleChangedListener)`

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

*new* method: `void setSnackbarListener(SnackbarListener)`

#### SnackbarListener

*new* interface: `SnackbarListener`

*new* method: `void onShowSnackbar(CharSequence, int, CharSequence, OnClickListener)`

#### ToolMode

*new* static final field: `ToolMode COUNT_MEASUREMENT`

#### AnnotSnappingManager

*new* class: `AnnotSnappingManager`

*new* constructor: `AnnotSnappingManager()`

*new* method: `SnappingResult checkSnapping(PDFViewCtrl, Annot, Rect, int, boolean, boolean, boolean, boolean, boolean, boolean)`

*new* method: `void clearCache()`

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

*new* method: `void setThreshold(double)`

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

#### SnappingGroup

*new* final class: `SnappingGroup`

*new* static final field: `SnappingGroup FORM_FIELD`

*new* static final field: `SnappingGroup FREE_TEXT`

*new* static final field: `SnappingGroup SHAPE`

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

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

#### SnappingResult

*new* class: `SnappingResult`

*new* constructor: `SnappingResult()`

*new* constructor: `SnappingResult(Set<SnappingType>, Rect, List<Pair<Point, Point>>)`

*new* method: `Rect getRect()`

*new* method: `List<Pair<Point, Point>> getSnappingLines()`

*new* method: `Set<SnappingType> getSnappingType()`

*new* method: `boolean isSnapping()`

#### SnappingType

*new* final class: `SnappingType`

*new* static final field: `SnappingType BOTTOM`

*new* static final field: `SnappingType CENTER_HORIZONTAL`

*new* static final field: `SnappingType CENTER_HORIZONTAL_PAGE`

*new* static final field: `SnappingType CENTER_VERTICAL`

*new* static final field: `SnappingType CENTER_VERTICAL_PAGE`

*new* static final field: `SnappingType LEFT`

*new* static final field: `SnappingType RIGHT`

*new* static final field: `SnappingType TOP`

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

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

#### AnnotUtils

*new* static method: `int getAnnotBaseRotation(PDFViewCtrl, int)`

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

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

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

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

#### Constants

*new* static final field: `String[] FILE_NAME_EXTENSIONS_WEBVIEW`

#### DrawingUtils

*new* static method: `void drawGuideline(Canvas, Path, float, float, float, float, Paint)`

#### EventHandler

*new* static final field: `String TOOLBAR_METADATA_KEY`

#### Utils

*new* static method: `boolean isConvertibleFormat(String, String[])`

*new* static method: `boolean isConvertibleFormatFromExt(String, String[])`

#### AnnotView

*new* method: `void clearPositionGuidelines()`

*new* method: `void setPositionGuidelines(List<Pair<Point, Point>>)`

#### AnnotViewImpl

*new* method: `void addPositionGuidelines(Pair<Point, Point>)`

#### PresetBarComponent

*new* method: `void handleAnnotStyleDialogDismiss(AnnotStyleDialogFragment)`

*new* method: `void handleAnnotStyleDialogDismiss(AnnotStyleDialogFragment, int, String)`

#### PresetBarViewModel

*new* method: `boolean hasCountMeasurementPresets()`

*new* method: `void observeAnnotStyles(LifecycleOwner, Observer<ArrayList<AnnotStyle>>)`

*new* method: `void populateAnnotationStylesAsync()`

*new* method: `void saveCountMeasurementPreset(String, AnnotStyle, String, int)`

#### SinglePresetState

*new* static method: `SinglePresetState fromAnnotStyle(AnnotStyle, int)`

*new* method: `AnnotStyle getAnnotStyle()`

*new* method: `int getIconRes()`

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

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

#### PresetSingleButton

*new* method: `void setPresetAnnotStyle(AnnotStyle, int)`

#### ToolbarButtonType

*new* static final field: `ToolbarButtonType COUNT_MEASUREMENT`

#### AnnotationToolbarComponent

*new* method: `void disableAllItems()`

#### ButtonId

*new* static final field: `ButtonId COUNT_TOOL`

#### ActionToolbar

*new* method: `void disableAllItems()`

#### AnnotationToolbarView

*new* method: `void deselectAllToolbarButtons()`

*new* method: `void disableAllItems()`


---

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