Browse Source

PDFTool(Android) - 综合Demo 首页

liuxiaolong 1 year ago
parent
commit
5c8478c686
56 changed files with 2378 additions and 31 deletions
  1. 38 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CFileUtils.java
  2. 9 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/date/CDateUtil.java
  3. 14 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CAlertDialog.java
  4. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/docseditor/pdfpageedit/CPDFPageEditDialogFragment.java
  5. 20 8
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/docseditor/pdfpageeditinsert/CInsertBlankPageDialogFragment.java
  6. 2 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/docseditor/pdfpageeditinsert/CSelectInsertPageTypeDialogFragment.java
  7. 1 0
      ComPDFKit_Tools/src/main/res/layout/tools_pageedit_insert_blank_page_dialog_fragment.xml
  8. 4 4
      ComPDFKit_Tools/src/main/res/layout/tools_pageedit_insert_dialog_fragment.xml
  9. 0 2
      ComPDFKit_Tools/src/main/res/values-zh-rCN/tools_strings.xml
  10. 35 0
      ComPDFKit_Tools/src/main/res/values/tools_strings.xml
  11. 13 4
      PDFViewer/src/main/AndroidManifest.xml
  12. 49 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/Configuration.java
  13. 51 5
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/MainActivity.java
  14. 73 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/CHomeFunListAdapter.java
  15. 144 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/DocumentListFragment.java
  16. 55 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeActivity.java
  17. 140 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeFunBean.java
  18. 104 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeFunFragment.java
  19. 54 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/SelectWatermarkFunFragment.java
  20. 76 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/SettingActivity.java
  21. 44 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/datas/FunDatas.java
  22. 32 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/datas/SettingDatas.java
  23. 39 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/datas/SpUtils.java
  24. 27 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/BasicDocumentFunctions.java
  25. 125 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/DocumentEncryptionFunctionImpl.java
  26. 52 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/FunctionFactory.java
  27. 15 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/IDocumentFunctions.java
  28. 86 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/OpenPDFFunctionsImpl.java
  29. 137 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/WatermarkFunctionImpl.java
  30. 5 0
      PDFViewer/src/main/res/drawable/bg_fun_icon.xml
  31. 22 0
      PDFViewer/src/main/res/drawable/ic_fun_annotations.xml
  32. 22 0
      PDFViewer/src/main/res/drawable/ic_fun_compare_documents.xml
  33. 19 0
      PDFViewer/src/main/res/drawable/ic_fun_compress.xml
  34. 31 0
      PDFViewer/src/main/res/drawable/ic_fun_content_editor.xml
  35. 15 0
      PDFViewer/src/main/res/drawable/ic_fun_conversion.xml
  36. 14 0
      PDFViewer/src/main/res/drawable/ic_fun_digital_signature.xml
  37. 15 0
      PDFViewer/src/main/res/drawable/ic_fun_document_editor.xml
  38. 18 0
      PDFViewer/src/main/res/drawable/ic_fun_form.xml
  39. 26 0
      PDFViewer/src/main/res/drawable/ic_fun_mesurement.xml
  40. 19 0
      PDFViewer/src/main/res/drawable/ic_fun_redaction.xml
  41. 59 0
      PDFViewer/src/main/res/drawable/ic_fun_samples_pdf.xml
  42. 19 0
      PDFViewer/src/main/res/drawable/ic_fun_security.xml
  43. 24 0
      PDFViewer/src/main/res/drawable/ic_fun_viewer.xml
  44. 19 0
      PDFViewer/src/main/res/drawable/ic_fun_watermark.xml
  45. 14 0
      PDFViewer/src/main/res/drawable/ic_pdfviewer_home_setting.xml
  46. 31 0
      PDFViewer/src/main/res/layout/activity_home.xml
  47. 305 0
      PDFViewer/src/main/res/layout/activity_setting.xml
  48. 30 0
      PDFViewer/src/main/res/layout/fragment_document_list.xml
  49. 18 0
      PDFViewer/src/main/res/layout/fragment_home.xml
  50. 63 0
      PDFViewer/src/main/res/layout/fragment_watermark_select_fun.xml
  51. 81 0
      PDFViewer/src/main/res/layout/rv_item_home_fun_item_content.xml
  52. 20 0
      PDFViewer/src/main/res/layout/rv_item_home_fun_item_title.xml
  53. 12 0
      PDFViewer/src/main/res/menu/menu_activity_home.xml
  54. 30 0
      PDFViewer/src/main/res/values/strings.xml
  55. 6 4
      Samples/src/main/java/com/compdfkit/samples/util/FileUtils.java
  56. 1 1
      config.gradle

+ 38 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CFileUtils.java

@@ -43,6 +43,12 @@ public class CFileUtils {
 
     public static final String EXPORT_FOLDER = "compdfkit/edit/export";
 
+    public static String getAssetsTempFile(Context context, String assetsName) {
+        String path =  context.getCacheDir().getAbsolutePath();
+        copyFileFromAssets(context, assetsName, path, assetsName, false);
+        return path + "/" + assetsName;
+    }
+
 
     public static void copyFileFromAssets(Context context,
                                           String assetName,
@@ -300,6 +306,20 @@ public class CFileUtils {
         }
     }
 
+    public static void openFolder(Context context, File file){
+        try{
+            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+            intent.addCategory(Intent.CATEGORY_OPENABLE);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            intent.setDataAndType(getUriBySystem(context, file), "*/*");
+            context.startActivity(intent);
+        }catch (Exception e){
+            e.printStackTrace();
+
+        }
+
+    }
+
 
     public static String getFilePathFromUri(Context context, Uri uri) {
         String filePath = null;
@@ -417,4 +437,22 @@ public class CFileUtils {
         }
         return filePath.substring(lastPoi + 1);
     }
+
+
+    public static String fileSizeFormat(long fileSize){
+        final long MB = 1024 * 1024;
+        final int KB = 1024;
+        float size;
+        String unit = " M";
+        if (fileSize > MB) {
+            size = ((float) fileSize / (1024 * 1024));
+        } else if (fileSize > KB) {
+            size = ((float) fileSize / 1024);
+            unit = " KB";
+        } else {
+            size = fileSize;
+            unit = " B";
+        }
+        return String.format("%.2f", size) + unit;
+    }
 }

+ 9 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/date/CDateUtil.java

