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

# Version 9.4.0 Changelog (October 12, 2022)

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

Version: 9.4.0.80508

Release Date: October 12, 2022

## New features

* Added new API for Measurement Tool [setSnappingMode](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ToolManagerBuilder.html#setSnappingMode\(com.pdftron.pdf.utils.SnapUtils.SnappingMode\))
* Added [shouldShowPageIndicator API to PdfViewCtrlTabBaseFragment](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/controls/PdfViewCtrlTabBaseFragment.html#shouldShowPageIndicator\(\))
* Add [setIconColor API to PdfViewCtrlTabBaseFragment](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/controls/PdfViewCtrlTabBaseFragment.html#setIconColor\(int\))
* Added new API setItemAppearanceDisabled to [ActionButton](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/widget/toolbar/component/view/ActionButton.html) and [AnnotationToolbarComponent](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/widget/toolbar/component/AnnotationToolbarComponent.html)
* Added API to disableReplyEdit to [CollabViewerTabFragment2](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/collab/ui/viewer/CollabViewerTabFragment2.html)

## Notes

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

## Fixed

* Samsung keyboard not showing comma-based decimals (e.g. European locale)
* hidePresetBar API now applies to the empty "No preset" bar in landscape/tablet view
* Fix reloading state with pan/zoom issue when you are on the last page of a .xod file
* Thumbnail slider won't jump when tapped
* Disabled tools no longer affected by Eraser tool
* GotoR links within the same document will now jump to the correct page

## APIs

### PDFViewCtrlTools package

#### ToolManagerBuilder

*new* method: `ToolManagerBuilder setSnappingModes(SnappingMode[])`

#### PdfViewCtrlTabBaseFragment

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

*new* method: `void hidePageNumberIndicator()`

#### PdfViewCtrlTabHostFragment2

*new* method: `void setIconColor(int, int)`

*new* method: `void setSelectedIconColor(int, int)`

#### ToolManager

*new* method: `SnapUtils getSnapUtils()`

*new* method: `int getSnappingModes()`

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

#### PdfViewCtrlSettingsManager

*new* static field: `String sCustomSharedPreferencesName`

#### SnapUtils

*new* class: `SnapUtils`

*new* constructor: `SnapUtils(PDFViewCtrl)`

*new* method: `void drawSnapToShape(Canvas)`

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

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

*new* method: `PointF snapToNearest(double, double)`

#### SnappingMode

*new* final class: `SnappingMode`

*new* static final field: `SnappingMode DEFAULT`

*new* static final field: `SnappingMode ENDPOINT`

*new* static final field: `SnappingMode INTERSECTION`

*new* static final field: `SnappingMode MIDPOINT`

*new* static final field: `SnappingMode POINT_ON_LINE`

*new* field: `int value`

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

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

#### Utils

*new* static method: `String correctCommaBasedDecimal(EditText, String)`

*new* static method: `boolean isSamsungKeyboard(String)`

#### ViewerUtils

*new* static method: `Uri openGalleryIntent(Activity, int, boolean)`

#### BottomBarComponent

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

#### BottomBarView

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

#### AnnotationToolbarComponent

*new* method: `void setIconColor(int, int)`

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

*new* method: `void setSelectedIconColor(int, int)`

#### ActionButton

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

#### ActionToolbar

*new* method: `void setIconColor(int, int)`

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

*new* method: `void setSelectedIconColor(int, int)`

#### AnnotationToolbarView

*new* method: `void setIconColor(int, int)`

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

*new* method: `void setSelectedIconColor(int, int)`

### pdftron-collab package

#### ReplyFragment

*new* static final field: `String BUNDLE_DISABLE_REPLY_EDIT`

#### ReplyFragmentBuilder

*new* method: `ReplyFragmentBuilder setDisableReplyEdit(boolean)`

#### MessageAdapter

*new* constructor: `MessageAdapter(BaseDateFormat, PublishSubject<MessageEvent>, AvatarAdapter, boolean)`

#### ReplyHeader

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

### pdfnet-demo-utils package

#### ListviewItemFileListBinding

*modified* final field: `CheckBox checkBox`

|       | Declaration                         |
| ----- | ----------------------------------- |
| From: | public final CheckBox checkBox      |
| To:   | public final InertCheckBox checkBox |

#### RecentViewFragment

*new* method: `void addSelectedFilesAndReload(ArrayList<FileInfo>)`

*new* method: `void deselectAll()`

*new* method: `void deselectedFiles(ArrayList<FileInfo>)`

#### ToolbarFragment

*modified* abstract class: `ToolbarFragment`

|       | Declaration                                                  |
| ----- | ------------------------------------------------------------ |
| From: | public abstract class ToolbarFragment extends Fragment       |
| To:   | public abstract class ToolbarFragment extends DialogFragment |

#### Delegate

*new* static method: `Delegate create(FragmentActivity, boolean)`

*removed* static method: `Delegate create(FragmentActivity)`

#### BaseFileAdapter\<FileInfo

*new* final field: `ArrayList<FileInfo> mFileInfoSelectedList`

*new* method: `int getIndexOf(FileInfo)`

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

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

#### ContentViewHolder

*new* field: `CheckBox checkBox`

#### FileSelectionViewModel

*new* class: `FileSelectionViewModel`

*new* constructor: `FileSelectionViewModel()`

*new* final field: `MutableLiveData<ArrayList<FileInfo>> mSelectedFiles`

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

*new* method: `void setSelectedFiles(ArrayList<FileInfo>)`


---

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