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

# Version 9.0.1 Changelog (June 03, 2021)

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

Version: 9.0.1.77774

Release Date: June 03, 2021

## New features

* Adds [`DigitalSignatureListDialog`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/dialog/digitalsignature/validation/list/DigitalSignatureListDialog.html) that allows users to verify digital signatures in the document

| Digital signature validation dialog                                                                                                                                                                                                             | Signature properties                                                                                                                                                                                                                            |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-b8f6915757ddd74e79697be65ff9b652f9f725a7%2F6cf76f5b8fae5448e39991d6f9ba6a6b2444c60a-540x1140.png?alt=media) | ![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-d4ed52dbeb6f318026d0c5b723f2924f3b045c83%2F52fd0f840594a71f54e1300e4ea70809fa9b5cdc-540x1140.png?alt=media) |

* Adds options overflow menu to all toolbars in the compact mode for ease of use

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

* Adds page number to individual item in the user bookmarks screen
* Adds ability to rename a file prior to saving as flattened copy, reduced size copy, permanently cropped copy as well as password-protected copy
* Adds API to permanently show the page number indicator, see [`permanentPageNumberIndicator`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/config/ViewerConfig.Builder.html#permanentPageNumberIndicator\(boolean\))
* Adds a new document generation sample to showcase app

## Fixed

* Fixes incorrect theming when using annot note dialog and free text dialog
* Fixes issue where it was possible to add multiple user bookmarks of the same page
* Fixes issue where incorrect crop box for stamp annotation was shown at large zoom level
* Fixes issue where page number indicator did not update properly in reflow mode
* Fixes issue where the quick menu layout was incorrect when certain tools were disabled
* Fixes issue where edit toolbar did not show up when drawing advanced shape
* Fixes issue where back button closes the viewer instead of closing the navigation list panel
* Fixes potential crash when dismissing the toolbar switcher then backgrounding/foregrounding the app
* Performance improvement for the viewer
* Theme fixes for a number of screens

## APIs

### PDFViewCtrlTools package

#### ViewerConfig.Builder

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

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

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

#### BookmarksTabLayout

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

#### BookmarksTabsListener

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

#### PageIndicatorLayout

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

#### PdfViewCtrlTabFragment2.SaveFolderWrapper

*new* constructor: `SaveFolderWrapper(PdfViewCtrlTabBaseFragment, ExternalFileInfo, String, boolean, String)`

*new* constructor: `SaveFolderWrapper(PdfViewCtrlTabBaseFragment, File, String, boolean, String)`

*removed* constructor: `SaveFolderWrapper(PdfViewCtrlTabBaseFragment, ExternalFileInfo, boolean, String)`

*removed* constructor: `SaveFolderWrapper(PdfViewCtrlTabBaseFragment, File, boolean, String)`

#### PdfViewCtrlTabFragment2

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

#### PdfViewCtrlTabHostBaseFragment

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

*new* method: `void showDigitalSignatureList()`

#### PdfViewCtrlTabHostFragment2

*removed* method: `void onCreateOptionsMenu(Menu, MenuInflater)`

#### ThumbnailsViewAdapter

*new* constructor: `ThumbnailsViewAdapter(Context, EditPagesListener, FragmentManager, PDFViewCtrl, List<Integer>, int, ViewHolderBindListener, Theme)`

*removed* constructor: `ThumbnailsViewAdapter(Context, EditPagesListener, FragmentManager, PDFViewCtrl, List<Integer>, int, ViewHolderBindListener)`

#### UserBookmarkDialogFragment.Theme

*new* class: `Theme`

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

*new* final field: `int activePageNumberBackgroundColor`

*new* final field: `int activePageNumberTextColor`

*new* final field: `int pageNumberBackgroundColor`

*new* final field: `int pageNumberTextColor`

*new* static method: `Theme fromContext(Context)`

#### UserBookmarkDialogFragment

*new* static final field: `String BUNDLE_AUTO_SORT_BOOKMARKS`

#### UserBookmarkDialogListener

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

#### DigitalSignatureUtils

*new* class: `DigitalSignatureUtils`

*new* constructor: `DigitalSignatureUtils()`

*new* static method: `void addCertificate(Context, File)`

*new* static method: `void clearCertificates(Context)`

*new* static method: `File[] getCertificates(Context)`

*new* static method: `String getDigestAlgorithm(Context, VerificationResult)`

*new* static method: `String getDigestStatus(Context, VerificationResult)`

*new* static method: `DigitalSignatureInfo getDigitalSignatureInformation(Context, DigitalSignatureField, PDFViewCtrl)`

*new* static method: `DigitalSignatureProperties getDigitalSignatureProperties(Context, DigitalSignatureField, PDFViewCtrl)`

*new* static method: `String getDisallowedChanges(Context, VerificationResult)`

*new* static method: `String getFieldVerificationStatus(Context, VerificationResult, DigitalSignatureField)`

*new* static method: `String getGeneralErrorReport(Context, VerificationResult)`

*new* static method: `String getPermissionDetails(Context, DigitalSignatureField)`

*new* static method: `String getPermissionStatus(Context, VerificationResult, DigitalSignatureField)`

*new* static method: `String getSigner(Context, VerificationResult, DigitalSignatureField)`

*new* static method: `String getSignerSummary(Context, DigitalSignatureField, VerificationResult)`

*new* static method: `String getSigningTime(DigitalSignatureField)`

*new* static method: `String getTimeOfTrustVerification(Context, VerificationResult)`

*new* static method: `String getTimeOfTrustVerificationDetails(Context, VerificationResult)`

*new* static method: `String getTimeOfTrustVerificationWithExplanation(Context, VerificationResult)`

*new* static method: `String getTrustStatus(Context, DigitalSignatureField, VerificationResult)`

*new* static method: `String getValiditySummary(Context, DigitalSignatureField, VerificationResult)`

*new* static method: `VerificationResult getVerificationResult(Context, DigitalSignatureField)`

*new* static method: `boolean hasDigitalSignatures(PDFDoc)`

*new* static method: `boolean hasDisallowedChanges(VerificationResult)`

#### DigitalSignatureInfo

*new* class: `DigitalSignatureInfo`

*new* constructor: `DigitalSignatureInfo(DigitalSignatureBadge, boolean, String, String, String, String, String, String, String, String, String, String, String, DigitalSignatureProperties)`

*new* final field: `DigitalSignatureProperties digitalSignatureProperties`

#### DigitalSignatureInfoBase

*new* interface: `DigitalSignatureInfoBase`

#### DigitalSignatureListDialog

*new* class: `DigitalSignatureListDialog`

*new* constructor: `DigitalSignatureListDialog()`

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

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

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

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

#### DigitalSignatureBadge

*new* final class: `DigitalSignatureBadge`

*new* static final field: `DigitalSignatureBadge ERROR`

*new* static final field: `DigitalSignatureBadge VALID`

*new* static final field: `DigitalSignatureBadge WARNING`

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

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

#### UnsignedDigitalSignatureInfo

*new* class: `UnsignedDigitalSignatureInfo`

*new* constructor: `UnsignedDigitalSignatureInfo(String)`

#### DigitalSignatureProperties

*new* class: `DigitalSignatureProperties`

*new* constructor: `DigitalSignatureProperties(DigitalSignatureBadge, String, String, String, String, String, String, String, String, String)`

*new* final field: `DigitalSignatureBadge badge`

*new* final field: `String digestAlgorithm`

*new* final field: `String digestStatus`

*new* final field: `String generalErrorReport`

*new* final field: `String permissionDetails`

*new* final field: `String permissionStatus`

*new* final field: `String signerSummary`

*new* final field: `String trustStatus`

*new* final field: `String trustVerificationTime`

*new* final field: `String validitySummary`

#### DigitalSignaturePropertiesDialog

*new* class: `DigitalSignaturePropertiesDialog`

*new* constructor: `DigitalSignaturePropertiesDialog()`

*new* method: `void bindTextViews()`

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

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

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

*new* method: `void setDigitalSignatureProperties(DigitalSignatureProperties)`

#### AnalyticsHandlerAdapter

*new* static final field: `int EVENT_SETTING_CHANGE_ABOUT`

*new* static final field: `int EVENT_SETTING_CHANGE_ANNOTATION`

*new* static final field: `int EVENT_SETTING_CHANGE_GENERAL`

*new* static final field: `int EVENT_SETTING_CHANGE_STYLUS`

*new* static final field: `int EVENT_SETTING_CHANGE_TABS`

*new* static final field: `int EVENT_SETTING_CHANGE_VIEWING`

#### PdfViewCtrlSettingsManager

*new* static final field: `String KEY_PREF_SCROLLBAR_GUIDELINE`

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

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

*new* static method: `void setShowNavigationBarForNewUI(Context, boolean)`

*new* static method: `void setShowScrollbarGuideline(Context, boolean)`

#### SwipeDetector

*new* class: `SwipeDetector`

*new* constructor: `SwipeDetector()`

*new* method: `void handleOnDown(MotionEvent)`

*new* method: `void handleOnUp(MotionEvent)`

*new* method: `boolean isHorizontalSwipe()`

*new* method: `boolean isVerticalSwipe()`

#### InertWebView

*new* class: `InertWebView`

*new* constructor: `InertWebView(Context)`

*new* constructor: `InertWebView(Context, AttributeSet)`

*new* constructor: `InertWebView(Context, AttributeSet, int)`

*new* method: `boolean onTouchEvent(MotionEvent)`

#### PTCropImageView

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

*modified* class: `PTCropImageView`

|       | Declaration                                              |
| ----- | -------------------------------------------------------- |
| From: | public class PTCropImageView extends CropImageView       |
| To:   | public class PTCropImageView extends PTCropImageViewBase |

#### PTCropImageViewBase

*new* class: `PTCropImageViewBase`

*new* constructor: `PTCropImageViewBase(Context)`

*new* constructor: `PTCropImageViewBase(Context, AttributeSet)`

*new* constructor: `PTCropImageViewBase(Context, AttributeSet, int)`

*new* static final field: `int GUIDELINES_OFF`

*new* static final field: `int GUIDELINES_ON`

*new* static final field: `int GUIDELINES_ON_TOUCH`

*new* method: `Bitmap getCroppedImage()`

*new* method: `boolean onTouchEvent(MotionEvent)`

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

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

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

#### DocumentSlider

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

### pdfnet-demo-utils package

#### SettingsActivity

*new* method: `boolean onPreferenceStartFragment(PreferenceFragmentCompat, Preference)`

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

*new* method: `boolean onSupportNavigateUp()`

*new* static method: `void setPreferencesDefaultValues(Context)`

*removed* method: `boolean onOptionsItemSelected(MenuItem)`

*modified* class: `SettingsActivity`

|       | Declaration                                                                                          |
| ----- | ---------------------------------------------------------------------------------------------------- |
| From: | public class SettingsActivity extends AppCompatActivity                                              |
| To:   | public class SettingsActivity extends AppCompatActivity implements OnPreferenceStartFragmentCallback |

#### SettingsFragment

*removed* class: `SettingsFragment`

*removed* constructor: `SettingsFragment()`

*removed* method: `void onCreatePreferences(Bundle, String)`

*removed* method: `void onDisplayPreferenceDialog(Preference)`

#### AboutFragmentBase

*new* class: `AboutFragmentBase`

*new* constructor: `AboutFragmentBase()`

*new* method: `void onCreatePreferences(Bundle, String)`

*new* method: `void onDisplayPreferenceDialog(Preference)`

#### AnnotatingFragmentBase

*new* class: `AnnotatingFragmentBase`

*new* constructor: `AnnotatingFragmentBase()`

*new* method: `void onCreatePreferences(Bundle, String)`

#### GeneralFragmentBase

*new* class: `GeneralFragmentBase`

*new* constructor: `GeneralFragmentBase()`

*new* method: `void onCreatePreferences(Bundle, String)`

#### SearchSettingFragmentBase

*new* class: `SearchSettingFragmentBase`

*new* constructor: `SearchSettingFragmentBase()`

*new* static final field: `String START_PREFERENCE`

*new* method: `void onCreateOptionsMenu(Menu, MenuInflater)`

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

*new* method: `void onStop()`

#### SettingFragmentBase

*new* class: `SettingFragmentBase`

*new* constructor: `SettingFragmentBase()`

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

*new* method: `void onCreatePreferences(Bundle, String)`

#### SettingsFragment

*new* class: `SettingsFragment`

*new* constructor: `SettingsFragment()`

*new* method: `void onCreatePreferences(Bundle, String)`

#### StylusFragmentBase

*new* class: `StylusFragmentBase`

*new* constructor: `StylusFragmentBase()`

*new* method: `void onCreatePreferences(Bundle, String)`

#### TabsFragmentBase

*new* class: `TabsFragmentBase`

*new* constructor: `TabsFragmentBase()`

*new* method: `void onCreatePreferences(Bundle, String)`

#### ViewingFragmentBase

*new* class: `ViewingFragmentBase`

*new* constructor: `ViewingFragmentBase()`

*new* method: `void onCreatePreferences(Bundle, String)`

#### FrescoCustomPoolFactory

*new* class: `FrescoCustomPoolFactory`

*new* constructor: `FrescoCustomPoolFactory(PoolConfig, int)`

*new* method: `PooledByteBufferFactory getPooledByteBufferFactory()`

#### SettingsManager

*new* static final field: `String KEY_PREF_CATEGORY_ABOUT`

*new* static final field: `String KEY_PREF_CATEGORY_ANNOTATING`

*new* static final field: `String KEY_PREF_CATEGORY_GENERAL`

*new* static final field: `String KEY_PREF_CATEGORY_STYLUS`

*new* static final field: `String KEY_PREF_CATEGORY_TABS`

*new* static final field: `String KEY_PREF_CATEGORY_VIEWING`


---

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