@@ -21,7 +21,9 @@ import java.util.TimeZone;
 public class CDateUtil {
 
     public static final String NORMAL_DATE_FORMAT = "yyyy_MM_dd_HH_mm_ss";
+
     public static final String NORMAL_DATE_FORMAT_1 = "yyyy.MM.dd HH:mm:ss";
+
     public static final String NORMAL_DATE_FORMAT_2 = "dd MMMM yyyy HH:mm:ss";
 
     /**
@@ -66,6 +68,13 @@ public class CDateUtil {
         return df.format(new Date());
     }
 
+    public static String format(long time, String pattern){
+        SimpleDateFormat df = new SimpleDateFormat(pattern);
+        Date date = new Date();
+        date.setTime(time);
+        return df.format(date);
+    }
+
     public static String formatPDFUTCDate(String pdfUTCDate){
         SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMddHHmmss'Z'");
         inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

+ 14 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CAlertDialog.java

@@ -29,6 +29,9 @@ public class CAlertDialog extends DialogFragment {
     public static final String EXTRA_TITLE = "extra_title";
 
     public static final String EXTRA_MESSAGE = "extra_message";
+
+    public static final String EXTRA_CONFIRM_BUTTON_TEXT = "extra_confirm_button_text";
+    public static final String EXTRA_CANCEL_BUTTON_TEXT = "extra_cancel_button_text";
     private AppCompatTextView tvTitle;
 
     private AppCompatTextView tvMessage;
@@ -50,6 +53,12 @@ public class CAlertDialog extends DialogFragment {
         return fragment;
     }
 
+    public static CAlertDialog newInstance(Bundle args) {
+        CAlertDialog fragment = new CAlertDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -84,6 +93,11 @@ public class CAlertDialog extends DialogFragment {
             tvTitle.setText(title);
             tvTitle.setVisibility(TextUtils.isEmpty(title) ? View.GONE : View.VISIBLE);
             tvMessage.setText(message);
+
+            String confirmBtn = getArguments().getString(EXTRA_CONFIRM_BUTTON_TEXT, getString(R.string.tools_okay));
+            String cancelBtn = getArguments().getString(EXTRA_CANCEL_BUTTON_TEXT, getString(R.string.tools_cancel));
+            btnConfirm.setText(confirmBtn);
+            btnCancel.setText(cancelBtn);
         }
     }
 

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/docseditor/pdfpageedit/CPDFPageEditDialogFragment.java

@@ -332,7 +332,7 @@ public class CPDFPageEditDialogFragment extends CBasicBottomSheetDialogFragment
         CSelectInsertPageTypeDialogFragment insertDialogFragment = CSelectInsertPageTypeDialogFragment.newInstance();
         insertDialogFragment.setInsertBlankPageClickListener(view -> {
             CInsertBlankPageDialogFragment blankPageDialogFragment = CInsertBlankPageDialogFragment.newInstance();
-            blankPageDialogFragment.initWithPDFView(pdfView);
+            blankPageDialogFragment.setDocument(pdfView.getCPdfReaderView().getPDFDocument());
             blankPageDialogFragment.setOnEditDoneCallback(() -> {
                 int[] pageNum = new int[1];
                 pageNum[0] = blankPageDialogFragment.getInsertPageIndex();

+ 20 - 8
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/docseditor/pdfpageeditinsert/CInsertBlankPageDialogFragment.java

@@ -22,12 +22,16 @@ import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment
 import com.compdfkit.tools.common.utils.CToastUtil;
 import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
-import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.docseditor.CPageEditBar;
 
 public class CInsertBlankPageDialogFragment extends CBasicBottomSheetDialogFragment implements View.OnClickListener {
+
+    public static final String EXTRA_SHOW_INSERT_LOCATION = "extra_show_insert_location";
+
+    public static final String EXTRA_DEFAULT_VISIBLE_PAGE_SIZE = "extra_default_visible_page_size";
+
     private CPageEditBar toolBar;
-    private CPDFViewCtrl pdfView;
+    private CPDFDocument document;
     private ConstraintLayout clPagesize;
     private AppCompatTextView tvCurPageSize;
     private RadioGroup rgPageSize;
@@ -40,6 +44,8 @@ public class CInsertBlankPageDialogFragment extends CBasicBottomSheetDialogFragm
     private RadioButton rbToPageLocationAfter;
     private AppCompatEditText etInputPageIndex;
 
+    private ConstraintLayout clInsertLocation;
+
     private RadioGroup rgInsertTo;
 
     private CPageEditBar.OnEditDoneCallback onEditDoneCallback;
@@ -50,8 +56,8 @@ public class CInsertBlankPageDialogFragment extends CBasicBottomSheetDialogFragm
         return new CInsertBlankPageDialogFragment();
     }
 
-    public void initWithPDFView(CPDFViewCtrl pdfView) {
-        this.pdfView = pdfView;
+    public void setDocument(CPDFDocument document) {
+        this.document = document;
     }
 
     @Override
@@ -94,6 +100,7 @@ public class CInsertBlankPageDialogFragment extends CBasicBottomSheetDialogFragm
         rbToPageLocationAfter = rootView.findViewById(R.id.rb_tools_edit_page_insert_location_after);
         etInputPageIndex = rootView.findViewById(R.id.et_tool_edit_page_enterpage);
         rgInsertTo = rootView.findViewById(R.id.rp_tools_edit_page_insertpage_location);
+        clInsertLocation = rootView.findViewById(R.id.cl_insert_location);
         etInputPageIndex.setOnFocusChangeListener((view, focus) -> {
             if (!focus) {
                 CViewUtils.hideKeyboard(etInputPageIndex);
@@ -163,6 +170,15 @@ public class CInsertBlankPageDialogFragment extends CBasicBottomSheetDialogFragm
                 updateDoneBtnStatus();
             }
         });
+
+        if (getArguments() != null) {
+            boolean showInsertLocation =  getArguments().getBoolean(EXTRA_SHOW_INSERT_LOCATION, true);
+            boolean visiblePageSize = getArguments().getBoolean(EXTRA_DEFAULT_VISIBLE_PAGE_SIZE, false);
+            clInsertLocation.setVisibility(showInsertLocation ?View.VISIBLE : View.GONE);
+
+            clPagesize.setVisibility(visiblePageSize ? View.VISIBLE : View.GONE);
+
+        }
     }
 
     public int getInsertPageIndex() {
@@ -170,10 +186,6 @@ public class CInsertBlankPageDialogFragment extends CBasicBottomSheetDialogFragm
     }
 
     private void insertBlankPage() {
-        if (pdfView == null || pdfView.getCPdfReaderView() == null) {
-            return;
-        }
-        CPDFDocument document = pdfView.getCPdfReaderView().getPDFDocument();
         if (document == null) {
             return;
         }

+ 2 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/docseditor/pdfpageeditinsert/CSelectInsertPageTypeDialogFragment.java

@@ -33,8 +33,8 @@ public class CSelectInsertPageTypeDialogFragment extends CBasicBottomSheetDialog
 
     @Override
     protected void onCreateView(View rootView) {
-        ConstraintLayout clInsertBlankPage = rootView.findViewById(R.id.cl_insert_blank_page);
-        ConstraintLayout clInsertPdfPage = rootView.findViewById(R.id.cl_insert_pdf_page);
+        ConstraintLayout clInsertBlankPage = rootView.findViewById(R.id.cl_add_watermark);
+        ConstraintLayout clInsertPdfPage = rootView.findViewById(R.id.cl_remove_watermark);
         clInsertBlankPage.setOnClickListener(blankClickListener);
         clInsertPdfPage.setOnClickListener(pdfClickListener);
     }

+ 1 - 0
ComPDFKit_Tools/src/main/res/layout/tools_pageedit_insert_blank_page_dialog_fragment.xml

@@ -140,6 +140,7 @@
             <View style="@style/tools_document_info_dividing_line_style" />
 
             <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_insert_location"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginStart="16dp"

+ 4 - 4
ComPDFKit_Tools/src/main/res/layout/tools_pageedit_insert_dialog_fragment.xml

@@ -6,7 +6,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_insert_blank_page"
+        android:id="@+id/cl_add_watermark"
         android:layout_width="match_parent"
         android:layout_height="56dp"
         app:layout_constraintTop_toTopOf="parent"
@@ -32,14 +32,14 @@
         android:layout_width="match_parent"
         android:layout_height="0.5dp"
         android:background="@color/tools_control_line_color"
-        app:layout_constraintTop_toBottomOf="@id/cl_insert_blank_page"
+        app:layout_constraintTop_toBottomOf="@id/cl_add_watermark"
         />
 
     <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_insert_pdf_page"
+        android:id="@+id/cl_remove_watermark"
         android:layout_width="match_parent"
         android:layout_height="56dp"
-        app:layout_constraintTop_toBottomOf="@id/cl_insert_blank_page"
+        app:layout_constraintTop_toBottomOf="@id/cl_add_watermark"
         android:paddingHorizontal="24dp"
         android:background="@drawable/tools_common_btn_rectangle_ripple"
         >

+ 0 - 2
ComPDFKit_Tools/src/main/res/values-zh-rCN/tools_strings.xml

@@ -149,8 +149,6 @@
 
     <string name="tools_url">超链接</string>
     <string name="tools_email">电子邮箱</string>
-    <string name="tools_compdf_website">https://www.compdf.com</string>
-    <string name="tools_compdf_email">support@compdf.com</string>
 
     <string name="tools_annot_please_enter_text">请输入文字</string>
     <string name="tools_tip">提示:</string>

+ 35 - 0
ComPDFKit_Tools/src/main/res/values/tools_strings.xml

@@ -151,6 +151,14 @@
     <string name="tools_email">Email</string>
     <string name="tools_compdf_website">https://www.compdf.com</string>
     <string name="tools_compdf_email">support@compdf.com</string>
+    <string name="tools_about_us_url">https://www.compdf.com/company/about</string>
+    <string name="tools_technical_support_url">https://www.compdf.com/support</string>
+    <string name="tools_contact_sales_url">https://www.compdf.com/contact-sales</string>
+    <string name="tools_privacy_policy_url">https://www.compdf.com/privacy-policy</string>
+    <string name="tools_terms_of_service_url">https://www.compdf.com/terms-of-service</string>
+    <string name="tools_compdf_security_url">https://www.compdf.com/pdf-sdk/security</string>
+    <string name="tools_compdf_compare_url">https://www.compdf.com/pdf-sdk/document-comparison</string>
+    <string name="tools_compdf_conversion_url">https://www.compdf.com/conversion</string>
 
     <string name="tools_annot_please_enter_text">Please enter text</string>
     <string name="tools_tip">Tip:</string>
@@ -434,6 +442,8 @@
     <string name="tools_security">Security</string>
     <string name="tools_add_security">Add Security</string>
     <string name="tools_add_watermark">Add Watermark</string>
+    <string name="tools_remove_watermark">Remove Watermark</string>
+    <string name="tools_remove_watermark_info">Are you sure to delete the watermarks?</string>
     <string name="tools_document_encryption">Document encryption</string>
     <string name="tools_setting_password">Setting Password</string>
     <string name="tools_setting_permission_password">Setting Permission Password</string>
@@ -457,5 +467,30 @@
     <string name="tools_tile">Tile</string>
     <string name="tools_current_page">Current Page</string>
     <string name="tools_all_page">All Pages</string>
+
+
+    <string name="tools_setting">Setting</string>
+    <string name="tools_highlight_link_area">Highlight Link area</string>
+    <string name="tools_highlight_form_area">Highlight Form area</string>
+    <string name="tools_document_author">Document Author</string>
+    <string name="tools_compdfkit_author">ComPDFKit</string>
+    <string name="tools_global_setting">Global setting</string>
+    <string name="tools_sdk_information">SDK Information</string>
+    <string name="tools_versions">Versions</string>
+    <string name="tools_company_information">Company Information</string>
+    <string name="tools_about_us">About Us</string>
+    <string name="tools_technical_support">Technical Support</string>
+    <string name="tools_contact_sales">Contact Sales</string>
+    <string name="tools_copy_right">© 2014-2023 PDF Technologies, Inc. All Rights\nReserved.</string>
+    <string name="tools_privacy_policy">Privacy Policy</string>
+    <string name="tools_terms_of_service">Terms of Service</string>
+    <string name="tools_selecting_a_document">Selecting a Document</string>
+    <string name="tools_already_saved_as">Already saved as</string>
+    <string name="tools_open_folder">OPEN FOLDER</string>
+    <string name="tools_check">CHECK</string>
+    <string name="tools_watermark_removed_success">Watermarks Removed Successfully!</string>
+    <string name="tools_watermark_removed_failed">Failed to Remove the Watermarks.</string>
+    <string name="tools_watermark_add_success">Add Watermarks Successfully!</string>
+
     <!--    Security Mode End-->
 </resources>

+ 13 - 4
PDFViewer/src/main/AndroidManifest.xml

@@ -12,16 +12,25 @@
         android:theme="@style/Basic_Theme"
         android:requestLegacyExternalStorage="true"
         >
+        <activity android:name=".home.HomeActivity"
+            android:exported="true"
+            >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".home.SettingActivity"
+            android:exported="true"
+            />
         <activity
             android:name=".MainActivity"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:windowSoftInputMode="adjustPan"
             android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
 
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
 
 
             <intent-filter tools:ignore="AppLinkUrlError">

+ 49 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/Configuration.java

@@ -0,0 +1,49 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer;
+
+import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
+
+import java.io.Serializable;
+
+
+public class Configuration implements Serializable {
+
+    private CPreviewMode mode;
+
+    private boolean highlightLink;
+
+    private boolean highlightForm;
+
+    public CPreviewMode getMode() {
+        return mode;
+    }
+
+    public void setMode(CPreviewMode mode) {
+        this.mode = mode;
+    }
+
+    public boolean isHighlightLink() {
+        return highlightLink;
+    }
+
+    public void setHighlightLink(boolean highlightLink) {
+        this.highlightLink = highlightLink;
+    }
+
+    public boolean isHighlightForm() {
+        return highlightForm;
+    }
+
+    public void setHighlightForm(boolean highlightForm) {
+        this.highlightForm = highlightForm;
+    }
+
+}

+ 51 - 5
PDFViewer/src/main/java/com/compdfkit/pdfviewer/MainActivity.java

@@ -19,6 +19,7 @@ import android.content.Intent;
 import android.os.Build;
 import android.os.Bundle;
 import android.text.InputType;
+import android.text.TextUtils;
 import android.view.View;
 import android.widget.Toast;
 
@@ -76,6 +77,12 @@ import java.util.ArrayList;
 
 public class MainActivity extends CBasicPDFActivity {
 
+    public static final String EXTRA_FILE_PATH = "file_path";
+
+    public static final String EXTRA_FILE_PASSWORD = "file_password";
+
+    public static final String EXTRA_CONFIGURATION = "extra_configuration";
+
     /**
      * assets folder pdf file
      */
@@ -122,22 +129,31 @@ public class MainActivity extends CBasicPDFActivity {
         initFormToolbar();
         initEditBar();
         initSignatureToolbar();
-        setPreviewMode(CPreviewMode.Viewer);
+        parseConfiguration();
         onDoNext();
     }
 
-    private void initPDFView() {
-        if (getIntent().getData() != null) {
+    private void initDocument(){
+        String password = getIntent().getStringExtra(EXTRA_FILE_PASSWORD);
+        if (!TextUtils.isEmpty(getIntent().getStringExtra(EXTRA_FILE_PATH))) {
+            String path = getIntent().getStringExtra(EXTRA_FILE_PATH);
+            binding.pdfView.openPDF(path, password);
+            binding.editToolBar.setEditMode(false);
+        } else if (getIntent().getData() != null) {
             CFileUtils.takeUriPermission(this, getIntent().getData());
-            binding.pdfView.openPDF(getIntent().getData());
+            binding.pdfView.openPDF(getIntent().getData(), password);
             binding.editToolBar.setEditMode(false);
-        } else {
+        }else {
             CExtractAssetFileTask.extract(this, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> {
                         binding.pdfView.openPDF(filePath);
                         binding.editToolBar.setEditMode(false);
                     }
             );
         }
+    }
+
+    private void initPDFView() {
+        initDocument();
 
         binding.pdfView.getCPdfReaderView().setMinScaleEnable(false);
         resetContextMenu(binding.pdfView, CPreviewMode.Viewer);
@@ -448,6 +464,36 @@ public class MainActivity extends CBasicPDFActivity {
         });
     }
 
+    private void parseConfiguration(){
+        Configuration configuration;
+        if (!getIntent().hasExtra(EXTRA_CONFIGURATION)) {
+            setPreviewMode(CPreviewMode.Viewer);
+            return;
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            configuration = getIntent().getSerializableExtra(EXTRA_CONFIGURATION, Configuration.class);
+        }else {
+            configuration = (Configuration) getIntent().getSerializableExtra(EXTRA_CONFIGURATION);
+        }
+        if (configuration != null) {
+            binding.pdfView.getCPdfReaderView().setLinkHighlight(configuration.isHighlightLink());
+            binding.pdfView.getCPdfReaderView().setFormFieldHighlight(configuration.isHighlightForm());
+            if (configuration.getMode() != CPreviewMode.PageEdit){
+                setPreviewMode(configuration.getMode());
+            }else {
+                setPreviewMode(CPreviewMode.Viewer);
+                showPageEdit(binding.pdfView, true, () -> {
+                    if (curEditMode > 0 && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
+                        CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
+                        if (!editManager.isEditMode()) {
+                            editManager.beginEdit(curEditMode);
+                        }
+                    }
+                });
+            }
+        }
+    }
+
     /**
      *
      */

+ 73 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/CHomeFunListAdapter.java

@@ -0,0 +1,73 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home;
+
+import static com.compdfkit.tools.common.utils.date.CDateUtil.NORMAL_DATE_FORMAT_1;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickAdapter;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickViewHolder;
+import com.compdfkit.tools.common.utils.date.CDateUtil;
+
+import java.io.File;
+
+
+public class CHomeFunListAdapter extends CBaseQuickAdapter<HomeFunBean, CBaseQuickViewHolder> {
+
+    public static final int ITEM_TITLE = 0;
+
+    public static final int ITEM_CONTENT = 1;
+
+    @Override
+    protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
+        if (viewType == ITEM_TITLE){
+            return new CBaseQuickViewHolder(R.layout.rv_item_home_fun_item_title, parent);
+        }else {
+            return new CBaseQuickViewHolder(R.layout.rv_item_home_fun_item_content, parent);
+        }
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, HomeFunBean item) {
+        if (item.isHead()) {
+            holder.setText(R.id.tv_title, item.getTitle());
+        } else {
+            holder.setText(R.id.tv_title, item.getTitle());
+
+            if (item.getType() == HomeFunBean.FunType.SamplePDF){
+                File file = new File(item.getFilePath());
+                String lastModifyTime = CDateUtil.format(file.lastModified(), NORMAL_DATE_FORMAT_1);
+                String fileSize = CFileUtils.fileSizeFormat(file.length());
+
+                holder.setText(R.id.tv_desc, lastModifyTime + "  " + fileSize);
+                holder.setVisible(R.id.iv_pdf_sample_icon, true);
+                holder.setVisible(R.id.iv_icon, false);
+            }else {
+                holder.setText(R.id.tv_desc, item.getDescription());
+                holder.setImageResource(R.id.iv_icon, item.getIconResId());
+                holder.setVisible(R.id.iv_pdf_sample_icon, false);
+                holder.setVisible(R.id.iv_icon, true);
+            }
+        }
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        if (list.get(position).isHead()) {
+            return ITEM_TITLE;
+        }else {
+            return ITEM_CONTENT;
+        }
+    }
+}

+ 144 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/DocumentListFragment.java

@@ -0,0 +1,144 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.compdfkit.core.common.CPDFDocumentException;
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.databinding.FragmentDocumentListBinding;
+import com.compdfkit.pdfviewer.home.fun.FunctionFactory;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.activitycontracts.CSelectPDFDocumentResultContract;
+import com.compdfkit.tools.docseditor.pdfpageeditinsert.CInsertBlankPageDialogFragment;
+import com.compdfkit.tools.docseditor.pdfpageeditinsert.CSelectInsertPageTypeDialogFragment;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+
+public class DocumentListFragment extends Fragment {
+
+    private FragmentDocumentListBinding binding;
+
+    private CHomeFunListAdapter funListAdapter;
+
+    private HomeFunBean.FunType funType;
+
+    private ActivityResultLauncher<Void> selectDocumentLauncher = registerForActivityResult(new CSelectPDFDocumentResultContract(), uri -> {
+        enterFunctions(null, uri);
+    });
+
+    public static DocumentListFragment newInstance(HomeFunBean.FunType funType) {
+        Bundle args = new Bundle();
+        DocumentListFragment fragment = new DocumentListFragment();
+        fragment.setFunType(funType);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    public void setFunType(HomeFunBean.FunType funType) {
+        this.funType = funType;
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragmentDocumentListBinding.inflate(inflater, container, false);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        initDocumentList();
+        binding.fabAdd.setOnClickListener(v -> {
+            // A pop-up window will pop up, giving you the option to
+            // create a blank page document or select a pdf file from the file manager.
+            CSelectInsertPageTypeDialogFragment insertDialogFragment = CSelectInsertPageTypeDialogFragment.newInstance();
+            insertDialogFragment.setInsertBlankPageClickListener(v1 -> {
+                // show create a blank page document dialog
+                CPDFDocument document = CPDFDocument.createDocument(getContext());
+                CInsertBlankPageDialogFragment blankPageDialogFragment = CInsertBlankPageDialogFragment.newInstance();
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(CInsertBlankPageDialogFragment.EXTRA_SHOW_INSERT_LOCATION, false);
+                bundle.putBoolean(CInsertBlankPageDialogFragment.EXTRA_DEFAULT_VISIBLE_PAGE_SIZE, true);
+                blankPageDialogFragment.setArguments(bundle);
+                blankPageDialogFragment.setDocument(document);
+                blankPageDialogFragment.setOnEditDoneCallback(() -> {
+                    try {
+                        // create document
+                        String fileName = "SampleBlankPDF.pdf";
+                        File pdfFile = new File(getContext().getCacheDir(), CFileUtils.CACHE_FOLDER + File.separator + fileName);
+                        pdfFile = CFileUtils.renameNameSuffix(pdfFile);
+                        pdfFile.getParentFile().mkdirs();
+                        // save file
+                        boolean result = document.saveAs(pdfFile.getAbsolutePath(), false);
+                        if (result) {
+                            // Display corresponding functions according to the selected function type
+                            enterFunctions(pdfFile.getAbsolutePath(), null);
+                        }
+                    } catch (CPDFDocumentException e) {
+
+                    }
+                });
+                blankPageDialogFragment.show(getChildFragmentManager(), "blank page");
+                insertDialogFragment.dismiss();
+            });
+            insertDialogFragment.setInsertPdfPageClickListener(v1 -> {
+                // Enter the file manager and select a pdf file
+                selectDocumentLauncher.launch(null);
+                insertDialogFragment.dismiss();
+            });
+            insertDialogFragment.show(getChildFragmentManager(), "selectInsertTypeDialog");
+        });
+    }
+
+    /**
+     * Initialize the sample document list
+     */
+    private void initDocumentList() {
+        funListAdapter = new CHomeFunListAdapter();
+        funListAdapter.setList(getDocumentList());
+        binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        binding.recyclerView.setAdapter(funListAdapter);
+        funListAdapter.setOnItemClickListener((adapter, view, position) -> {
+            HomeFunBean bean = adapter.list.get(position);
+            if (bean.getType() == HomeFunBean.FunType.SamplePDF) {
+                // Display corresponding functions according to the selected function type
+                enterFunctions(bean.getFilePath(), null);
+            }
+        });
+    }
+
+    public List<HomeFunBean> getDocumentList() {
+        return Arrays.asList(
+                HomeFunBean.head(getContext(), R.string.tools_selecting_a_document),
+                HomeFunBean.assetsFile(getContext(), "PDF32000_2008.pdf")
+        );
+    }
+
+    private void enterFunctions(String filePath, Uri uri) {
+        FunctionFactory factory = new FunctionFactory(this, filePath, uri);
+        factory.getImpl(funType).run();
+    }
+}

+ 55 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeActivity.java

@@ -0,0 +1,55 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.databinding.ActivityHomeBinding;
+
+
+public class HomeActivity extends AppCompatActivity {
+
+    private ActivityHomeBinding binding;
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = ActivityHomeBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+        binding.toolBar.setOnMenuItemClickListener(item -> {
+            if (item.getItemId() == R.id.home_setting) {
+                startActivity(new Intent(this, SettingActivity.class));
+                return true;
+            }
+            return false;
+        });
+
+        getSupportFragmentManager()
+                .beginTransaction()
+                .add(R.id.fragment_content, new HomeFunFragment(), "homeFunFragment")
+                .commit();
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (getSupportFragmentManager().getBackStackEntryCount() <=0){
+            super.onBackPressed();
+        }else {
+            getSupportFragmentManager().popBackStack();
+        }
+    }
+}

+ 140 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeFunBean.java

@@ -0,0 +1,140 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home;
+
+
+import android.content.Context;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.StringRes;
+
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.tools.common.utils.CFileUtils;
+
+public class HomeFunBean {
+
+    public enum FunType {
+
+        SamplePDF,
+
+        Viewer,
+
+        Annotations,
+
+        Forms,
+
+        DocumentEditor,
+
+        ContentEditor,
+
+        Signature,
+
+        Security,
+
+        Redaction,
+
+        Watermark,
+
+        CompareDocuments,
+
+        Conversion,
+
+        Compress,
+
+        Measurement;
+    }
+
+    private boolean isHead;
+
+    private FunType type;
+
+    private int iconResId;
+
+    private String title;
+
+    private String description;
+
+    private String filePath;
+
+    public HomeFunBean(Context context, FunType funType, @DrawableRes int icon, @StringRes int title, @StringRes int description) {
+        this.type = funType;
+        this.iconResId = icon;
+        this.title = context.getString(title);
+        this.description = context.getString(description);
+    }
+
+    public HomeFunBean() {
+
+    }
+
+    public static HomeFunBean head(Context context, @StringRes int title) {
+        HomeFunBean funBean = new HomeFunBean();
+        funBean.setHead(true);
+        funBean.setTitle(context.getString(title));
+        return funBean;
+    }
+
+    public static HomeFunBean assetsFile(Context context, String assetsName) {
+        HomeFunBean funBean = new HomeFunBean();
+        funBean.setType(FunType.SamplePDF);
+        funBean.setTitle(assetsName);
+        funBean.setIconResId(R.drawable.ic_fun_samples_pdf);
+        funBean.setFilePath(CFileUtils.getAssetsTempFile(context, assetsName));
+        return funBean;
+    }
+
+    public int getIconResId() {
+        return iconResId;
+    }
+
+    public void setIconResId(@DrawableRes int iconResId) {
+        this.iconResId = iconResId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public FunType getType() {
+        return type;
+    }
+
+    public void setType(FunType type) {
+        this.type = type;
+    }
+
+    public void setHead(boolean head) {
+        isHead = head;
+    }
+
+    public boolean isHead() {
+        return isHead;
+    }
+
+    public void setFilePath(String filePath) {
+        this.filePath = filePath;
+    }
+
+    public String getFilePath() {
+        return filePath;
+    }
+}

+ 104 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeFunFragment.java

@@ -0,0 +1,104 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.compdfkit.pdfviewer.MainActivity;
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.databinding.FragmentHomeBinding;
+import com.compdfkit.pdfviewer.home.datas.FunDatas;
+import com.compdfkit.ui.utils.CPDFCommomUtils;
+
+
+public class HomeFunFragment extends Fragment {
+
+    private CHomeFunListAdapter funListAdapter;
+
+    private FragmentHomeBinding binding;
+
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragmentHomeBinding.inflate(inflater, container, false);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        initFunList();
+    }
+
+    private void initFunList() {
+        funListAdapter = new CHomeFunListAdapter();
+        funListAdapter.setList(FunDatas.getFunList(getContext()));
+        binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        binding.recyclerView.setAdapter(funListAdapter);
+        funListAdapter.setOnItemClickListener((adapter, view, position) -> {
+            HomeFunBean homeFunBean = funListAdapter.list.get(position);
+            switch (homeFunBean.getType()) {
+                case SamplePDF:
+                    Intent intent = new Intent(getContext(), MainActivity.class);
+                    intent.putExtra(MainActivity.EXTRA_FILE_PATH, homeFunBean.getFilePath());
+                    startActivity(intent);
+                    break;
+                case Viewer:
+                case Annotations:
+                case Forms:
+                case Signature:
+                case DocumentEditor:
+                case ContentEditor:
+                case Security:
+                case Watermark:
+                    showDocumentListFragment(homeFunBean.getType());
+                    break;
+                case Redaction:
+                    CPDFCommomUtils.gotoWebsite(getContext(), getString(R.string.tools_compdf_security_url), null);
+                    break;
+                case CompareDocuments:
+                    CPDFCommomUtils.gotoWebsite(getContext(), getString(R.string.tools_compdf_compare_url), null);
+                    break;
+                case Conversion:
+                    CPDFCommomUtils.gotoWebsite(getContext(), getString(R.string.tools_compdf_conversion_url), null);
+                    break;
+                case Compress:
+                    CPDFCommomUtils.gotoWebsite(getContext(), getString(R.string.tools_contact_sales_url), null);
+                    break;
+                case Measurement:
+                    CPDFCommomUtils.gotoWebsite(getContext(), getString(R.string.tools_contact_sales_url), null);
+                    break;
+                default:
+                    break;
+            }
+        });
+
+    }
+
+    private void showDocumentListFragment(HomeFunBean.FunType funType) {
+        getParentFragmentManager()
+                .beginTransaction()
+                .addToBackStack(null)
+                .setCustomAnimations(R.anim.tools_slide_in_right, R.anim.tools_slide_out_left, R.anim.tools_slide_in_left, R.anim.tools_slide_out_right)
+                .replace(R.id.fragment_content, DocumentListFragment.newInstance(funType), funType.name() + "_DocumentListFragment")
+                .commit();
+    }
+
+}

+ 54 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/SelectWatermarkFunFragment.java

@@ -0,0 +1,54 @@
+package com.compdfkit.pdfviewer.home;
+
+import android.view.View;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment;
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+
+public class SelectWatermarkFunFragment extends CBasicBottomSheetDialogFragment {
+
+    private View.OnClickListener addWatermarkClickListener;
+
+    private View.OnClickListener removeWatermarkClickListener;
+
+    public static SelectWatermarkFunFragment newInstance() {
+        return new SelectWatermarkFunFragment();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
+        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+        behavior.setSkipCollapsed(true);
+    }
+
+    @Override
+    protected int layoutId() {
+        return R.layout.fragment_watermark_select_fun;
+    }
+
+    @Override
+    protected void onCreateView(View rootView) {
+        ConstraintLayout clAddWatermark = rootView.findViewById(R.id.cl_add_watermark);
+        ConstraintLayout clRemoveWatermark = rootView.findViewById(R.id.cl_remove_watermark);
+        clAddWatermark.setOnClickListener(addWatermarkClickListener);
+        clRemoveWatermark.setOnClickListener(removeWatermarkClickListener);
+    }
+
+    @Override
+    protected void onViewCreate() {
+
+    }
+
+    public void setAddWatermarkClickListener(View.OnClickListener addWatermarkClickListener) {
+        this.addWatermarkClickListener = addWatermarkClickListener;
+    }
+
+    public void setRemoveWatermarkClickListener(View.OnClickListener removeWatermarkClickListener) {
+        this.removeWatermarkClickListener = removeWatermarkClickListener;
+    }
+}

+ 76 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/SettingActivity.java

@@ -0,0 +1,76 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.compdfkit.core.document.CPDFSdk;
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.databinding.ActivitySettingBinding;
+import com.compdfkit.pdfviewer.home.datas.SettingDatas;
+import com.compdfkit.ui.utils.CPDFCommomUtils;
+
+
+public class SettingActivity  extends AppCompatActivity implements View.OnClickListener{
+
+    private ActivitySettingBinding binding;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = ActivitySettingBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+
+        binding.tvVersionValue.setText(CPDFSdk.getSDKVersion());
+        binding.tvCompdfWebsite.setOnClickListener(this);
+        binding.tvAboutUs.setOnClickListener(this);
+        binding.tvTechnicalSupport.setOnClickListener(this);
+        binding.tvContactSales.setOnClickListener(this);
+        binding.tvSupportEmail.setOnClickListener(this);
+        binding.tvPrivacyPolicy.setOnClickListener(this);
+        binding.tvTermsOfService.setOnClickListener(this);
+        binding.toolBar.setBackBtnClickListener(this);
+
+        binding.swHighlightLink.setChecked(SettingDatas.isHighlightLink(this));
+        binding.swHighlightForm.setChecked(SettingDatas.isHighlightForm(this));
+
+        binding.swHighlightForm.setListener((buttonView, isChecked) -> {
+            SettingDatas.setHighlightForm(this, isChecked);
+        });
+        binding.swHighlightLink.setListener((buttonView, isChecked) -> {
+            SettingDatas.setHighlightLink(this, isChecked);
+        });
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.tv_compdf_website){
+            CPDFCommomUtils.gotoWebsite(this, getString(R.string.tools_compdf_website), null);
+        } else if (v.getId() == R.id.tv_about_us) {
+            CPDFCommomUtils.gotoWebsite(this, getString(R.string.tools_about_us_url), null);
+        } else if (v.getId() == R.id.tv_technical_support) {
+            CPDFCommomUtils.gotoWebsite(this, getString(R.string.tools_technical_support_url), null);
+        } else if (v.getId() == R.id.tv_contact_sales) {
+            CPDFCommomUtils.gotoWebsite(this, getString(R.string.tools_contact_sales_url), null);
+        } else if (v.getId() == R.id.tv_support_email) {
+            CPDFCommomUtils.gotoEmail(this, "mailto:"+getString(R.string.tools_compdf_email), null);
+        } else if (v.getId() == R.id.tv_privacy_policy) {
+            CPDFCommomUtils.gotoWebsite(this, getString(R.string.tools_privacy_policy_url), null);
+        } else if (v.getId() == R.id.tv_terms_of_service) {
+            CPDFCommomUtils.gotoWebsite(this, getString(R.string.tools_terms_of_service_url), null);
+        } else if (v.getId() == binding.toolBar.getIvToolBarBackBtn().getId()) {
+            onBackPressed();
+        }
+    }
+}

