Selaa lähdekoodia

PDFTool(Android) - 完善安全模块注释内容

liuxiaolong 1 vuosi sitten
vanhempi
commit
5dc9c16c82
33 muutettua tiedostoa jossa 619 lisäystä ja 297 poistoa
  1. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationbar/CAnnotationToolbar.java
  2. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfsignature/CAddSignatureActivity.java
  3. 0 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/basic/activity/CPermissionActivity.java
  4. 0 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/basic/adapter/CBasicSpinnerAdapter.java
  5. 0 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/CPDFContextMenuHelper.java
  6. 0 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CImportImageDialogFragment.java
  7. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/image/CBitmapUtil.java
  8. 0 3
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/directory/CFileDirectoryDatas.java
  9. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/directory/CFileDirectoryDialog.java
  10. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/contenteditor/pdfproperties/CEditImagePropertiesFragment.java
  11. 31 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CDocumentEncryptionDialog.java
  12. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CEncryptAlgorithmSpinnerAdapter.java
  13. 9 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CInputOwnerPwdDialog.java
  14. 23 11
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkEditDialog.java
  15. 56 8
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkPageFragment.java
  16. 12 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkPageFragmentAdapter.java
  17. 0 3
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkToolBar.java
  18. 0 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/pdfproperties/CWatermarkImageStyleFragment.java
  19. 0 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/pdfproperties/CWatermarkPageRangeAdapter.java
  20. 0 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/pdfproperties/CWatermarkTextStyleFragment.java
  21. 266 64
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/view/CWatermarkPageView.java
  22. 220 142
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/view/CWatermarkView.java
  23. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/CertificateDigitalDatas.java
  24. 0 5
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/bean/CPDFOwnerItemData.java
  25. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/importcert/create/CreateCertificateDigitalDialog.java
  26. 0 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertAttrDatas.java
  27. 0 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignatureWidgetImpl.java
  28. 0 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/verify/CVerifySignStatusView.java
  29. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/viewer/pdfinfo/CPDFDocumentInfoDialogFragment.java
  30. 1 1
      ComPDFKit_Tools/src/main/res/drawable/selector_radiobutton.xml
  31. 0 1
      ComPDFKit_Tools/src/main/res/layout/tools_cpdf_security_document_encryption_dialog.xml
  32. 0 1
      ComPDFKit_Tools/src/main/res/layout/tools_cpdf_security_watermark_page_fragment.xml
  33. 1 3
      ComPDFKit_Tools/src/main/res/layout/tools_file_directory_list_title_separator_item.xml

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationbar/CAnnotationToolbar.java