+ 44 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/datas/FunDatas.java

@@ -0,0 +1,44 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.datas;
+
+
+import android.content.Context;
+
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.home.HomeFunBean;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class FunDatas {
+
+
+    public static List<HomeFunBean> getFunList(Context context) {
+        return Arrays.asList(
+                HomeFunBean.head(context, R.string.tools_quick_start),
+                new HomeFunBean(context, HomeFunBean.FunType.Viewer, R.drawable.ic_fun_viewer, R.string.tools_fun_viewer, R.string.tools_fun_viewer_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Annotations, R.drawable.ic_fun_annotations, R.string.tools_fun_annotations, R.string.tools_fun_annotations_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Forms, R.drawable.ic_fun_form, R.string.tools_fun_forms, R.string.tools_fun_forms_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Signature, R.drawable.ic_fun_digital_signature, R.string.tools_fun_signatures, R.string.tools_fun_signatures_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.DocumentEditor, R.drawable.ic_fun_document_editor, R.string.tools_fun_document_editor, R.string.tools_fun_document_editor_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.ContentEditor, R.drawable.ic_fun_content_editor, R.string.tools_fun_content_editor, R.string.tools_fun_content_editor_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Security, R.drawable.ic_fun_security, R.string.tools_fun_security, R.string.tools_fun_security_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Redaction, R.drawable.ic_fun_redaction, R.string.tools_fun_redaction, R.string.tools_fun_redaction_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Watermark, R.drawable.ic_fun_watermark, R.string.tools_fun_watermark, R.string.tools_fun_watermark_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.CompareDocuments, R.drawable.ic_fun_compare_documents, R.string.tools_fun_compare_documents, R.string.tools_fun_compare_documents_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Conversion, R.drawable.ic_fun_conversion, R.string.tools_fun_conversion, R.string.tools_fun_conversion_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Compress, R.drawable.ic_fun_compress, R.string.tools_fun_compress, R.string.tools_fun_compress_desc),
+                new HomeFunBean(context, HomeFunBean.FunType.Measurement, R.drawable.ic_fun_mesurement, R.string.tools_fun_measurement, R.string.tools_fun_measurement_desc),
+                HomeFunBean.head(context, R.string.tools_click_to_open_process),
+                HomeFunBean.assetsFile(context, "PDF32000_2008.pdf")
+        );
+    }
+}

+ 32 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/datas/SettingDatas.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.datas;
+
+
+import android.content.Context;
+
+public class SettingDatas {
+
+    public static boolean isHighlightLink(Context context){
+        return SpUtils.getBooleanValue(context, "highlight_link", false);
+    }
+
+    public static void setHighlightLink(Context context, boolean highLight){
+        SpUtils.setBooleanValue(context, "highlight_link", highLight);
+    }
+
+    public static boolean isHighlightForm(Context context){
+        return SpUtils.getBooleanValue(context, "highlight_form", false);
+    }
+
+    public static void setHighlightForm(Context context, boolean highLight){
+        SpUtils.setBooleanValue(context, "highlight_form", highLight);
+    }
+}

+ 39 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/datas/SpUtils.java

@@ -0,0 +1,39 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.datas;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+
+public class SpUtils {
+
+    private static final String SP_NAME = "compdfkit";
+
+    private static SharedPreferences getSharedPreferences(Context context){
+        return context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
+    }
+
+    public static boolean getBooleanValue(Context context, String key, boolean defaultValue){
+        return getSharedPreferences(context).getBoolean(key, defaultValue);
+    }
+
+    public static void setBooleanValue(Context context, String key, boolean value){
+        getSharedPreferences(context).edit().putBoolean(key, value).apply();
+    }
+
+    public static String getStringValue(Context context, String key, String defaultValue){
+        return getSharedPreferences(context).getString(key, defaultValue);
+    }
+
+    public static void setStringValue(Context context, String key, String value){
+        getSharedPreferences(context).edit().putString(key, value).apply();
+    }
+}