@@ -45,7 +45,6 @@ import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.ui.proxy.attach.IInkDrawCallback;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 public class CAnnotationToolbar extends FrameLayout {

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfsignature/CAddSignatureActivity.java

@@ -20,7 +20,6 @@ import android.text.TextUtils;
 import android.view.View;
 import android.widget.SeekBar;
 
-import androidx.activity.result.ActivityResultLauncher;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.AppCompatButton;

+ 0 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/basic/activity/CPermissionActivity.java

@@ -6,11 +6,9 @@ import android.content.pm.PackageManager;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.content.ContextCompat;
 
-import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.CPermissionUtil;
 import com.compdfkit.tools.common.utils.activitycontracts.CMultiplePermissionResultLauncher;
 import com.compdfkit.tools.common.utils.activitycontracts.CPermissionResultLauncher;
-import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
 
 
 public class CPermissionActivity extends AppCompatActivity {

+ 0 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/basic/adapter/CBasicSpinnerAdapter.java

@@ -10,19 +10,13 @@
 package com.compdfkit.tools.common.basic.adapter;
 
 import android.content.Context;
-import android.graphics.Typeface;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 
 import androidx.annotation.NonNull;
-import androidx.appcompat.widget.AppCompatTextView;
 
-import com.compdfkit.core.document.CPDFDocument;
-import com.compdfkit.tools.R;
-
-import java.util.Arrays;
 import java.util.List;
 
 

+ 0 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/CPDFContextMenuHelper.java

@@ -15,9 +15,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.PopupWindow;
 
-import com.compdfkit.core.document.CPDFDocument;
-import com.compdfkit.core.page.CPDFTextPage;
-import com.compdfkit.core.page.CPDFTextSelection;
 import com.compdfkit.tools.common.contextmenu.impl.CCheckBoxContextMenuView;
 import com.compdfkit.tools.common.contextmenu.impl.CFreeTextContextMenuView;
 import com.compdfkit.tools.common.contextmenu.impl.CInkContextMenuView;
@@ -50,7 +47,6 @@ import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuSelectConten
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuSoundContentProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuStampProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuTextFieldProvider;
-import com.compdfkit.tools.common.utils.CLog;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.viewer.contextmenu.CopyContextMenuView;
 import com.compdfkit.ui.contextmenu.CPDFContextMenuShowHelper;
@@ -71,8 +67,6 @@ import com.compdfkit.ui.proxy.form.CPDFTextWidgetImpl;
 import com.compdfkit.ui.reader.CPDFPageView;
 import com.compdfkit.ui.reader.CPDFReaderView;
 
-import java.util.List;
-
 
 public class CPDFContextMenuHelper extends CPDFContextMenuShowHelper {
 

+ 0 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CImportImageDialogFragment.java

@@ -17,8 +17,6 @@ import androidx.activity.result.ActivityResultLauncher;
 import androidx.annotation.Nullable;
 import androidx.constraintlayout.widget.ConstraintLayout;
 
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment;
 import com.compdfkit.tools.common.utils.CPermissionUtil;

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/image/CBitmapUtil.java

@@ -13,7 +13,6 @@ package com.compdfkit.tools.common.utils.image;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Matrix;
-import android.net.Uri;
 
 import com.compdfkit.tools.common.utils.CFileUtils;
 import com.compdfkit.tools.common.utils.CUriUtil;

+ 0 - 3
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/directory/CFileDirectoryDatas.java

@@ -11,11 +11,8 @@ package com.compdfkit.tools.common.views.directory;
 
 
 import java.io.File;
-import java.io.FileFilter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 public class CFileDirectoryDatas {

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/directory/CFileDirectoryDialog.java

@@ -17,7 +17,6 @@ import androidx.recyclerview.widget.RecyclerView;
 
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment;
-import com.compdfkit.tools.common.utils.CPermissionUtil;
 import com.compdfkit.tools.common.utils.threadpools.SimpleBackgroundTask;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 import com.compdfkit.tools.common.views.CToolBar;

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/contenteditor/pdfproperties/CEditImagePropertiesFragment.java

@@ -23,7 +23,6 @@ import androidx.constraintlayout.widget.ConstraintLayout;
 
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.activitycontracts.CImageResultContracts;
-import com.compdfkit.tools.common.utils.activitycontracts.CPermissionResultLauncher;
 import com.compdfkit.tools.common.utils.view.sliderbar.CSliderBar;
 import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;

+ 31 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CDocumentEncryptionDialog.java

@@ -1,3 +1,12 @@
+/**
+ * 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.tools.security.encryption;
 
 import android.Manifest;
@@ -41,6 +50,28 @@ import java.io.File;
  * Document encryption related settings dialog
  * 1. Set file opening password
  * 2. Set file permission password
+ *
+ * Before encrypting or decrypting, make sure you have document owner permissions
+ * <blockquote><pre>
+ *     CPDFDocument.PDFDocumentPermissions permission = document.getPermissions()
+ *     //only has user permission
+ *     if (permission = CPDFDocument.PDFDocumentPermissions.PDFDocumentPermissionsUser) {
+ *         // You can enter the owner permissions password and reload the pdf to gain owner permissions
+ *         document.reload(ownerPassword);
+ *         return;
+ *     }
+ *
+ *     // has owner permission
+ *     CDocumentEncryptionDialog documentEncryptionDialog = CDocumentEncryptionDialog.newInstance();
+ *     documentEncryptionDialog.setDocument(binding.pdfView.getCPdfReaderView().getPDFDocument());
+ *     documentEncryptionDialog.setEncryptionResultListener((isRemoveSecurity, result, filePath, passowrd) -> {
+ *         // Open encrypted or password-removed documents
+ *         binding.pdfView.openPDF(filePath, passowrd);
+ *         documentEncryptionDialog.dismiss();
+ *     });
+ *     documentEncryptionDialog.show(getSupportFragmentManager(), "documentEncryptionDialog");
+ * </pre></blockquote><p>
+ *
  */
 public class CDocumentEncryptionDialog extends CBasicBottomSheetDialogFragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
 

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CEncryptAlgorithmSpinnerAdapter.java

@@ -24,7 +24,6 @@ import com.compdfkit.tools.R;
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.Locale;
 
 
 public class CEncryptAlgorithmSpinnerAdapter extends BaseAdapter {

+ 9 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CInputOwnerPwdDialog.java

@@ -1,7 +1,15 @@
+/**
+ * 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.tools.security.encryption;
 
 import android.os.Bundle;
-import android.os.Environment;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.TextUtils;
@@ -20,11 +28,6 @@ import androidx.fragment.app.DialogFragment;
 
 import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.tools.R;
-import com.compdfkit.tools.common.utils.CFileUtils;
-import com.compdfkit.tools.common.utils.CToastUtil;
-
-import java.io.File;
-import java.util.UUID;
 
 
 public class CInputOwnerPwdDialog extends DialogFragment {

+ 23 - 11
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkEditDialog.java

@@ -1,3 +1,12 @@
+/**
+ * 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.tools.security.watermark;
 
 import android.Manifest;
@@ -5,15 +14,11 @@ import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.ViewSwitcher;
 
 import androidx.appcompat.widget.AppCompatButton;
 import androidx.fragment.app.Fragment;
 import androidx.viewpager2.widget.ViewPager2;
 
-import com.compdfkit.core.annotation.CPDFTextAttribute;
-import com.compdfkit.core.common.CPDFDocumentException;
 import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment;
@@ -24,18 +29,25 @@ import com.compdfkit.tools.common.utils.threadpools.SimpleBackgroundTask;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 import com.compdfkit.tools.common.views.CToolBar;
 import com.compdfkit.tools.common.views.directory.CFileDirectoryDialog;
-import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
-import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CBasicOnStyleChangeListener;
-import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleDialogFragment;
-import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
-import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
-import com.compdfkit.tools.security.watermark.view.CWatermarkPageView;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
 
 import java.io.File;
 
-
+/**
+ * watermark edit dialog fragment
+ * <blockquote><pre>
+ *      CWatermarkEditDialog watermarkEditDialog = CWatermarkEditDialog.newInstance();
+ *      watermarkEditDialog.setDocument(binding.pdfView.getCPdfReaderView().getPDFDocument());
+ *      watermarkEditDialog.setPageIndex(binding.pdfView.currentPageIndex);
+ *      watermarkEditDialog.setCompleteListener((pdfFile)->{
+ *           // Get the saving path of the saved pdf document and open the display
+ *           binding.pdfView.openPDF(pdfFile);
+ *           watermarkEditDialog.dismiss();
+ *      });
+ *      watermarkEditDialog.show(getSupportFragmentManager(), "watermarkEditDialog");
+ * </pre></blockquote><p>
+ */
 public class CWatermarkEditDialog extends CBasicBottomSheetDialogFragment implements View.OnClickListener {
 
     private CToolBar toolBar;

+ 56 - 8
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkPageFragment.java

@@ -1,3 +1,12 @@
+/**
+ * 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.tools.security.watermark;
 
 import android.graphics.Bitmap;
@@ -14,11 +23,9 @@ import androidx.fragment.app.Fragment;
 
 import com.compdfkit.core.annotation.CPDFTextAttribute;
 import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.core.watermark.CPDFWatermark;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.glide.GlideApp;
-import com.compdfkit.tools.common.utils.glide.GlideRequest;
-import com.compdfkit.tools.common.utils.image.CBitmapUtil;
-import com.compdfkit.tools.common.utils.image.CImageUtil;
 import com.compdfkit.tools.common.utils.threadpools.SimpleBackgroundTask;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CBasicOnStyleChangeListener;
@@ -30,7 +37,6 @@ import com.compdfkit.tools.security.watermark.view.CWatermarkView;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.ExecutionException;
 
 /**
  * The watermark editing page fragment provides the function of editing
@@ -40,6 +46,34 @@ import java.util.concurrent.ExecutionException;
  * CWatermarkPageFragment.java
  * -----> CWatermarkPageView.java
  * -----> CWatermarkView.java
+ * <br/><br/>
+ * create txt watermark:
+ * <blockquote><pre>
+ *     CWatermarkPageFragment pageFragment = CWatermarkPageFragment.newInstance(EditType.TXT);
+ *     pageFragment.setDocument(cpdfDocument);
+ *     pageFragment.setPageIndex(pageIndex);
+ *     pageFragment.applyWatermark();
+ * </pre></blockquote><p>
+ * create image watermark:
+ * <blockquote><pre>
+ *     CWatermarkPageFragment pageFragment = CWatermarkPageFragment.newInstance(EditType.Image);
+ *     pageFragment.setDocument(cpdfDocument);
+ *     pageFragment.setPageIndex(pageIndex);
+ *     pageFragment.applyWatermark();
+ * </pre></blockquote><p>
+ *
+ * Edit an existing watermark:
+ * <blockquote><pre>
+ *     CWatermarkPageFragment pageFragment = CWatermarkPageFragment.newInstance(EditType.Image); or EditType.Txt
+ *     pageFragment.setDocument(cpdfDocument);
+ *     pageFragment.setPageIndex(pageIndex);
+ *     pageFragment.setEditWatermark(cpdfDocument.getWatermark(index));
+ *     pageFragment.applyWatermark();
+ * </pre></blockquote><p>
+ *
+ * @see CWatermarkPageView
+ * @see CWatermarkView
+ *
  */
 public class CWatermarkPageFragment extends Fragment {
 
@@ -51,6 +85,8 @@ public class CWatermarkPageFragment extends Fragment {
 
     private int pageIndex = 0;
 
+    private CPDFWatermark watermark;
+
     public static CWatermarkPageFragment newInstance(CWatermarkView.EditType type) {
         Bundle args = new Bundle();
         args.putString("edit_type", type.name());
@@ -67,6 +103,10 @@ public class CWatermarkPageFragment extends Fragment {
         this.pageIndex = pageIndex;
     }
 
+    public void setEditWatermark(CPDFWatermark watermark) {
+        this.watermark = watermark;
+    }
+
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -82,6 +122,10 @@ public class CWatermarkPageFragment extends Fragment {
         if (getArguments() != null) {
             editType = CWatermarkView.EditType.valueOf(getArguments().getString("edit_type", CWatermarkView.EditType.TXT.name()));
             watermarkPageView.afterMeasured(() -> {
+                if (watermark != null) {
+                    watermarkPageView.editWatermark(watermark);
+                    return;
+                }
                 if (editType == CWatermarkView.EditType.TXT) {
                     // If it is a text watermark type, a watermark named 'Watermark' will be created by default.
                     watermarkPageView.createTextWatermark("Watermark");
@@ -204,7 +248,7 @@ public class CWatermarkPageFragment extends Fragment {
                     @Override
                     protected void onSuccess(Bitmap result) {
                         if (result != null) {
-                            if (watermarkPageView.watermarkView.getImageWatermarkBitmap() != null){
+                            if (watermarkPageView.watermarkView.getImageWatermarkBitmap() != null) {
                                 watermarkPageView.watermarkView.setImageBitmap(result);
                                 return;
                             }
@@ -217,8 +261,8 @@ public class CWatermarkPageFragment extends Fragment {
         styleDialogFragment.show(getChildFragmentManager(), "styleFragment");
     }
 
-    public boolean hasWatermark(){
-        if (editType == CWatermarkView.EditType.Image){
+    public boolean hasWatermark() {
+        if (editType == CWatermarkView.EditType.Image) {
             return watermarkPageView.watermarkView.getImageWatermarkBitmap() != null;
         }
         return true;
@@ -228,6 +272,10 @@ public class CWatermarkPageFragment extends Fragment {
      * Apply the currently edited watermark to the document
      */
     public void applyWatermark() {
-        watermarkPageView.applyWatermark();
+        if (watermark != null) {
+            watermarkPageView.modifyWatermark(watermark);
+        } else {
+            watermarkPageView.createWatermark();
+        }
     }
 }

+ 12 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkPageFragmentAdapter.java

@@ -1,3 +1,12 @@
+/**
+ * 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.tools.security.watermark;
 
 import androidx.annotation.NonNull;
@@ -27,6 +36,9 @@ public class CWatermarkPageFragmentAdapter extends FragmentStateAdapter {
                 position == 0 ? CWatermarkView.EditType.TXT : CWatermarkView.EditType.Image);
         pageFragment.setDocument(document);
         pageFragment.setPageIndex(pageIndex);
+        if (document.getWatermark(0) != null) {
+            pageFragment.setEditWatermark(document.getWatermark(0));
+        }
         return pageFragment;
     }
 

+ 0 - 3
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/CWatermarkToolBar.java

@@ -17,11 +17,8 @@ import android.widget.FrameLayout;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
 import androidx.constraintlayout.widget.ConstraintLayout;
-import androidx.fragment.app.FragmentActivity;
 
-import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.tools.R;
 
 public class CWatermarkToolBar extends FrameLayout {

+ 0 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/pdfproperties/CWatermarkImageStyleFragment.java

@@ -24,24 +24,18 @@ import androidx.annotation.Nullable;
 import androidx.appcompat.widget.AppCompatImageView;
 import androidx.appcompat.widget.SwitchCompat;
 
-import com.compdfkit.core.annotation.CPDFTextAttribute;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.CFileUtils;
 import com.compdfkit.tools.common.utils.CPermissionUtil;
 import com.compdfkit.tools.common.utils.activitycontracts.CImageResultContracts;
 import com.compdfkit.tools.common.utils.activitycontracts.CPermissionResultLauncher;
 import com.compdfkit.tools.common.utils.date.CDateUtil;
-import com.compdfkit.tools.common.utils.view.colorpicker.CColorPickerFragment;
 import com.compdfkit.tools.common.utils.view.colorpicker.widget.ColorPickerView;
 import com.compdfkit.tools.common.utils.view.sliderbar.CSliderBar;
 import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
-import com.compdfkit.tools.common.views.pdfproperties.colorlist.ColorListView;
-import com.compdfkit.tools.common.views.pdfproperties.font.CFontSpinnerAdapter;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
-import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleFragmentDatas;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;

+ 0 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/pdfproperties/CWatermarkPageRangeAdapter.java

@@ -10,20 +10,14 @@
 package com.compdfkit.tools.security.watermark.pdfproperties;
 
 import android.content.Context;
-import android.graphics.Typeface;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.widget.AppCompatTextView;
 
-import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.basic.adapter.CBasicSpinnerAdapter;
 
-import java.util.Arrays;
 import java.util.List;
 
 

+ 0 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/pdfproperties/CWatermarkTextStyleFragment.java

@@ -15,7 +15,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
-import android.widget.LinearLayout;
 import android.widget.Spinner;
 
 import androidx.annotation.NonNull;
@@ -33,7 +32,6 @@ import com.compdfkit.tools.common.views.pdfproperties.colorlist.ColorListView;
 import com.compdfkit.tools.common.views.pdfproperties.font.CFontSpinnerAdapter;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleFragmentDatas;
-import com.compdfkit.tools.common.views.pdfproperties.preview.CStylePreviewView;
 
 import java.util.ArrayList;
 import java.util.Arrays;

+ 266 - 64
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/view/CWatermarkPageView.java

@@ -1,14 +1,23 @@
+/**
+ * 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.tools.security.watermark.view;
 
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.PointF;
 import android.graphics.RectF;
 import android.graphics.Shader;
 import android.graphics.drawable.BitmapDrawable;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.ViewGroup;
@@ -35,42 +44,44 @@ import com.compdfkit.tools.common.utils.image.CBitmapUtil;
 import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
 import com.compdfkit.tools.security.watermark.pdfproperties.CWatermarkPageRangeAdapter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 
 /**
- * Watermark editing display page,
- * including display document preview and text watermarks and image watermarks that need to be edited <br>
- * CWatermarkPageView.java <br>
- *      -----> CWatermarkView.java <br>
- *
- * ```xml
- *     <com.compdfkit.tools.security.watermark.view.CWatermarkPageView
- *         android:id="@+id/watermark_page_view"
- *         android:layout_width="match_parent"
- *         android:layout_height="match_parent" />
- * ```
+ * <p>Watermark editing display page,
+ * including display document preview and text watermarks and image watermarks that need to be edited <br></p>
+ * <blockquote><pre>
+ * CWatermarkPageView.java
+ * -----> CWatermarkView.java
+ * </pre></blockquote>
+ * <blockquote><pre>
+ * com.compdfkit.tools.security.watermark.view.CWatermarkPageView
+ * android:id="@+id/watermark_page_view"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent" />
+ * </pre></blockquote>
+ * <blockquote><pre>
+ * // init
+ * WatermarkPageView watermarkPageView = findViewById(R.id.watermark_page_view);
+ * watermarkPageView.setDocument(cpdfDocument, pageIndex);
+ * watermarkPageView.afterMeasured(() -> {
+ *      if (editType == CWatermarkView.EditType.TXT) {
+ *      // If it is a text watermark type, a watermark named 'Watermark' will be created by default.
+ *      watermarkPageView.createTextWatermark("Watermark");
+ *      } else {
  *
- * ```java
- *      // init
- *      WatermarkPageView watermarkPageView = findViewById(R.id.watermark_page_view);
- *      watermarkPageView.setDocument(cpdfDocument, 0);
- *      watermarkPageView.afterMeasured(() -> {
- *                 if (editType == CWatermarkView.EditType.TXT) {
- *                     // If it is a text watermark type, a watermark named 'Watermark' will be created by default.
- *                     watermarkPageView.createTextWatermark("Watermark");
- *                 } else {
- *
- *                 }
- *             });
- *
- *
- *     // create text watermark
- *     watermarkPageView.createTextWatermark("ComPDFKit");
- *
- *     // create image watermark
- *    watermarkPageView.createImageWatermark(bitmap);
- *
- *    watermarkPageView.applyWatermark();
- * ```
+ *      }
+ * });
+ * // create text watermark
+ * watermarkPageView.createTextWatermark("ComPDFKit");
+ * // create image watermark
+ * watermarkPageView.createImageWatermark(bitmap);
+ * // edit current exists watermark
+ * watermarkPageView.editWatermark(watermark);
+ * // apply watermark
+ * watermarkPageView.applyWatermark();
+ * </pre></blockquote>
  */
 public class CWatermarkPageView extends FrameLayout {
 
@@ -100,8 +111,6 @@ public class CWatermarkPageView extends FrameLayout {
 
     private boolean front = true;
 
-    private PointF centerPoint = new PointF();
-
     private int watermarkSpacing = 100;
 
     public CWatermarkPageView(@NonNull Context context) {
@@ -152,14 +161,14 @@ public class CWatermarkPageView extends FrameLayout {
             updateTileWatermark();
         });
         watermarkView.setClickDrawAreaListener(() -> {
-            if (watermarkView.getWatermarkType() != CWatermarkView.EditType.TXT){
+            if (watermarkView.getWatermarkType() != CWatermarkView.EditType.TXT) {
                 return;
             }
             CEditDialog editDialog = CEditDialog.newInstance(getContext().getString(R.string.tools_text_watermark), watermarkView.getText());
-            editDialog.setEditListener(text->{
+            editDialog.setEditListener(text -> {
                 watermarkView.setText(text);
             });
-            if (getContext() instanceof FragmentActivity){
+            if (getContext() instanceof FragmentActivity) {
                 editDialog.show(((FragmentActivity) getContext()).getSupportFragmentManager(), "editDialog");
             }
         });
@@ -175,7 +184,8 @@ public class CWatermarkPageView extends FrameLayout {
 
     /**
      * Set the PDF document to be edited and specify the page number to be previewed
-     * @param document pdf document
+     *
+     * @param document  pdf document
      * @param pageIndex
      * @see CPDFDocument
      */
@@ -195,9 +205,7 @@ public class CWatermarkPageView extends FrameLayout {
     }
 
     private void initPageSize(int itemWidth, int itemHeight) {
-
         RectF rectF = document.pageAtIndex(pageIndex).getSize();
-
         float imageWidth = itemWidth;
         float imageHeight = ((float) imageWidth / (float) rectF.width()) * rectF.height();
         if (imageHeight > itemHeight) {
@@ -207,14 +215,14 @@ public class CWatermarkPageView extends FrameLayout {
 
         currentPageWidth = imageWidth;
         currentPageHeight = imageHeight;
-        whScale = rectF.width() / currentPageWidth ;
+        whScale = rectF.width() / currentPageWidth;
 
         ViewGroup.LayoutParams layoutParams = watermarkViewContent.getLayoutParams();
         layoutParams.width = (int) currentPageWidth;
         layoutParams.height = (int) currentPageHeight;
         watermarkViewContent.setLayoutParams(layoutParams);
 
-        watermarkView.setImageScale(whScale);
+        watermarkView.setScale(whScale);
         initDocumentThumbnail();
     }
 
@@ -235,20 +243,21 @@ public class CWatermarkPageView extends FrameLayout {
         return isTile;
     }
 
-    public void updateTileWatermark(){
-        if (isTile){
+    public void updateTileWatermark() {
+        if (isTile) {
             ivTilePreviewImage.setImageDrawable(createTileWatermark());
-        }else {
+        } else {
             ivTilePreviewImage.setImageDrawable(null);
         }
     }
-    private BitmapDrawable createTileWatermark(){
+
+    private BitmapDrawable createTileWatermark() {
         watermarkView.setEditable(false);
         watermarkView.buildDrawingCache();
         Bitmap bitmap = Bitmap.createBitmap(watermarkView.getDrawingCache());
         bitmap = CBitmapUtil.cropTransparent(bitmap);
         float padding = getSpacing();
-        Bitmap bgBitmap = Bitmap.createBitmap((int)(padding * 2 + bitmap.getWidth()),
+        Bitmap bgBitmap = Bitmap.createBitmap((int) (padding * 2 + bitmap.getWidth()),
                 (int) (padding * 2 + bitmap.getHeight()), Bitmap.Config.ARGB_4444);
         Canvas canvas = new Canvas(bgBitmap);
         canvas.drawBitmap(bitmap, padding, padding, null);
@@ -312,6 +321,7 @@ public class CWatermarkPageView extends FrameLayout {
 
     /**
      * create a default text watermark
+     *
      * @param watermarkText
      */
     public void createTextWatermark(String watermarkText) {
@@ -328,16 +338,64 @@ public class CWatermarkPageView extends FrameLayout {
         watermarkView.setImageBitmap(bitmap);
     }
 
-    public void applyWatermark() {
-        RectF pageSize = document.getPageSize(pageIndex);
+    public void editWatermark(CPDFWatermark watermark) {
+
+        RectF pageSize = document.pageAtIndex(pageIndex).getSize();
+        float pw = pageSize.width();
+        float ph = pageSize.height();
+        float mScale = 1F;
+        if (pw <= currentPageWidth && ph >= currentPageHeight) {
+            mScale = currentPageHeight / ph;
+        } else {
+            mScale = currentPageWidth / pw;
+        }
+        if (watermark.getType() == CPDFWatermark.Type.WATERMARK_TYPE_TEXT) {
+            watermarkView.initTextWaterMark(watermark.getText(), watermark.getTextRGBColor(), watermark.getFontSize(), (int) (watermark.getOpacity() * 255F));
+
+            CPDFTextAttribute.FontNameHelper.FontType fontType = CPDFTextAttribute.FontNameHelper.getFontType(watermark.getFontName());
+            boolean isBold = CPDFTextAttribute.FontNameHelper.isBold(watermark.getFontName());
+            boolean isItalic = CPDFTextAttribute.FontNameHelper.isItalic(watermark.getFontName());
+
+            watermarkView.setTypeface(fontType, isBold, isItalic);
+        } else {
+            watermarkView.setImageBitmap(watermark.getImage());
+            watermarkView.setWatermarkAlpha((int) (watermark.getOpacity() * 255F));
+        }
+        watermarkView.setScale(watermark.getScale() * mScale);
+
+        PointF centerPointF = new PointF((watermark.getHorizOffset() + pw / 2) * mScale,
+                (ph / 2 - watermark.getVertOffset()) * mScale);
+        watermarkView.setCenter(centerPointF);
+        watermarkView.setDegree((float) -(watermark.getRotation() * 180 / Math.PI));
+        isTile = watermark.isFullScreen();
+        front = watermark.isFront();
+        String pages = watermark.getPages();
+        List<Integer> pageList = new ArrayList<>();
+        getPageListForStr(pages, pageList, document.getPageCount(), true);
+        if (pageList.size() == 1) {
+            if (pageList.get(0) == pageIndex) {
+                pageRange = CWatermarkPageRangeAdapter.PageRange.CurrentPage;
+            }
+        }
+    }
+
+    public void createWatermark() {
         CPDFWatermark watermark = null;
-        if (watermarkView.getWatermarkType() == CWatermarkView.EditType.TXT){
+        if (watermarkView.getWatermarkType() == CWatermarkView.EditType.TXT) {
             watermark = document.createWatermark(CPDFWatermark.Type.WATERMARK_TYPE_TEXT);
-            watermark.setScale(watermarkView.getScale());
-        }else {
+        } else {
             watermark = document.createWatermark(CPDFWatermark.Type.WATERMARK_TYPE_IMG);
+        }
+        modifyWatermark(watermark);
+    }
+
+    public void modifyWatermark(CPDFWatermark watermark) {
+        RectF pageSize = document.getPageSize(pageIndex);
+        if (watermarkView.getWatermarkType() == CWatermarkView.EditType.TXT) {
+            watermark.setScale(watermarkView.getScale());
+        } else {
             Bitmap bitmap = watermarkView.getImageWatermarkBitmap();
-            if (bitmap != null){
+            if (bitmap != null) {
                 watermark.setImage(bitmap, bitmap.getWidth(), bitmap.getHeight());
             }
             watermark.setScale(watermarkView.getScale() * whScale);
@@ -354,7 +412,7 @@ public class CWatermarkPageView extends FrameLayout {
         watermark.setRotation(-watermarkView.getRadian());
         watermark.setHorizalign(CPDFWatermark.Horizalign.WATERMARK_HORIZALIGN_CENTER);
         watermark.setVertalign(CPDFWatermark.Vertalign.WATERMARK_VERTALIGN_CENTER);
-        float offsetX = whScale * watermarkView.centerPoint().x - pageSize.width() /2;
+        float offsetX = whScale * watermarkView.centerPoint().x - pageSize.width() / 2;
         float offsetY = pageSize.height() / 2 - whScale * watermarkView.centerPoint().y;
         watermark.setHorizOffset(offsetX);
         watermark.setVertOffset(offsetY);
@@ -365,29 +423,173 @@ public class CWatermarkPageView extends FrameLayout {
         watermark.release();
     }
 
-    private float getSpacing(){
+    private float getSpacing() {
         return watermarkSpacing * whScale;
     }
 
-    private String getPageRangeStr(){
-        if (pageRange == CWatermarkPageRangeAdapter.PageRange.CurrentPage){
-            return pageIndex+"";
+    private String getPageRangeStr() {
+        if (pageRange == CWatermarkPageRangeAdapter.PageRange.CurrentPage) {
+            return pageIndex + "";
         }
         StringBuilder stringBuilder = new StringBuilder();
         for (int i = 0; i < document.getPageCount(); i++) {
             stringBuilder.append(i);
-            if (i < document.getPageCount()){
+            if (i < document.getPageCount()) {
                 stringBuilder.append(",");
             }
         }
         return stringBuilder.toString();
     }
 
-    public void afterMeasured(CAfterMeasuredCallback callback){
+
+    public boolean getPageListForStr(String pageRange, List<Integer> pageNumberList, int pageCount, boolean isPageNumber) {
+        List<String> pagesNumber = new ArrayList<>();
+
+        if (TextUtils.isEmpty(pageRange)) {
+            return false;
+        }
+
+        char[] pageChars = pageRange.toCharArray();
+
+        for (char page : pageChars) {
+            if (page != '0' && page != '1' && page != '2' && page != '3' && page != '4'
+                    && page != '5' && page != '6' && page != '7' && page != '8' && page != '9'
+                    && page != '-' && page != ',') {
+                return false;
+            }
+        }
+
+        if (pageRange.contains("-")) {
+            String[] pagesSplit = pageRange.split("-");
+
+            for (int index = 0; index < pagesSplit.length; index++) {
+                String pageSplit = pagesSplit[index];
+
+                if (TextUtils.isEmpty(pageSplit)) {
+                    return false;
+                }
+
+                if (onGetPages(pageSplit, pagesNumber) && index < (pagesSplit.length - 1)) {
+                    pagesNumber.add("-");
+                }
+            }
+        } else {
+            if (!onGetPages(pageRange, pagesNumber)) {
+                pageNumberList.clear();
+                return false;
+            }
+        }
+
+        int lengths = String.valueOf(pageCount).length();
+        int dValue = isPageNumber ? 0 : 1;
+
+        for (int index = 0; index < pagesNumber.size(); index++) {
+            String page = pagesNumber.get(index);
+
+            if (page.length() > lengths) {
+                pageNumberList.clear();
+                return false;
+            }
+
+            if (isNumeric(page)) {
+                pageNumberList.add(Integer.parseInt(page) - dValue);
+            } else {
+                if (index - 1 >= 0 && index + 1 < pagesNumber.size()) {
+                    int first = Integer.parseInt(pagesNumber.get(index - 1));
+                    int last = Integer.parseInt(pagesNumber.get(index + 1));
+
+                    if (first >= last) {
+                        return true;
+                    } else if ((last - first) > 1) {
+                        int startPage = first + 1;
+                        int endPage = last - 1;
+
+                        if (startPage > endPage) {
+                            pageNumberList.clear();
+                            return false;
+                        }
+
+                        while (startPage <= endPage) {
+                            pageNumberList.add(startPage - dValue);
+                            startPage++;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (pageNumberList.isEmpty() || pageNumberList.get(pageNumberList.size() - 1) >= pageCount || pageNumberList.get(0) < 0) {
+            pageNumberList.clear();
+            return false;
+        }
+
+        return true;
+    }
+
+    private boolean isNumeric(String str) {
+        try {
+            Integer.parseInt(str);
+            return true;
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
+
+    private boolean onGetPages(String page, List<String> pagesNumber) {
+        if (isNumeric(page)) {
+            pagesNumber.add(page);
+            return true;
+        }
+        return false;
+    }
+
+    public String changePageStr(String pageRange, boolean isAdd) {
+        if (TextUtils.isEmpty(pageRange)) {
+            return pageRange;
+        }
+
+        StringBuilder buffer = new StringBuilder();
+        List<String> strList = new ArrayList<>();
+
+        if (pageRange.contains("-")) {
+            String[] list = pageRange.split("-");
+
+            for (int index = 0; index < list.length; index++) {
+                String s = list[index];
+
+                if (!TextUtils.isEmpty(s)) {
+                    strList.addAll(changePageCo(s, isAdd));
+
+                    if (index != list.length - 1) {
+                        strList.add("-");
+                    }
+                }
+            }
+        } else {
+            strList.addAll(changePageCo(pageRange, isAdd));
+        }
+
+        for (String item : strList) {
+            buffer.append(item);
+        }
+
+        return buffer.toString();
+    }
+
+    private List<String> changePageCo(String pageRange, boolean isAdd) {
+        List<String> result = new ArrayList<>();
+        // Implement your changePageCo logic here for Java
+        // You can use a loop or other Java constructs for the same logic as in the Kotlin function.
+        // Example: if (isAdd) { ... } else { ... }
+        return result;
+    }
+
+
+    public void afterMeasured(CAfterMeasuredCallback callback) {
         getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
             @Override
             public void onGlobalLayout() {
-                if (getMeasuredWidth() > 0 && getMeasuredHeight() > 0){
+                if (getMeasuredWidth() > 0 && getMeasuredHeight() > 0) {
                     getViewTreeObserver().removeOnGlobalLayoutListener(this);
                     if (callback != null) {
                         callback.callback();
@@ -397,7 +599,7 @@ public class CWatermarkPageView extends FrameLayout {
         });
     }
 
-    public interface CAfterMeasuredCallback{
+    public interface CAfterMeasuredCallback {
         void callback();
     }
 

+ 220 - 142
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/watermark/view/CWatermarkView.java

@@ -1,3 +1,12 @@
+/**
+ * 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.tools.security.watermark.view;
 
 
@@ -34,6 +43,7 @@ import android.view.View;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.DrawableRes;
+import androidx.annotation.IntRange;
 import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 
@@ -44,50 +54,82 @@ import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
 import java.util.Arrays;
 import java.util.List;
 
+
+
 public class CWatermarkView extends View {
 
     /**
-     * 控制缩放,旋转图标所在四个点得位置
+     * Control zoom and rotate the position of the four points of the icon
      */
     public static final int LEFT_TOP = 0;
     public static final int RIGHT_TOP = 1;
     public static final int RIGHT_BOTTOM = 2;
     public static final int LEFT_BOTTOM = 3;
 
-
     /**
-     * 一些默认的常量
+     * Default border and text padding values
      */
     public static final int DEFAULT_FRAME_PADDING = 8;
+
+    /**
+     * Default border width
+     */
     public static final int DEFAULT_FRAME_WIDTH = 2;
+
+    /**
+     * default border color value
+     */
     public static final int DEFAULT_FRAME_COLOR = Color.WHITE;
+
+    /**
+     * Default watermark scaling value
+     */
     public static final float DEFAULT_SCALE = 1.0F;
+
+    /**
+     * Default watermark rotation angle
+     */
     public static final float DEFAULT_DEGREE = 0F;
+
+    /**
+     * The display position of the icon used for dragging, rotating, and scaling the watermark.
+     * The default is the lower right corner.
+     */
     public static final int DEFAULT_CONTROL_LOCATION = RIGHT_BOTTOM;
+
+    /**
+     * Edit mode default value, edit mode is enabled by default
+     * true: editable mode
+     * false : preview mode
+     */
     public static final boolean DEFAULT_EDITABLE = true;
+
     public static final int DEFAULT_OTHER_DRAWABLE_WIDTH = 50;
     public static final int DEFAULT_OTHER_DRAWABLE_HEIGHT = 50;
 
     /**
-     * 点击时间小于300ms 视为单击
+     * Click time less than 300ms is regarded as a click
      **/
     public static final int CLICK_TIME = 100;
 
     /**
-     * 初始状态
+     * init status
      */
     public static final int STATUS_INIT = 0;
 
     /**
-     * 拖动状态
+     * drag status
      */
     public static final int STATUS_DRAG = 1;
 
     /**
-     * 旋转或者放大状态
+     * Rotate or zoom in state
      */
     public static final int STATUS_ROTATE_ZOOM = 2;
 
+    /**
+     * Text watermark default text content
+     */
     public static final String DEFAULT_STR = "";
 
     public enum EditType {
@@ -95,54 +137,55 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 设置当前编辑的水印类型
+     * Set the currently edited watermark type
      */
     private EditType editType = EditType.TXT;
 
     /**
-     * 用于旋转缩放的Bitmap
+     * image watermark bitmap
      */
     private Bitmap mBitmap = null;
 
     /**
-     * SingleTouchView的中心点坐标,相对于其父类布局而言的
+     * The center point coordinates of Single Touch View, relative to its parent layout
      */
     private PointF mCenterPoint = new PointF();
 
     /**
-     * View的宽度和高度,随着图片的旋转而变化(不包括控制旋转,缩放图片的宽高)
+     * The width and height of the View change with the rotation of the image
+     * (excluding controlling rotation and scaling the width and height of the image)
      */
     private int mViewWidth = 0;
 
     private int mViewHeight = 0;
 
     /**
-     * 图片的旋转角度
+     * Image rotation angle
      */
     private float mDegree = DEFAULT_DEGREE;
 
     /**
-     * 图片的缩放比例
+     * Image scaling
      */
     private float mScale = DEFAULT_SCALE;
 
     /**
-     * 用于缩放,旋转,平移的矩阵
+     * Matrices for scaling, rotation, translation
      */
     private Matrix mMatrix = new Matrix();
 
     /**
-     * SingleTouchView距离父类布局的左间距
+     * Left spacing of Single Touch View from parent layout
      */
     private int mViewPaddingLeft = 0;
 
     /**
-     * SingleTouchView距离父类布局的上间距
+     * Single Touch View's top spacing from parent layout
      */
     private int mViewPaddingTop = 0;
 
     /**
-     * 图片四个点坐标
+     * Coordinates of four points in the picture
      */
     private Point mLTPoint = new Point();
     private Point mRTPoint = new Point();
@@ -150,113 +193,114 @@ public class CWatermarkView extends View {
     private Point mLBPoint = new Point();
 
     /**
-     * 用于缩放,旋转的控制点的坐标
+     * Coordinates of control points used for scaling, rotation
      */
     private Point mControlPoint = new Point();
 
     /**
-     * 用于缩放,旋转的图标
+     * 用于缩放,Icons for zoom, rotate
      */
-    private Drawable controlDrawable = null; //context?.drawableByResId(R.drawable.ic_watermark_zoom)
+    private Drawable controlDrawable = null;
 
     /**
-     * 控制缩放,旋转图标的宽和高
+     * Control scaling, rotating icon width and height
      */
     private int mControlDrawableWidth = 0;
     private int mControlDrawableHeight = 0;
 
     /**
-     * 初始图片边界点到图片中心的距离
+     * The distance from the initial image boundary point to the image center
      **/
     private float drawToCenterDistance = 0F;
 
     /**
-     * 画外围框的Path
+     * Path to draw the outer frame
      */
     private Path mPath = new Path();
 
     /**
-     * 画外围框的画笔
+     * Brush for drawing outer borders
      */
     private Paint mPaint = new Paint();
 
     /**
-     * 画图片的画笔
+     * Brush for painting pictures
      **/
     private Paint mDrawPaint = new Paint();
 
     /**
-     * 文字的画笔
+     * text brush
      **/
     private TextPaint txtPaint = new TextPaint();
 
     /**
-     * 当前所处的状态
+     * Current status
      */
     private int mStatus = STATUS_INIT;
 
     /**
-     * 外边框与图片之间的间距, 单位是dip
+     * The distance between the outer border and the image, the unit is dip
      */
     private int framePadding = DEFAULT_FRAME_PADDING;
 
     /**
-     * 外边框颜色
+     * Outer border color
      */
     private int frameColor = DEFAULT_FRAME_COLOR;
 
     /**
-     * 外边框线条粗细, 单位是 dip
+     * Outer border line thickness, unit is dip
      */
     private int frameWidth = DEFAULT_FRAME_WIDTH;
 
     /**
-     * 是否处于可以缩放,平移,旋转状态
+     * Whether it is in a state where it can be zoomed, translated, and rotated
      */
     private boolean isEditable = DEFAULT_EDITABLE;
-    private DisplayMetrics metrics = null; //context?.resources?.displayMetrics
+    private DisplayMetrics metrics = null;
     private PointF mPreMovePointF = new PointF();
     private PointF mCurMovePointF = new PointF();
 
     /**
-     * 图片在旋转时x方向的偏移量
+     * The offset in the x direction when the image is rotated
      */
     private int offsetX = 0;
 
     /**
-     * 图片在旋转时y方向的偏移量
+     * The offset in the y direction of the image when rotating
      */
     private int offsetY = 0;
 
     /**
-     * 控制图标所在的位置(比如左上,右上,左下,右下)
+     * Control the location of the icon (such as upper left, upper right, lower left, lower right)
      */
     private int controlLocation = DEFAULT_CONTROL_LOCATION;
 
     /**
-     * txt水印的文字
+     * txt Watermark Text
      **/
     private String txtContent = DEFAULT_STR;
 
     /**
-     * 记录单击点击时间和坐标
+     * Record click time and coordinates
      **/
     private long downClickTime = 0L;
     private PointF downClickPoint = new PointF();
 
     /**
-     * 绘制txt的基线
+     * Draw the baseline of txt
      **/
     private float baseLineY = 0F;
 
     /**
-     * 绘制txt的原始宽高
+     * Draw the original width and height of txt
      **/
-    private float textWidth = 0f;
-    private float textHeight = 0f;
+    private float textWidth = 0F;
+
+    private float textHeight = 0F;
 
     /**
-     * 绘制区域mPath区域,判断点击和拖拽
+     * Draw area m Path area, determine click and drag
      **/
     private Region dragArea = new Region();
 
@@ -329,9 +373,9 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 初始化image水印
+     * Initialize image watermark
      *
-     * @param bitmap 作为水印的图片
+     * @param bitmap Picture as watermark
      */
     public void setImageBitmap(Bitmap bitmap) {
         editType = EditType.Image;
@@ -343,13 +387,13 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * image水印预览模式
+     * image watermark preview mode
      *
-     * @param bitmap 水印图片
-     * @param alpha  图片透明度
-     * @param degree 角度
-     * @param scale  缩放比例
-     * @param center 相对于父布局而言中心点坐标
+     * @param bitmap watermark image
+     * @param alpha  image opacity
+     * @param degree image rotation angle
+     * @param scale  scale
+     * @param center center point
      **/
     public void initPreviewImageBitmap(Bitmap bitmap, int alpha, float degree, float scale, PointF center) {
         editType = EditType.Image;
@@ -368,15 +412,15 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * txt水印预览模式
+     * txt watermark preview mode
      *
-     * @param text   水印文字
-     * @param color  文子颜色
-     * @param size   文字大小
-     * @param alpha  文字透明度
-     * @param degree 旋转角度
-     * @param scale  缩放比例
-     * @param center
+     * @param text   text content
+     * @param color  text color
+     * @param size   font size
+     * @param alpha  font opacity
+     * @param degree rotation angle
+     * @param scale  scale
+     * @param center center point
      **/
     public void initPreviewTextWaterMark(String text, @ColorInt int color, float size, int alpha, float degree, float scale, PointF center) {
         editType = EditType.TXT;
@@ -399,59 +443,94 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 初始化txt水印参数
+     * init text watermark
+     * @param text text content
+     * @param color font color
+     * @param size font size
+     * @param alpha font color opacity
      **/
     public void initTextWaterMark(String text, @ColorInt int color, float size, int alpha) {
         editType = EditType.TXT;
         txtPaint.setColor(color);
         txtPaint.setTextSize(size);
         txtPaint.setAlpha(alpha);
+        watermarkAlpha = alpha;
         txtContent = TextUtils.isEmpty(text) ? DEFAULT_STR : text;
         calculateBaseLine();
         calculateDrawToCenterDistance();
         transformDraw();
     }
 
-    public void setTextSize(float textSize){
+    public void setTextSize(float textSize) {
         txtPaint.setTextSize(textSize);
         calculateBaseLine();
         calculateDrawToCenterDistance();
         transformDraw();
     }
 
-    public int getTextSize(){
+    public int getTextSize() {
         return (int) txtPaint.getTextSize();
     }
 
-
-    public void setWatermarkAlpha(int alpha) {
+    /**
+     * set text or image watermark opacity
+     * @param alpha opacity
+     */
+    public void setWatermarkAlpha(@IntRange(from = 0, to = 255) int alpha) {
         watermarkAlpha = alpha;
         txtPaint.setAlpha(alpha);
         mDrawPaint.setAlpha(alpha);
         invalidate();
     }
 
-    public int getWatermarkAlpha(){
+    public int getWatermarkAlpha() {
         return watermarkAlpha;
     }
 
-    public boolean isBold(){
+    /**
+     * Get text watermark font is bold
+     * @return
+     */
+    public boolean isBold() {
         return isBold;
     }
 
-    public boolean isItalic(){
+    /**
+     * get text watermark font is italic
+     * @return
+     */
+    public boolean isItalic() {
         return isItalic;
     }
 
+    /**
+     * set text watermark font is bold
+     * @param bold
+     */
     public void setBold(boolean bold) {
         setTypeface(getFontType(), bold, isItalic());
     }
 
+    /**
+     * set text watermark font is italic
+     * @param italic
+     */
     public void setItalic(boolean italic) {
         setTypeface(getFontType(), isBold(), italic);
     }
 
-    public void setTypeface(CPDFTextAttribute.FontNameHelper.FontType fontType, boolean isBold, boolean isItalic){
+    /**
+     * Set text watermark font typeface
+     * @param fontType font type
+     * @param isBold set font is bold
+     * @param isItalic set font is italic
+     *
+     * @see com.compdfkit.core.annotation.CPDFTextAttribute.FontNameHelper.FontType#Helvetica
+     * @see com.compdfkit.core.annotation.CPDFTextAttribute.FontNameHelper.FontType#Times_Roman
+     * @see com.compdfkit.core.annotation.CPDFTextAttribute.FontNameHelper.FontType#Courier
+     *
+     */
+    public void setTypeface(CPDFTextAttribute.FontNameHelper.FontType fontType, boolean isBold, boolean isItalic) {
         String fontName = CPDFTextAttribute.FontNameHelper.obtainFontName(fontType, isBold, isItalic);
         Typeface typeface = CPDFTextAttribute.FontNameHelper.getInnerTypeface(getContext(), fontName);
         this.typeface = typeface;
@@ -478,7 +557,7 @@ public class CWatermarkView extends View {
         transformDraw();
     }
 
-    public Bitmap getImageWatermarkBitmap(){
+    public Bitmap getImageWatermarkBitmap() {
         return mBitmap;
     }
 
@@ -498,7 +577,7 @@ public class CWatermarkView extends View {
         }
     }
 
-    public void setImageScale(float scale) {
+    public void setScale(float scale) {
         if (mScale != scale) {
             mScale = scale;
             transformDraw();
@@ -509,15 +588,10 @@ public class CWatermarkView extends View {
         return mScale;
     }
 
-    public PointF centerPoint(){
+    public PointF centerPoint() {
         return mCenterPoint;
     }
 
-    /**
-     * 根据id设置旋转图
-     *
-     * @param resId
-     */
     public void setImageResource(@DrawableRes int resId) {
         Drawable drawable = ContextCompat.getDrawable(getContext(), resId);
         setImageDrawable(drawable);
@@ -532,7 +606,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 外围边框颜色
+     * Peripheral border color
      *
      * @param frameColor
      */
@@ -555,11 +629,12 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 设置控制图标的位置, 设置的值只能选择LEFT_TOP ,RIGHT_TOP, RIGHT_BOTTOM,LEFT_BOTTOM
+     * Set the position of the control icon. The set values can only be
+     * LEFT_TOP ,RIGHT_TOP, RIGHT_BOTTOM,LEFT_BOTTOM
      *
      * @param location controlLocation
      */
-    public void setControlLocation(int location) {
+    public void setControlLocation(@IntRange(from = 0, to = 3) int location) {
         if (controlLocation == location) {
             return;
         }
@@ -568,7 +643,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 设置图片中心点位置,相对于父布局而言
+     * Set the center point position of the image, relative to the parent layout
      *
      * @param center
      */
@@ -578,7 +653,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 设置是否处于可缩放,平移,旋转状态
+     * Set whether it is zoomable, panning, and rotating
      *
      * @param isEditable
      */
@@ -597,7 +672,7 @@ public class CWatermarkView extends View {
         invalidate();
     }
 
-    public int getTextColor(){
+    public int getTextColor() {
         return txtPaint.getColor();
     }
 
@@ -610,7 +685,7 @@ public class CWatermarkView extends View {
         return txtContent;
     }
 
-    public EditType getWatermarkType(){
+    public EditType getWatermarkType() {
         return editType;
     }
 
@@ -619,7 +694,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 调整View的大小,位置
+     * Adjust the size and position of View
      */
     private void adjustLayout() {
         int actualWidth = mViewWidth + mControlDrawableWidth;
@@ -643,7 +718,7 @@ public class CWatermarkView extends View {
 
     @Override
     protected void onDraw(Canvas canvas) {
-        //每次draw之前调整View的位置和大小
+        //Adjust the position and size of the View before each draw
         super.onDraw(canvas);
         switch (editType) {
             case Image:
@@ -660,11 +735,11 @@ public class CWatermarkView extends View {
                     float drawWidth = textWidth * mScale;
                     float drawHeight = textHeight * mScale;
 
-                    //1、设置画文字的起始点(其实位置的偏移量)
+                    //1、Set the starting point for drawing text (the offset of the actual position)
                     canvas.translate((offsetX + mControlDrawableWidth / 2F), (offsetY + mControlDrawableHeight / 2F));
-                    //2、绕着文字中心进行旋转
+                    //2、Rotate around the center of the text
                     canvas.rotate(mDegree % 360, drawWidth / 2, drawHeight / 2);
-                    //3、设置缩放比例
+                    //3、Set zoom ratio
                     canvas.scale(mScale, mScale);
                     canvas.drawText(txtContent, 0f, baseLineY, txtPaint);
                     canvas.restore();
@@ -673,10 +748,10 @@ public class CWatermarkView extends View {
         }
 
         canvas.save();
-        //处于可编辑状态才画边框和控制图标
+        //Draw borders and control icons only when in editable state
         if (isEditable) {
             canvas.drawPath(mPath, mPaint);
-            //画旋转, 缩放图标
+            //draw rotate zoom icon
             controlDrawable.setBounds(
                     mControlPoint.x - mControlDrawableWidth / 2,
                     mControlPoint.y - mControlDrawableHeight / 2, mControlPoint.x + mControlDrawableWidth
@@ -705,7 +780,8 @@ public class CWatermarkView extends View {
                 break;
             case MotionEvent.ACTION_UP:
                 mStatus = STATUS_INIT;
-                //判断是否为单击事件: 点击时间要小于CLICK_TIME,坐标点为ACTION_DOWN坐标点
+                // Determine whether it is a click event: the click time must be less than CLICK_TIME,
+                // and the coordinate point is the ACTION_DOWN coordinate point
                 if ((System.currentTimeMillis() - downClickTime) <= CLICK_TIME && abs(px - downClickPoint.x) < 1 && abs(py - downClickPoint.y) < 1) {
                     if (judgeStatus(px, py) == STATUS_DRAG) {
                         if (clickDrawAreaListener != null) {
@@ -713,36 +789,37 @@ public class CWatermarkView extends View {
                         }
                     }
                 }
-                //拖动后回调
+                // Callback after dragging
                 if (upActionListener != null) {
                     upActionListener.callback(mScale, mCenterPoint);
                 }
                 break;
             case MotionEvent.ACTION_MOVE:
-                //如果坐标点为ACTION_DOWN坐标点,则不做处理
+                // If the coordinate point is an ACTION DOWN coordinate point, no processing will be performed.
                 if (px == downClickPoint.x && py == downClickPoint.y) {
                     return true;
                 }
 
                 mCurMovePointF.set(px + mViewPaddingLeft, py + mViewPaddingTop);
                 if (mStatus == STATUS_ROTATE_ZOOM) {
-                    //移动的点到图片中心的距离
+                    // The distance between the moved point and the center of the picture
                     float moveToCenterDistance = distance4PointF(mCenterPoint, mCurMovePointF);
-                    //上次的点到图片中心的距离
+                    // The distance from the last point to the center of the picture
                     float preToCenterDistance = distance4PointF(mCenterPoint, mPreMovePointF);
 
-                    //是否是缩小的手势拖动
+                    // Whether it is a zoom gesture drag
                     boolean isReduce = preToCenterDistance > moveToCenterDistance;
-                    //计算缩放比例
+                    // Calculate scaling
                     float scale = moveToCenterDistance / drawToCenterDistance;
-                    //如果是缩小的手势,但是计算的scale比上次大,则不进行缩放,反之亦然
+                    // If it is a zoom out gesture, but the calculated scale is larger than the last time,
+                    // no scaling will be performed, and vice versa.
                     if (isReduce && scale < mScale) {
                         mScale = scale;
                     } else if (!isReduce && scale > mScale) {
                         mScale = scale;
                     }
 
-                    // 角度
+                    // angle
                     double a = distance4PointF(mCenterPoint, mPreMovePointF);
                     double b = distance4PointF(mPreMovePointF, mCurMovePointF);
                     double c = distance4PointF(mCenterPoint, mCurMovePointF);
@@ -753,13 +830,14 @@ public class CWatermarkView extends View {
                     double radian = acos(cosb);
                     double newDegree = radianToDegree(radian);
 
-                    //center -> proMove的向量, 我们使用PointF来实现
+                    //center -> vector of proMove, we use PointF to implement
                     PointF centerToProMove = new PointF(mPreMovePointF.x - mCenterPoint.x, mPreMovePointF.y - mCenterPoint.y);
 
-                    //center -> curMove 的向量
+                    //center -> vector of curMove
                     PointF centerToCurMove = new PointF(mCurMovePointF.x - mCenterPoint.x, mCurMovePointF.y - mCenterPoint.y);
 
-                    //向量叉乘结果, 如果结果为负数, 表示为逆时针, 结果为正数表示顺时针
+                    // Vector cross product result. If the result is a negative number, it means counterclockwise.
+                    // If the result is a positive number, it means clockwise.
                     double result = centerToProMove.x * centerToCurMove.y - centerToProMove.y * centerToCurMove.x;
                     if (result < 0) {
                         newDegree = -newDegree;
@@ -767,7 +845,7 @@ public class CWatermarkView extends View {
                     mDegree += newDegree;
                     transformDraw();
                 } else if (mStatus == STATUS_DRAG) {
-                    // 修改中心点
+                    // Modify center point
                     mCenterPoint.x += mCurMovePointF.x - mPreMovePointF.x;
                     mCenterPoint.y += mCurMovePointF.y - mPreMovePointF.y;
                     adjustLayout();
@@ -779,7 +857,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 设置Matrix, 强制刷新
+     * Set Matrix, force refresh
      */
     private void transformDraw() {
         float drawWidth = 0;
@@ -803,18 +881,18 @@ public class CWatermarkView extends View {
 
         computeRect(-framePadding, -framePadding, (int) (drawWidth + framePadding), (int) (drawHeight + framePadding), (int) mDegree);
 
-        //设置缩放比例
+        //Set zoom ratio
         mMatrix.setScale(mScale, mScale);
-        //绕着图片中心进行旋转
+        //Rotate around the center of the image
         mMatrix.postRotate(mDegree % 360, (drawWidth / 2F), (drawHeight / 2F));
-        //设置画该图片的起始点
+        //Set the starting point for drawing the picture
         mMatrix.postTranslate((offsetX + mControlDrawableWidth / 2F), (offsetY + mControlDrawableHeight / 2F));
 
         adjustLayout();
     }
 
     /**
-     * 获取四个点和View的大小
+     * Get four points and the size of the View
      *
      * @param left
      * @param top
@@ -833,40 +911,38 @@ public class CWatermarkView extends View {
         mRBPoint = obtainRotationPoint(cp, rb, degree);
         mLBPoint = obtainRotationPoint(cp, lb, degree);
 
-        //计算X坐标最大的值和最小的值
+        //Calculate the maximum value and minimum value of the X coordinate
         int maxCoordinateX = maxOrNull(Arrays.asList(mLTPoint.x, mRTPoint.x, mRBPoint.x, mLBPoint.x), 0);
 
         int minCoordinateX = minOrNull(Arrays.asList(mLTPoint.x, mRTPoint.x, mRBPoint.x, mLBPoint.x), 0);
         mViewWidth = maxCoordinateX - minCoordinateX;
 
-
-        //计算Y坐标最大的值和最小的值
+        //Calculate the largest and smallest value of the Y coordinate
         int maxCoordinateY = maxOrNull(Arrays.asList(mLTPoint.y, mRTPoint.y, mRBPoint.y, mLBPoint.y), 0);
         int minCoordinateY = minOrNull(Arrays.asList(mLTPoint.y, mRTPoint.y, mRBPoint.y, mLBPoint.y), 0);
         mViewHeight = maxCoordinateY - minCoordinateY;
 
-
-        //View中心点的坐标
+        //The coordinates of the center point of the View
         Point viewCenterPoint = new Point((maxCoordinateX + minCoordinateX) / 2, (maxCoordinateY + minCoordinateY) / 2);
         offsetX = mViewWidth / 2 - viewCenterPoint.x;
         offsetY = mViewHeight / 2 - viewCenterPoint.y;
         int halfControlDrawableWidth = mControlDrawableWidth / 2;
         int halfControlDrawableHeight = mControlDrawableHeight / 2;
 
-        //将Bitmap的四个点的X的坐标移动offsetX + halfDrawableWidth
+        //Move the X coordinates of the four points of the Bitmap by offsetX + halfDrawableWidth
         mLTPoint.x += offsetX + halfControlDrawableWidth;
         mRTPoint.x += offsetX + halfControlDrawableWidth;
         mRBPoint.x += offsetX + halfControlDrawableWidth;
         mLBPoint.x += offsetX + halfControlDrawableWidth;
 
-        //将Bitmap的四个点的Y坐标移动offsetY + halfDrawableHeight
+        //Move the Y coordinates of the four points of the Bitmap by offsetY + halfDrawableHeight
         mLTPoint.y += offsetY + halfControlDrawableHeight;
         mRTPoint.y += offsetY + halfControlDrawableHeight;
         mRBPoint.y += offsetY + halfControlDrawableHeight;
         mLBPoint.y += offsetY + halfControlDrawableHeight;
         mControlPoint = locationToPoint(controlLocation);
 
-        //计算绘制区域
+        //Calculate drawing area
         RectF rect = new RectF();
 
         mPath.reset();
@@ -881,7 +957,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 获取旋转某个角度之后的点
+     * Get the point after rotating by a certain angle
      *
      * @param center viewCenter
      * @param source
@@ -889,55 +965,55 @@ public class CWatermarkView extends View {
      * @return
      */
     private Point obtainRotationPoint(Point center, Point source, int degree) {
-        //两者之间的距离
+        //distance between the two
         Point disPoint = new Point();
         disPoint.x = source.x - center.x;
         disPoint.y = source.y - center.y;
 
-        //没旋转之前的弧度
+        //The arc before rotation
         double originRadian = 0.0;
 
-        //没旋转之前的角度
+        //Angle before rotation
         double originDegree = 0.0;
 
-        //旋转之后的角度
+        //Angle after rotation
         double resultDegree = 0.0;
 
-        //旋转之后的弧度
+        //arc after rotation
         double resultRadian = 0.0;
 
-        //经过旋转之后点的坐标
+        //The coordinates of the point after rotation
         Point resultPoint = new Point();
         double distance = sqrt((disPoint.x * disPoint.x + disPoint.y * disPoint.y));
         if (disPoint.x == 0 && disPoint.y == 0) {
             return center;
-            // 第一象限
+            // Quadrant 1
         } else if (disPoint.x >= 0 && disPoint.y >= 0) {
-            // 计算与x正方向的夹角
+            // Calculate the angle with the positive x direction
             originRadian = asin(disPoint.y / distance);
 
-            // 第二象限
+            // Quadrant 2
         } else if (disPoint.x < 0 && disPoint.y >= 0) {
-            // 计算与x正方向的夹角
+            // Calculate the angle with the positive x direction
             originRadian = asin(abs(disPoint.x) / distance);
             originRadian += Math.PI / 2;
 
-            // 第三象限
+            // Quadrant 3
         } else if (disPoint.x < 0 && disPoint.y < 0) {
-            // 计算与x正方向的夹角
+            // Calculate the angle with the positive x direction
             originRadian = asin(abs(disPoint.y) / distance);
             originRadian += Math.PI;
         } else if (disPoint.x >= 0 && disPoint.y < 0) {
-            // 计算与x正方向的夹角
+            // Calculate the angle with the positive x direction
             originRadian = asin(disPoint.x / distance);
             originRadian += Math.PI * 3 / 2;
         }
 
-        // 弧度换算成角度
+        // Convert radians to degrees
         originDegree = radianToDegree(originRadian);
         resultDegree = originDegree + degree;
 
-        // 角度转弧度
+        // angle to radian
         resultRadian = degreeToRadian(resultDegree);
         resultPoint.x = (int) Math.round(distance * cos(resultRadian));
         resultPoint.y = (int) Math.round(distance * sin(resultRadian));
@@ -947,7 +1023,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 根据位置判断控制图标处于那个点
+     * Determine which point the control icon is based on its position
      *
      * @return
      */
@@ -966,7 +1042,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 角度换算成弧度
+     * Convert angles to radians
      *
      * @param degree
      * @return
@@ -976,7 +1052,8 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 根据点击的位置判断是否点中控制旋转,缩放的图片, 初略的计算
+     * Based on the clicked position, determine whether the click is in the control of rotation,
+     * zooming of the picture, and rough calculation.
      *
      * @param x
      * @param y
@@ -986,10 +1063,11 @@ public class CWatermarkView extends View {
         PointF touchPoint = new PointF(x, y);
         PointF controlPointF = new PointF(mControlPoint);
 
-        //点击的点到控制旋转,缩放点的距离
+        //The distance from the clicked point to the point that controls rotation and scaling
         float distanceToControl = distance4PointF(touchPoint, controlPointF);
 
-        //如果两者之间的距离小于 控制图标的宽度,高度的最小值,则认为点中了控制图标
+        // If the distance between the two is less than the minimum value of the width and height of the control icon,
+        // it is considered that the control icon has been clicked.
         if (distanceToControl < coerceAtMost((mControlDrawableWidth / 2), mControlDrawableHeight / 2)) {
             return STATUS_ROTATE_ZOOM;
         } else if (dragArea.contains((int) x, (int) y)) {
@@ -1001,7 +1079,7 @@ public class CWatermarkView extends View {
 
     /**
      * @methodName: created by liujiyuan on 2021/3/29 下午6:13.
-     * @description:计算初始水印图片边界点到图片中心的距离
+     * @description:Calculate the distance from the initial watermark image boundary point to the image center
      */
     private void calculateDrawToCenterDistance() {
         float halfDrawWidth = 0;
@@ -1024,21 +1102,21 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 计算基线
+     * Calculate baseline
      **/
     private void calculateBaseLine() {
         Paint.FontMetrics fontMetrics = txtPaint.getFontMetrics();
         textHeight = fontMetrics.descent - fontMetrics.ascent;
-        // 计算中线跟基线的差值
+        // Calculate the difference between the midline and the baseline
         float dy = textHeight / 2 - fontMetrics.bottom;
-        //计算baseLineY
+        // calculate baseLineY
         int drawHeight = (int) textHeight;
         baseLineY = drawHeight / 2 + dy;
         textWidth = txtPaint.measureText(txtContent);
     }
 
     /**
-     * 两个点之间的距离
+     * distance between two points
      *
      * @param pf1 (x1,y1)
      * @param pf2 (x2,y2)
@@ -1050,7 +1128,7 @@ public class CWatermarkView extends View {
     }
 
     /**
-     * 从Drawable中获取Bitmap对象
+     * Get Bitmap object from Drawable
      *
      * @param drawable
      * @return

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/CertificateDigitalDatas.java

@@ -17,7 +17,6 @@ import androidx.annotation.Nullable;
 
 import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
 import com.compdfkit.core.document.CPDFDocument;
-import com.compdfkit.core.signature.CPDFCertInfo;
 import com.compdfkit.core.signature.CPDFOwnerInfo;
 import com.compdfkit.core.signature.CPDFSignature;
 import com.compdfkit.core.signature.CPDFSigner;

+ 0 - 5
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/bean/CPDFOwnerItemData.java

@@ -10,15 +10,10 @@
 package com.compdfkit.tools.signature.bean;
 
 
-import android.text.TextUtils;
-
 import com.compdfkit.core.signature.CPDFOwnerInfo;
 import com.compdfkit.core.signature.CPDFX509;
 import com.compdfkit.tools.signature.CertificateDigitalDatas;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class CPDFOwnerItemData {
 
     public CPDFOwnerItemData() {

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/importcert/create/CreateCertificateDigitalDialog.java

@@ -16,7 +16,6 @@ import android.text.TextUtils;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.LinearLayout;
-import android.widget.ScrollView;
 import android.widget.Switch;
 import android.widget.ViewSwitcher;
 

+ 0 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertAttrDatas.java

@@ -11,12 +11,10 @@ package com.compdfkit.tools.signature.info;
 
 
 import android.content.Context;
-import android.text.TextUtils;
 
 import com.compdfkit.core.signature.CPDFAuinfoac;
 import com.compdfkit.core.signature.CPDFCertInfo;
 import com.compdfkit.core.signature.CPDFExtInfo;
-import com.compdfkit.core.signature.CPDFOwnerInfo;
 import com.compdfkit.core.signature.CPDFX509;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.date.CDateUtil;

+ 0 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignatureWidgetImpl.java

@@ -10,26 +10,20 @@
 package com.compdfkit.tools.signature.pdfproperties.pdfsign;
 
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.os.Environment;
 
 import androidx.fragment.app.FragmentActivity;
 
-import com.compdfkit.core.annotation.CPDFImageScaleType;
 import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
-import com.compdfkit.core.signature.CPDFCertInfo;
 import com.compdfkit.core.signature.CPDFDigitalSigConfig;
 import com.compdfkit.core.signature.CPDFSignature;
 import com.compdfkit.core.signature.CPDFX509;
 import com.compdfkit.tools.R;
-import com.compdfkit.tools.common.utils.CLog;
 import com.compdfkit.tools.common.utils.CToastUtil;
-import com.compdfkit.tools.common.utils.image.CBitmapUtil;
 import com.compdfkit.tools.common.views.directory.CFileDirectoryDialog;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.signature.CertificateDigitalDatas;
 import com.compdfkit.tools.signature.importcert.create.CPDFSelectDigitalSignatureDialog;
-import com.compdfkit.tools.signature.info.CertAttrDatas;
 import com.compdfkit.tools.signature.info.CertDigitalSignInfoDialog;
 import com.compdfkit.tools.signature.preview.CDigitalSignStylePreviewDialog;
 import com.compdfkit.ui.proxy.form.CPDFSignatureWidgetImpl;

+ 0 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/verify/CVerifySignStatusView.java

@@ -21,13 +21,11 @@ import androidx.annotation.Nullable;
 import androidx.appcompat.widget.AppCompatButton;
 import androidx.appcompat.widget.AppCompatImageView;
 import androidx.appcompat.widget.AppCompatTextView;
-import androidx.fragment.app.FragmentActivity;
 
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.signature.SignatureStatus;
 import com.compdfkit.tools.signature.bean.CPDFDocumentSignInfo;
-import com.compdfkit.tools.signature.info.signlist.CPDFCertDigitalSignListDialog;
 
 public class CVerifySignStatusView extends FrameLayout {
 

+ 0 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/viewer/pdfinfo/CPDFDocumentInfoDialogFragment.java

@@ -14,7 +14,6 @@ import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.core.document.CPDFDocumentPermissionInfo;
 import com.compdfkit.core.document.CPDFInfo;
 import com.compdfkit.tools.R;
-import com.compdfkit.tools.common.utils.CToastUtil;
 import com.compdfkit.tools.common.utils.date.CDateUtil;
 import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;

+ 1 - 1
ComPDFKit_Tools/src/main/res/drawable/selector_radiobutton.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
+<selector>
 
 <!--    <item android:drawable="@drawable/ic_radio_btn_seleted" android:state_checked="true" android:state_enabled="true" />-->
 <!--    <item android:drawable="@drawable/ic_base_radio_unselected" />-->

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

@@ -1,7 +1,6 @@
 <?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">
 

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

@@ -1,6 +1,5 @@
 <?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"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="@color/tools_style_content_bg"

+ 1 - 3
ComPDFKit_Tools/src/main/res/layout/tools_file_directory_list_title_separator_item.xml

@@ -1,10 +1,8 @@
 <?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="wrap_content"
-    android:layout_height="40dp"
-    >
+    android:layout_height="40dp">
 
     <androidx.appcompat.widget.AppCompatImageView
         android:layout_width="24dp"