+ 27 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/BasicDocumentFunctions.java

@@ -0,0 +1,27 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.fun;
+
+
+import androidx.fragment.app.Fragment;
+
+import com.compdfkit.pdfviewer.home.HomeFunBean;
+
+public abstract class BasicDocumentFunctions implements IDocumentFunctions{
+
+    protected Fragment fragment;
+
+    protected HomeFunBean.FunType funType;
+
+    public BasicDocumentFunctions(Fragment fragment, HomeFunBean.FunType funType){
+        this.fragment = fragment;
+        this.funType = funType;
+    }
+}

+ 125 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/DocumentEncryptionFunctionImpl.java

@@ -0,0 +1,125 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.fun;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import androidx.fragment.app.Fragment;
+
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.home.HomeFunBean;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
+import com.compdfkit.tools.security.encryption.CDocumentEncryptionDialog;
+import com.compdfkit.tools.security.encryption.CInputOwnerPwdDialog;
+
+import java.io.File;
+
+
+public class DocumentEncryptionFunctionImpl extends OpenPDFFunctionsImpl{
+
+    public DocumentEncryptionFunctionImpl(Fragment fragment, HomeFunBean.FunType funType) {
+        super(fragment, funType);
+    }
+
+    @Override
+    public void run() {
+        security(filePath, uri);
+    }
+
+    /**
+     * Examples of PDF security functions, which can set passwords and remove passwords
+     * @param filePath
+     * @param uri
+     */
+    private void security(String filePath, Uri uri){
+        // Check if password exists in pdf file
+        CPDFDocument document = new CPDFDocument(fragment.getContext());
+        CPDFDocument.PDFDocumentError error;
+        if (!TextUtils.isEmpty(filePath)){
+            error = document.open(filePath);
+        } else {
+            error = document.open(uri);
+        }
+        if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorSuccess){
+            // If there is no owner permission or the document does not have permission,
+            // you will be prompted to enter the owner password.
+            if (document.getPermissions() == CPDFDocument.PDFDocumentPermissions.PDFDocumentPermissionsUser) {
+                showInputOwnerPasswordDialog(document);
+                return;
+            }
+        } else if (error == CPDFDocument.PDFDocumentError.PDFDocumentErrorPassword) {
+            // The password is incorrect, indicating that the document has been encrypted and
+            // a pop-up window for entering the password is displayed.
+            showInputOwnerPasswordDialog(document);
+            return;
+        }
+        // Display the dialog for setting the document encryption function
+        showDocumentEncryptionDialog(document);
+    }
+
+    /**
+     * Display the dialog for setting the document encryption function
+     *
+     * @param document
+     */
+    private void showDocumentEncryptionDialog(CPDFDocument document){
+        CDocumentEncryptionDialog encryptionDialog = CDocumentEncryptionDialog.newInstance();
+        encryptionDialog.setDocument(document);
+        encryptionDialog.setEncryptionResultListener((isRemoveSecurity, result, file, password) -> {
+            encryptionDialog.dismiss();
+            int tipsResId;
+            if (isRemoveSecurity){
+                tipsResId = result ? R.string.tools_password_remove_success : R.string.tools_password_remove_fail;
+            }else {
+                tipsResId = result ? R.string.tools_set_password_successfully : R.string.tools_set_password_failures;
+            }
+            String msg = fragment.getContext().getString(R.string.tools_already_saved_as) + file;
+            showResultDialog(fragment.getActivity().getString(tipsResId), msg, file, password);
+        });
+        encryptionDialog.show(fragment.getChildFragmentManager(), "documentEncryptionDialog");
+    }
+
+    private void showInputOwnerPasswordDialog(CPDFDocument document){
+        CInputOwnerPwdDialog ownerPwdDialog = CInputOwnerPwdDialog.newInstance();
+        ownerPwdDialog.setDocument(document);
+        ownerPwdDialog.setConfirmClickListener(ownerPassword -> {
+            ownerPwdDialog.dismiss();
+            document.reload(ownerPassword);
+            showDocumentEncryptionDialog(document);
+        });
+        ownerPwdDialog.setCancelClickListener(v -> {
+            ownerPwdDialog.dismiss();
+        });
+        ownerPwdDialog.show(fragment.getChildFragmentManager(), "inputOwnerPwdDialog");
+    }
+
+    private void showResultDialog(String title, String msg, String filePath, String password){
+        Bundle bundle = new Bundle();
+        bundle.putString(CAlertDialog.EXTRA_TITLE, title);
+        bundle.putString(CAlertDialog.EXTRA_MESSAGE, msg);
+        bundle.putString(CAlertDialog.EXTRA_CONFIRM_BUTTON_TEXT, fragment.getString(R.string.tools_check));
+        bundle.putString(CAlertDialog.EXTRA_CANCEL_BUTTON_TEXT, fragment.getString(R.string.tools_open_folder));
+        CAlertDialog alertDialog = CAlertDialog.newInstance(bundle);
+        alertDialog.setCancelClickListener(v -> {
+            CFileUtils.openFolder(fragment.getContext(), new File(filePath).getParentFile());
+            alertDialog.dismiss();
+        });
+        alertDialog.setConfirmClickListener(v -> {
+            startPDFActivity(filePath, null, password);
+            alertDialog.dismiss();
+        });
+        alertDialog.show(fragment.getParentFragmentManager(), "tips");
+    }
+
+}

+ 52 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/FunctionFactory.java

@@ -0,0 +1,52 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.fun;
+
+
+import android.net.Uri;
+
+import androidx.fragment.app.Fragment;
+
+import com.compdfkit.pdfviewer.home.HomeFunBean;
+
+public class FunctionFactory {
+
+    private String filePath;
+
+    private Uri uri;
+
+    private Fragment fragment;
+
+    public FunctionFactory(Fragment fragment, String filePath, Uri uri){
+        this.filePath = filePath;
+        this.uri = uri;
+        this.fragment = fragment;
+    }
+
+    public IDocumentFunctions getImpl(HomeFunBean.FunType funType){
+        switch (funType){
+            case Security:
+                DocumentEncryptionFunctionImpl encryptionFunction = new DocumentEncryptionFunctionImpl(fragment, funType);
+                encryptionFunction.setPDFFile(filePath, uri, null);
+                return encryptionFunction;
+            case Watermark:
+                WatermarkFunctionImpl watermarkFunction = new WatermarkFunctionImpl(fragment, funType);
+                watermarkFunction.setPDFFile(filePath, uri, null);
+                return watermarkFunction;
+            default:
+                // Viewer、Annotations、Forms、Signatures、DocumentEditor、ContentEditor
+                // open pdf activity show pdf file
+                OpenPDFFunctionsImpl openPDFFunctions = new OpenPDFFunctionsImpl(fragment, funType);
+                openPDFFunctions.setPDFFile(filePath, uri, null);
+                return openPDFFunctions;
+        }
+    }
+
+}

+ 15 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/IDocumentFunctions.java

@@ -0,0 +1,15 @@
+package com.compdfkit.pdfviewer.home.fun;
+
+import androidx.fragment.app.FragmentManager;
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2023/10/24
+ * description:
+ */
+public interface IDocumentFunctions {
+
+    public void run();
+
+}

+ 86 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/OpenPDFFunctionsImpl.java

@@ -0,0 +1,86 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.fun;
+
+
+import android.content.Intent;
+import android.net.Uri;
+
+import androidx.fragment.app.Fragment;
+
+import com.compdfkit.pdfviewer.Configuration;
+import com.compdfkit.pdfviewer.MainActivity;
+import com.compdfkit.pdfviewer.home.HomeFunBean;
+import com.compdfkit.pdfviewer.home.datas.SettingDatas;
+import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
+
+public class OpenPDFFunctionsImpl extends BasicDocumentFunctions{
+
+    protected String filePath;
+
+    protected Uri uri;
+
+    protected String password;
+
+
+    public OpenPDFFunctionsImpl(Fragment fragment, HomeFunBean.FunType funType) {
+        super(fragment, funType);
+    }
+
+    public void setPDFFile(String filePath, Uri uri, String password){
+        this.filePath = filePath;
+        this.uri = uri;
+        this.password = password;
+    }
+
+    @Override
+    public void run() {
+        startPDFActivity(filePath, uri, password);
+    }
+
+    protected void startPDFActivity(String filePath, Uri uri, String password){
+        Intent intent = new Intent(fragment.getContext(), MainActivity.class);
+        intent.putExtra(MainActivity.EXTRA_FILE_PATH, filePath);
+        intent.setData(uri);
+        intent.putExtra(MainActivity.EXTRA_FILE_PASSWORD, password);
+        intent.putExtra(MainActivity.EXTRA_CONFIGURATION, getConfiguration());
+        fragment.startActivity(intent);
+    }
+
+    /**
+     * Enter the additional configuration information of pdf Activity
+     * @return
+     */
+    protected Configuration getConfiguration(){
+        Configuration configuration = new Configuration();
+        configuration.setHighlightForm(SettingDatas.isHighlightForm(fragment.getContext()));
+        configuration.setHighlightLink(SettingDatas.isHighlightLink(fragment.getContext()));
+        configuration.setMode(getPreviewMode());
+        return configuration;
+    }
+
+    protected CPreviewMode getPreviewMode(){
+        switch (funType){
+            case Viewer:
+                return CPreviewMode.Viewer;
+            case Annotations:
+                return CPreviewMode.Annotation;
+            case Forms:
+                return CPreviewMode.Form;
+            case Signature:
+                return CPreviewMode.Signature;
+            case DocumentEditor:
+                return CPreviewMode.PageEdit;
+            case ContentEditor:
+                return CPreviewMode.Edit;
+            default:return CPreviewMode.Viewer;
+        }
+    }
+}

+ 137 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/fun/WatermarkFunctionImpl.java

@@ -0,0 +1,137 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer.home.fun;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.text.TextUtils;
+
+import androidx.fragment.app.Fragment;
+
+import com.compdfkit.core.common.CPDFDocumentException;
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.pdfviewer.R;
+import com.compdfkit.pdfviewer.home.HomeFunBean;
+import com.compdfkit.pdfviewer.home.SelectWatermarkFunFragment;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
+import com.compdfkit.tools.common.views.directory.CFileDirectoryDialog;
+import com.compdfkit.tools.security.encryption.CDocumentEncryptionDialog;
+import com.compdfkit.tools.security.encryption.CInputOwnerPwdDialog;
+import com.compdfkit.tools.security.watermark.CWatermarkEditDialog;
+
+import java.io.File;
+
+
+public class WatermarkFunctionImpl extends OpenPDFFunctionsImpl {
+
+    public WatermarkFunctionImpl(Fragment fragment, HomeFunBean.FunType funType) {
+        super(fragment, funType);
+    }
+
+    @Override
+    public void run() {
+        watermark(filePath, uri);
+    }
+
+    private CPDFDocument getDocument(String filePath, Uri uri) {
+        CPDFDocument document = new CPDFDocument(fragment.getContext());
+        CPDFDocument.PDFDocumentError error;
+        if (!TextUtils.isEmpty(filePath)) {
+            error = document.open(filePath);
+        } else {
+            error = document.open(uri);
+        }
+        return error == CPDFDocument.PDFDocumentError.PDFDocumentErrorSuccess ? document : null;
+    }
+
+    /**
+     * Demonstrate watermark function
+     * @param filePath
+     * @param uri
+     */
+    private void watermark(String filePath, Uri uri) {
+        SelectWatermarkFunFragment watermarkFunFragment = SelectWatermarkFunFragment.newInstance();
+        watermarkFunFragment.setAddWatermarkClickListener(v -> {
+            CPDFDocument document = getDocument(filePath, uri);
+            if (document != null) {
+                CWatermarkEditDialog watermarkEditDialog = CWatermarkEditDialog.newInstance();
+                watermarkEditDialog.setDocument(document);
+                watermarkEditDialog.setPageIndex(0);
+                watermarkEditDialog.setCompleteListener(pdfFile -> {
+                    watermarkEditDialog.dismiss();
+                    showResultDialog(fragment.getString(R.string.tools_watermark_add_success),
+                            fragment.getString(R.string.tools_already_saved_as) + pdfFile,
+                            pdfFile, null);
+                });
+                watermarkEditDialog.show(fragment.getChildFragmentManager(), "watermarkEditDialog");
+            }
+            watermarkFunFragment.dismiss();
+        });
+        watermarkFunFragment.setRemoveWatermarkClickListener(v -> {
+            watermarkFunFragment.dismiss();
+            CPDFDocument document = getDocument(filePath, uri);
+            if (document != null) {
+                // Display the secondary confirmation pop-up window to remove the watermark
+                CAlertDialog alertDialog = CAlertDialog.newInstance(fragment.getString(R.string.tools_remove_watermark),
+                        fragment.getString(R.string.tools_remove_watermark_info));
+                alertDialog.setCancelClickListener(v1 -> {
+                    alertDialog.dismiss();
+                });
+                alertDialog.setConfirmClickListener(v1 -> {
+                    alertDialog.dismiss();
+                    String dir = Environment.getExternalStorageDirectory().getAbsolutePath();
+                    CFileDirectoryDialog directoryDialog = CFileDirectoryDialog.newInstance(dir,
+                            fragment.getString(R.string.tools_save_location), fragment.getString(R.string.tools_save_to_this_directory));
+                    directoryDialog.setSelectFolderListener(dir1 -> {
+                        try {
+                            // remove all watermark
+                            for (int i = 0; i < document.getWatermarkCount(); i++) {
+                                document.getWatermark(i).clear();
+                            }
+                            File file = new File(dir1, document.getFileName());
+                            file = CFileUtils.renameNameSuffix(file);
+                            document.saveAs(file.getAbsolutePath(), false);
+                            document.close();
+                            showResultDialog(fragment.getString(R.string.tools_watermark_removed_success),
+                                    fragment.getString(R.string.tools_already_saved_as) + file.getAbsolutePath(),
+                                    file.getAbsolutePath(), null);
+
+                        } catch (CPDFDocumentException e) {
+                            throw new RuntimeException(e);
+                        }
+                    });
+                    directoryDialog.show(fragment.getChildFragmentManager(), "dirDialog");
+                });
+                alertDialog.show(fragment.getChildFragmentManager(), "removeWatermarkAlertDialog");
+            }
+        });
+        watermarkFunFragment.show(fragment.getChildFragmentManager(), "selectFunDialog");
+    }
+
+    private void showResultDialog(String title, String msg, String filePath, String password) {
+        Bundle bundle = new Bundle();
+        bundle.putString(CAlertDialog.EXTRA_TITLE, title);
+        bundle.putString(CAlertDialog.EXTRA_MESSAGE, msg);
+        bundle.putString(CAlertDialog.EXTRA_CONFIRM_BUTTON_TEXT, fragment.getString(R.string.tools_check));
+        bundle.putString(CAlertDialog.EXTRA_CANCEL_BUTTON_TEXT, fragment.getString(R.string.tools_open_folder));
+        CAlertDialog alertDialog = CAlertDialog.newInstance(bundle);
+        alertDialog.setCancelClickListener(v -> {
+            CFileUtils.openFolder(fragment.getContext(), new File(filePath).getParentFile());
+            alertDialog.dismiss();
+        });
+        alertDialog.setConfirmClickListener(v -> {
+            startPDFActivity(filePath, null, password);
+            alertDialog.dismiss();
+        });
+        alertDialog.show(fragment.getParentFragmentManager(), "tips");
+    }
+}

+ 5 - 0
PDFViewer/src/main/res/drawable/bg_fun_icon.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="4dp"/>
+    <solid android:color="#F2F3F5"/>
+</shape>

File diff suppressed because it is too large
+ 22 - 0
PDFViewer/src/main/res/drawable/ic_fun_annotations.xml


File diff suppressed because it is too large
+ 22 - 0
PDFViewer/src/main/res/drawable/ic_fun_compare_documents.xml


+ 19 - 0
PDFViewer/src/main/res/drawable/ic_fun_compress.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M12.5,1.5H2.5V18.5H17.5V6.5H12.5V1.5Z"
+      android:fillColor="#F08E26"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M13.5,1.207L17.793,5.5H13.5V1.207Z"
+      android:fillColor="#F08E26"
+      android:fillAlpha="0.5"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M6.905,5.5H8.309V6.436H6.905V5.5ZM5.5,6.437H6.905V7.373H5.5V6.437ZM8.309,7.373V8.309H6.905V7.373L8.309,7.373ZM6.905,8.309V9.245H5.5V8.309L6.905,8.309ZM8.309,9.246V10.182H6.905V9.246L8.309,9.246ZM6.905,10.182V11.118H5.5V10.182H6.905ZM6.905,12.055H5.5V15.8H8.309V11.118H6.905V12.055ZM5.968,14.864V13.927H7.841V14.864H5.968Z"
+      android:fillColor="#ffffff"
+      android:fillType="evenOdd"/>
+</vector>

File diff suppressed because it is too large
+ 31 - 0
PDFViewer/src/main/res/drawable/ic_fun_content_editor.xml


+ 15 - 0
PDFViewer/src/main/res/drawable/ic_fun_conversion.xml

@@ -0,0 +1,15 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M17.1,12.554V1.4H3.503V2.6H15.9L15.9,12.548L14.424,11.075L13.576,11.925L16.507,14.849L19.425,11.924L18.575,11.076L17.1,12.554ZM4.103,17.4L4.103,7.452L5.576,8.924L6.424,8.076L3.5,5.152L0.576,8.076L1.424,8.924L2.903,7.446V18.6H16.5V17.4H4.103Z"
+      android:fillColor="#477EDE"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M11.667,5H6V15H14V6.75L11.667,5Z"
+      android:fillColor="#477EDE"
+      android:fillAlpha="0.5"
+      android:fillType="evenOdd"/>
+</vector>

File diff suppressed because it is too large
+ 14 - 0
PDFViewer/src/main/res/drawable/ic_fun_digital_signature.xml


+ 15 - 0
PDFViewer/src/main/res/drawable/ic_fun_document_editor.xml

@@ -0,0 +1,15 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M9.5,2.5H2.5V9.5H9.5V2.5Z"
+      android:fillColor="#477EDE"
+      android:fillAlpha="0.5"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M17.5,2.5H10.5V9.5H17.5V2.5ZM9.5,10.5H2.5V17.5H9.5V10.5ZM10.5,10.5H17.5V17.5H10.5V10.5Z"
+      android:fillColor="#477EDE"
+      android:fillType="evenOdd"/>
+</vector>

File diff suppressed because it is too large
+ 18 - 0
PDFViewer/src/main/res/drawable/ic_fun_form.xml


+ 26 - 0
PDFViewer/src/main/res/drawable/ic_fun_mesurement.xml

@@ -0,0 +1,26 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M15.118,11.661V15.118H11.661L15.118,11.661ZM15.118,9.539L9.539,15.118H5.882L15.118,5.882V9.539ZM13.996,4.882L4.882,13.996V10.896L10.878,4.9C10.884,4.894 10.889,4.889 10.894,4.882H13.996ZM8.775,4.882H4.882V8.775L8.775,4.882ZM3.382,3.823C3.382,3.58 3.58,3.382 3.824,3.382H16.177C16.42,3.382 16.618,3.58 16.618,3.823V16.176C16.618,16.42 16.42,16.618 16.177,16.618H3.824C3.58,16.618 3.382,16.42 3.382,16.176V3.823Z"
+      android:fillColor="#00CC92"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M2.941,2.5L4.706,2.5A0.441,0.441 0,0 1,5.147 2.941L5.147,4.706A0.441,0.441 0,0 1,4.706 5.147L2.941,5.147A0.441,0.441 0,0 1,2.5 4.706L2.5,2.941A0.441,0.441 0,0 1,2.941 2.5z"
+      android:fillColor="#00CC92"
+      android:fillAlpha="0.5"/>
+  <path
+      android:pathData="M15.294,2.5L17.059,2.5A0.441,0.441 0,0 1,17.5 2.941L17.5,4.706A0.441,0.441 0,0 1,17.059 5.147L15.294,5.147A0.441,0.441 0,0 1,14.853 4.706L14.853,2.941A0.441,0.441 0,0 1,15.294 2.5z"
+      android:fillColor="#00CC92"
+      android:fillAlpha="0.5"/>
+  <path
+      android:pathData="M2.941,14.853L4.706,14.853A0.441,0.441 0,0 1,5.147 15.294L5.147,17.059A0.441,0.441 0,0 1,4.706 17.5L2.941,17.5A0.441,0.441 0,0 1,2.5 17.059L2.5,15.294A0.441,0.441 0,0 1,2.941 14.853z"
+      android:fillColor="#00CC92"
+      android:fillAlpha="0.5"/>
+  <path
+      android:pathData="M15.294,14.853L17.059,14.853A0.441,0.441 0,0 1,17.5 15.294L17.5,17.059A0.441,0.441 0,0 1,17.059 17.5L15.294,17.5A0.441,0.441 0,0 1,14.853 17.059L14.853,15.294A0.441,0.441 0,0 1,15.294 14.853z"
+      android:fillColor="#00CC92"
+      android:fillAlpha="0.5"/>
+</vector>

+ 19 - 0
PDFViewer/src/main/res/drawable/ic_fun_redaction.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M13.207,1.5H2.5V18.5H17.5V5.793L13.207,1.5Z"
+      android:fillColor="#F08E26"
+      android:fillAlpha="0.5"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M4.5,3.5H12.5L15.5,6.5V16.5H4.5L4.5,3.5Z"
+      android:fillColor="#F08E26"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M11,5.5H6V6.7H11V5.5ZM14,13.3H6V14.5H14V13.3Z"
+      android:fillColor="#ffffff"
+      android:fillType="evenOdd"/>
+</vector>

File diff suppressed because it is too large
+ 59 - 0
PDFViewer/src/main/res/drawable/ic_fun_samples_pdf.xml


+ 19 - 0
PDFViewer/src/main/res/drawable/ic_fun_security.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M10.307,0.226L9.995,0L9.687,0.23C8.52,1.101 7.31,1.812 6.057,2.364C4.81,2.914 3.612,3.266 2.464,3.422L2,3.485V9.323C2,12.335 3.414,15.161 5.797,16.912L10,20L14.203,16.912C16.586,15.161 18,12.335 18,9.323V3.495L17.547,3.423C16.302,3.228 15.101,2.875 13.943,2.364C12.78,1.852 11.568,1.139 10.307,0.226Z"
+      android:fillColor="#477EDE"
+      android:fillAlpha="0.5"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M10.23,2.669L9.997,2.5L9.765,2.673C8.89,3.326 7.982,3.859 7.042,4.273C6.107,4.685 5.209,4.949 4.348,5.066L4,5.114V9.492C4,11.751 5.061,13.871 6.848,15.184L10,17.5L13.152,15.184C14.939,13.871 16,11.751 16,9.492V5.121L15.66,5.068C14.726,4.921 13.826,4.656 12.958,4.273C12.085,3.889 11.176,3.354 10.23,2.669Z"
+      android:fillColor="#477EDE"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M10.6,8.9V7H9.4V8.9H7.5V10.1H9.4V12H10.6V10.1H12.5V8.9H10.6Z"
+      android:fillColor="#ffffff"
+      android:fillType="evenOdd"/>
+</vector>

+ 24 - 0
PDFViewer/src/main/res/drawable/ic_fun_viewer.xml

@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="20dp"
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <path
+      android:pathData="M13.207,1.5H2.5V18.5H17.5V5.793L13.207,1.5Z"
+      android:fillColor="#477EDE"
+      android:fillAlpha="0.5"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M4.5,3.5H12.5L15.5,6.5V16.5H4.5L4.5,3.5Z"
+      android:fillColor="#477EDE"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M9.958,12.75C11.676,12.75 13.139,11.283 13.686,10.655C13.828,10.493 13.828,10.257 13.686,10.095C13.139,9.467 11.676,8 9.958,8C8.24,8 6.778,9.467 6.23,10.095C6.089,10.257 6.089,10.493 6.23,10.655C6.778,11.283 8.24,12.75 9.958,12.75Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:strokeWidth="1"
+      android:pathData="M9.958,11.365C10.505,11.365 10.948,10.922 10.948,10.375C10.948,9.828 10.505,9.385 9.958,9.385C9.412,9.385 8.969,9.828 8.969,10.375C8.969,10.922 9.412,11.365 9.958,11.365Z"
+      android:strokeLineJoin="round"
+      android:fillColor="#00000000"
+      android:strokeColor="#477EDE"/>
+</vector>

File diff suppressed because it is too large
+ 19 - 0
PDFViewer/src/main/res/drawable/ic_fun_watermark.xml


File diff suppressed because it is too large
+ 14 - 0
PDFViewer/src/main/res/drawable/ic_pdfviewer_home_setting.xml


+ 31 - 0
PDFViewer/src/main/res/layout/activity_home.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.appcompat.widget.Toolbar
+        android:id="@+id/tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:background="@color/tools_color_primary"
+        android:elevation="4dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:menu="@menu/menu_activity_home"
+        app:title="@string/app_name" />
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/fragment_content"
+        android:tag="fragment_content"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar"
+        tools:layout="@layout/fragment_home" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 305 - 0
PDFViewer/src/main/res/layout/activity_setting.xml

@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.compdfkit.tools.common.views.CToolBar
+        android:id="@+id/tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:elevation="4dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:fillViewport="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar">
+
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <LinearLayout
+                android:id="@+id/ll_content"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_global_setting"
+                    android:layout_width="match_parent"
+                    android:layout_height="28dp"
+                    android:background="@color/tools_reader_setting_head_bg_color"
+                    android:gravity="center_vertical"
+                    android:paddingStart="16dp"
+                    android:paddingEnd="16dp"
+                    android:text="@string/tools_global_setting"
+                    android:textColor="@color/tools_text_color_primary"
+                    android:textSize="12sp" />
+
+                <com.compdfkit.tools.common.views.pdfproperties.CPropertiesSwitchView
+                    android:id="@+id/sw_highlight_link"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:checked="false"
+                    android:title="@string/tools_highlight_link_area" />
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0.5dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:background="@color/tools_item_dividing_line_color" />
+
+                <com.compdfkit.tools.common.views.pdfproperties.CPropertiesSwitchView
+                    android:id="@+id/sw_highlight_form"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:checked="false"
+                    android:title="@string/tools_highlight_form_area"
+                    app:layout_constraintTop_toBottomOf="@id/tv_global_setting" />
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0.5dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:background="@color/tools_item_dividing_line_color" />
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="56dp">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_document_author"
+                        style="@style/tools_style_fragment_sub_title_style"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="16dp"
+                        android:layout_marginTop="0dp"
+                        android:text="@string/tools_document_author"
+                        android:textColor="@color/tools_text_color_primary"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginEnd="16dp"
+                        android:text="@string/tools_compdfkit_author"
+                        android:textColor="@color/tools_text_color_primary"
+                        app:layout_constraintBaseline_toBaselineOf="@id/tv_document_author"
+                        app:layout_constraintEnd_toEndOf="parent" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_sdk_information"
+                    android:layout_width="match_parent"
+                    android:layout_height="28dp"
+                    android:background="@color/tools_reader_setting_head_bg_color"
+                    android:gravity="center_vertical"
+                    android:paddingStart="16dp"
+                    android:paddingEnd="16dp"
+                    android:text="@string/tools_sdk_information"
+                    android:textColor="@color/tools_text_color_primary"
+                    android:textSize="12sp" />
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="56dp">
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_version"
+                        style="@style/tools_style_fragment_sub_title_style"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="16dp"
+                        android:layout_marginTop="0dp"
+                        android:text="@string/tools_versions"
+                        android:textColor="@color/tools_text_color_primary"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <androidx.appcompat.widget.AppCompatTextView
+                        android:id="@+id/tv_version_value"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginEnd="16dp"
+                        android:textColor="@color/tools_text_color_primary"
+                        app:layout_constraintBaseline_toBaselineOf="@id/tv_version"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        tools:text="1.11.0" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_company_information"
+                    android:layout_width="match_parent"
+                    android:layout_height="28dp"
+                    android:background="@color/tools_reader_setting_head_bg_color"
+                    android:gravity="center_vertical"
+                    android:paddingStart="16dp"
+                    android:paddingEnd="16dp"
+                    android:text="@string/tools_company_information"
+                    android:textColor="@color/tools_text_color_primary"
+                    android:textSize="12sp" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_compdf_website"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+                    android:drawableEnd="@drawable/tools_ic_right_arrow"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="16dp"
+                    android:text="@string/tools_compdf_website"
+                    android:textColor="@color/tools_text_color_primary" />
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0.5dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:background="@color/tools_item_dividing_line_color" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_about_us"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+                    android:drawableEnd="@drawable/tools_ic_right_arrow"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="16dp"
+
+                    android:text="@string/tools_about_us"
+                    android:textColor="@color/tools_text_color_primary" />
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0.5dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:background="@color/tools_item_dividing_line_color" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_technical_support"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+
+                    android:drawableEnd="@drawable/tools_ic_right_arrow"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="16dp"
+                    android:text="@string/tools_technical_support"
+                    android:textColor="@color/tools_text_color_primary" />
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0.5dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:background="@color/tools_item_dividing_line_color" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_contact_sales"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+                    android:drawableEnd="@drawable/tools_ic_right_arrow"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="16dp"
+                    android:text="@string/tools_contact_sales"
+                    android:textColor="@color/tools_text_color_primary" />
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0.5dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:background="@color/tools_item_dividing_line_color" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_support_email"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+                    android:drawableEnd="@drawable/tools_ic_right_arrow"
+                    android:gravity="center_vertical"
+                    android:paddingHorizontal="16dp"
+                    android:text="@string/tools_compdf_email"
+                    android:textColor="@color/tools_text_color_primary" />
+
+
+            </LinearLayout>
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_copy_right"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="32dp"
+                android:gravity="center"
+                android:text="@string/tools_copy_right"
+                android:textColor="@color/tools_text_color_disable"
+                android:textSize="11sp"
+                app:layout_constraintBottom_toTopOf="@id/ll_privacy"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/ll_content"
+                app:layout_constraintVertical_bias="0.75"
+                app:layout_constraintVertical_chainStyle="packed"
+                app:layout_goneMarginTop="16dp" />
+
+            <LinearLayout
+                android:id="@+id/ll_privacy"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginTop="8dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/tv_copy_right">
+
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_privacy_policy"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+                    android:text="@string/tools_privacy_policy"
+                    android:textColor="@color/tools_color_accent"
+                    android:textSize="11sp" />
+
+                <View
+                    android:layout_width="1dp"
+                    android:layout_height="12dp"
+                    android:layout_marginStart="8dp"
+                    android:layout_marginEnd="8dp"
+                    android:background="@color/tools_control_line_color" />
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_terms_of_service"
+                    android:layout_width="wrap_content"
+                    android:background="@drawable/tools_common_btn_rectangle_ripple"
+                    android:layout_height="wrap_content"
+                    android:text="@string/tools_terms_of_service"
+                    android:textColor="@color/tools_color_accent"
+                    android:textSize="11sp" />
+
+            </LinearLayout>
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    </ScrollView>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 30 - 0
PDFViewer/src/main/res/layout/fragment_document_list.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@color/tools_color_background"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:listitem="@layout/rv_item_home_fun_item_content"
+        />
+
+    <com.google.android.material.floatingactionbutton.FloatingActionButton
+        android:id="@+id/fab_add"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:src="@drawable/tools_ic_add"
+        android:layout_marginEnd="16dp"
+        android:backgroundTint="@color/tools_color_accent"
+        android:layout_marginBottom="40dp"
+        app:tint="@android:color/white"
+        />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 18 - 0
PDFViewer/src/main/res/layout/fragment_home.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        tools:listitem="@layout/rv_item_home_fun_item_content" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 63 - 0
PDFViewer/src/main/res/layout/fragment_watermark_select_fun.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/tools_style_content_bg"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_add_watermark"
+        android:layout_width="match_parent"
+        android:layout_height="56dp"
+        app:layout_constraintTop_toTopOf="parent"
+        android:paddingHorizontal="24dp"
+        android:background="@drawable/tools_common_btn_rectangle_ripple"
+        >
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:text="@string/tools_add_watermark"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:textColor="@color/tools_editpage_insert_page_color"
+            android:textSize="16sp"
+            />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/tools_control_line_color"
+        app:layout_constraintTop_toBottomOf="@id/cl_add_watermark"
+        />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_remove_watermark"
+        android:layout_width="match_parent"
+        android:layout_height="56dp"
+        app:layout_constraintTop_toBottomOf="@id/cl_add_watermark"
+        android:paddingHorizontal="24dp"
+        android:background="@drawable/tools_common_btn_rectangle_ripple"
+        >
+
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:text="@string/tools_remove_watermark"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:textColor="@color/tools_editpage_insert_page_color"
+            android:textSize="16sp"
+            />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 81 - 0
PDFViewer/src/main/res/layout/rv_item_home_fun_item_content.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="62dp"
+    android:layout_marginVertical="4dp"
+    android:background="@drawable/tools_common_btn_rectangle_ripple">
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_pdf_sample_icon"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        app:srcCompat="@drawable/ic_fun_samples_pdf"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginStart="16dp"
+        android:visibility="gone"
+        />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_icon"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:padding="4dp"
+        android:background="@drawable/bg_fun_icon"
+        android:layout_marginStart="16dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:src="@drawable/ic_fun_viewer" />
+
+    <androidx.constraintlayout.widget.Barrier
+        android:id="@+id/barrier"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:barrierDirection="end"
+        app:constraint_referenced_ids="iv_icon,iv_pdf_sample_icon"
+        />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:textColor="@color/tools_text_color_primary"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@id/tv_desc"
+        app:layout_constraintStart_toEndOf="@id/barrier"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_chainStyle="packed"
+        tools:text="Viewer" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_desc"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:textColor="@color/tools_text_color_disable"
+        android:textSize="11sp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        android:layout_marginEnd="40dp"
+        app:layout_constraintStart_toStartOf="@id/tv_title"
+        app:layout_constraintTop_toBottomOf="@id/tv_title"
+        tools:text="The viewer offers various display modes,PDF" />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="16dp"
+        android:src="@drawable/tools_ic_pageedit_arrow_right"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:tint="@color/tools_text_color_disable" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 20 - 0
PDFViewer/src/main/res/layout/rv_item_home_fun_item_title.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_title"
+        android:layout_width="match_parent"
+        android:layout_height="28dp"
+        android:gravity="center_vertical"
+        android:paddingStart="16dp"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="Quick Start" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 12 - 0
PDFViewer/src/main/res/menu/menu_activity_home.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:title="@string/tools_setting"
+        android:id="@+id/home_setting"
+        android:icon="@drawable/ic_pdfviewer_home_setting"
+        android:visible="true"
+        app:showAsAction="always" />
+
+</menu>

+ 30 - 0
PDFViewer/src/main/res/values/strings.xml

@@ -2,4 +2,34 @@
     <string name="app_name">ComPDFKit</string>
     <string name="app_permission_storage">申请SD卡读写权限</string>
 
+    <string name="tools_click_to_open_process">Click to Open &amp; Process</string>
+    <string name="tools_compdfkit_sample_file_android">ComPDFKit_Sample_File_Android.pdf</string>
+    <string name="tools_quick_start">Quick Start</string>
+    <string name="tools_fun_viewer">Viewer</string>
+    <string name="tools_fun_viewer_desc">High-quality rendering speed and rich reading tools support a smooth reading experience.</string>
+    <string name="tools_fun_annotations">Annotations</string>
+    <string name="tools_fun_annotations_desc">Add, edit, delete, export, import, and flatten various annotations and markups on PDFs.</string>
+    <string name="tools_fun_forms">Forms</string>
+    <string name="tools_fun_forms_desc">Create, edit, and fill in PDF forms, with support for importing, exporting, and flattening forms.</string>
+    <string name="tools_fun_signatures">Signatures</string>
+    <string name="tools_fun_signatures_desc">Easily sign PDFs with drawn, images, typed signatures, or a digital ID.</string>
+    <string name="tools_fun_document_editor">Document Editor</string>
+    <string name="tools_fun_document_editor_desc">Add, insert, replace, extract, reverse, move, copy, paste, rotate, delete, crop, and zoom PDF pages.</string>
+    <string name="tools_fun_content_editor">Content Editor</string>
+    <string name="tools_fun_content_editor_desc">Edit the PDF text and images like edit in Word. You can freely adjust the size, position, style, font, etc.</string>
+    <string name="tools_fun_security">Security</string>
+    <string name="tools_fun_security_desc">Encrypt/decrypt PDFs, edit file permissions, headers and footers, backgrounds, Bates numbers, etc.</string>
+    <string name="tools_fun_redaction">Redaction</string>
+    <string name="tools_fun_redaction_desc">Use redaction to remove sensitive images, text, and vector graphics.</string>
+    <string name="tools_fun_watermark">Watermark</string>
+    <string name="tools_fun_watermark_desc">Create, insert, and remove text or image watermarks to brand the files.</string>
+    <string name="tools_fun_compare_documents">Compare Documents</string>
+    <string name="tools_fun_compare_documents_desc">Allow to compare PDF files and design drawings with content comparison and overlay comparison.</string>
+    <string name="tools_fun_conversion">Conversion</string>
+    <string name="tools_fun_conversion_desc">Support the mutual conversion between PDF files and Office, image types, text types, HTML, PDF/A, etc.</string>
+    <string name="tools_fun_compress">Compress</string>
+    <string name="tools_fun_compress_desc">Optimize and reduce PDF document size with no or minimum visual quality loss.</string>
+    <string name="tools_fun_measurement">Measurement</string>
+    <string name="tools_fun_measurement_desc">Measure the distance, perimeter, area, angle, diameter, radius, and volume measurement annotations.</string>
+
 </resources>

+ 6 - 4
Samples/src/main/java/com/compdfkit/samples/util/FileUtils.java

@@ -51,15 +51,17 @@ public class FileUtils {
         }
     }
 
-    public static String getAssetsTempFile(Context context, String assetsName) {
-        return copyFileFromAssets(context, assetsName, context.getCacheDir().getAbsolutePath(), assetsName, true);
-    }
-
     public static String getNameWithoutExtension(String name){
         int index = name.lastIndexOf(".");
         return index == -1 ? name : name.substring(0, index);
     }
 
+    public static String getAssetsTempFile(Context context, String assetsName) {
+        return copyFileFromAssets(context, assetsName, context.getCacheDir().getAbsolutePath(), assetsName, true);
+    }
+
+
+
     public static String copyFileFromAssets(Context context,
                                             String assetName,
                                             String savePath,

+ 1 - 1
config.gradle

@@ -6,7 +6,7 @@ ext {
             VERSIONCODE: 1005
     ]
     sdk = [
-            COMPDFKIT_SDK_VERSION : "1.10.0",
+            COMPDFKIT_SDK_VERSION : "1.11.0",
             COMPDFKIT_SDK_BUILD_TAG : "build_beta_1.10.0_3bf189d96_202310111438"
     ]
 }