Browse Source

PDFTool(Android) - 1.数字签名列表、详情等界面

liuxiaolong 1 year ago
parent
commit
33617b5af6
74 changed files with 2854 additions and 478 deletions
  1. 1 2
      Annotations/src/main/java/com/compdfkit/annotations/PDFAnnotationSampleActivity.java
  2. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfpic/CImageStyleFragment.java
  3. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfsignature/data/CSignatureDatas.java
  4. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfstamp/data/CStampDatas.java
  5. 10 4
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/activity/CBasicActivity.java
  6. 1 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CFileUtils.java
  7. 49 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CPermissionUtil.java
  8. 20 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CUriUtil.java
  9. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/animation/CFillScreenManager.java
  10. 9 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/animation/ConstraintSetUtils.java
  11. 6 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/date/CDateUtil.java
  12. 2 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/view/CEditText.java
  13. 5 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/viewutils/CDimensUtils.java
  14. 4 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/CToolBar.java
  15. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/font/CExternFontSpinnerAdapter.java
  16. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/font/CFontSpinnerAdapter.java
  17. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfview/CPreviewMode.java
  18. 10 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/CSignatureToolBar.java
  19. 175 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/CertificateDigitalDatas.java
  20. 34 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/bean/CPDFSignatureItemData.java
  21. 0 66
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/create/CertificateDigitalDatas.java
  22. 13 4
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/CImportCertificateDigitalDialog.java
  23. 17 4
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/CPDFSelectDigitalSignatureDialog.java
  24. 94 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/importcert/create/CountryReginSpinnerAdapter.java
  25. 93 43
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/create/CreateCertificateDigitalDialog.java
  26. 81 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertDetailsDialog.java
  27. 90 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertDigitalSignAttributesDialog.java
  28. 128 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertDigitalSignInfoDialog.java
  29. 148 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/signlist/CPDFCertDigitalSignListDialog.java
  30. 55 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/signlist/adapter/CertDigitalSignListAdapter.java
  31. 21 27
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignStyleData.java
  32. 69 26
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignStylePreviewView.java
  33. 46 4
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignatureWidgetImpl.java
  34. 36 18
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/preview/CDigitalSignStylePreviewDialog.java
  35. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/preview/view/CSignStylePositionView.java
  36. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/preview/view/CSignStyleReasonView.java
  37. 126 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/verify/view/CVerifySignStatusView.java
  38. 27 0
      ComPDFKit_Tools/src/main/res/drawable/tools_ic_digital_sign_is_failures.xml
  39. 18 0
      ComPDFKit_Tools/src/main/res/drawable/tools_ic_digital_sign_is_valid.xml
  40. 17 0
      ComPDFKit_Tools/src/main/res/drawable/tools_ic_digital_sign_is_wrong.xml
  41. 6 0
      ComPDFKit_Tools/src/main/res/drawable/tools_sign_cert_info_btn_bg.xml
  42. 71 0
      ComPDFKit_Tools/src/main/res/layout-land/tools_sign_style_preview_dialog.xml
  43. 244 0
      ComPDFKit_Tools/src/main/res/layout-land/tools_sign_style_preview_main.xml
  44. 1 0
      ComPDFKit_Tools/src/main/res/layout/tools_layout_c_edit_text.xml
  45. 36 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_cert_digital_sign_list_fragment.xml
  46. 98 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_cert_digital_sign_list_item.xml
  47. 264 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_certificate_attributes_fragment.xml
  48. 101 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_certificate_details.xml
  49. 143 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_certificate_digital_sign_info_fragment.xml
  50. 1 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_create_cert_digital_id_fragment.xml
  51. 47 23
      ComPDFKit_Tools/src/main/res/layout/tools_sign_create_cert_digital_id_info_layout.xml
  52. 38 23
      ComPDFKit_Tools/src/main/res/layout/tools_sign_create_cert_digital_id_save_layout.xml
  53. 4 5
      ComPDFKit_Tools/src/main/res/layout/tools_sign_digital_sign_select_dialog.xml
  54. 159 139
      ComPDFKit_Tools/src/main/res/layout/tools_sign_import_certificate_digital_id_fragment.xml
  55. 6 5
      ComPDFKit_Tools/src/main/res/layout/tools_sign_style_preview_dialog.xml
  56. 4 3
      ComPDFKit_Tools/src/main/res/layout/tools_sign_style_preview_main.xml
  57. 2 2
      ComPDFKit_Tools/src/main/res/layout/tools_sign_style_preview_position.xml
  58. 52 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_verify_sign_status_view.xml
  59. 1 1
      ComPDFKit_Tools/src/main/res/layout/tools_signature_tool_bar.xml
  60. 0 0
      ComPDFKit_Tools/src/main/res/layout/tools_spinner_list_item.xml
  61. 10 0
      ComPDFKit_Tools/src/main/res/values/tools_attrs.xml
  62. 81 23
      ComPDFKit_Tools/src/main/res/values/tools_strings.xml
  63. 4 0
      ComPDFKit_Tools/src/main/res/values/tools_styles.xml
  64. 3 0
      ComPDFKit_Tools/src/main/res/values/tools_themes.xml
  65. 2 3
      ContentEditor/src/main/java/com/compdfkit/contenteditor/PDFEditSampleActivity.java
  66. BIN
      DigitalSignature/src/main/assets/PSPDFKit_Widget_2_Widget.pdf
  67. BIN
      DigitalSignature/src/main/assets/測試樣張01_Signed拷貝.pdf
  68. 11 23
      DigitalSignature/src/main/java/com/compdfkit/digitalsignature/CViewerScreenStatusManager.java
  69. 29 4
      DigitalSignature/src/main/java/com/compdfkit/digitalsignature/PDFSignaturesSampleActivity.java
  70. 15 6
      DigitalSignature/src/main/res/layout/signatures_pdf_sample_activity.xml
  71. 1 1
      DocsEditor/src/main/java/com/compdfkit/docseditor/MainActivity.java
  72. 1 1
      Forms/src/main/java/com/compdfkit/forms/PDFFormSampleActivity.java
  73. 4 4
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/MainActivity.java
  74. 1 1
      Viewer/src/main/java/com/compdfkit/viewer/PDFViewerSampleActivity.java

+ 1 - 2
Annotations/src/main/java/com/compdfkit/annotations/PDFAnnotationSampleActivity.java

@@ -23,7 +23,6 @@ import com.compdfkit.tools.common.views.pdfbota.CPDFBOTA;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBotaDialogFragment;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBotaFragmentTabs;
 import com.compdfkit.tools.common.views.pdfproperties.CAnnotationType;
-import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
 import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
 import com.compdfkit.ui.reader.CPDFReaderView;
@@ -155,7 +154,7 @@ public class PDFAnnotationSampleActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocument();
                 } else {
                     requestStoragePermissions();

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfpic/CImageStyleFragment.java

@@ -33,7 +33,7 @@ public class CImageStyleFragment extends CBasicPropertiesFragment {
     private ActivityResultLauncher<CImageResultContracts.RequestType> imageLauncher = registerForActivityResult(new CImageResultContracts(), result -> {
         if (result != null && viewModel != null) {
             File file = new File(getContext().getFilesDir(), CFileUtils.CACHE_FOLDER);
-            String path = CFileUtils.copyImageToInternalDirectory(getContext(), result, file.getAbsolutePath(), "pic_" + CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT) + ".png");
+            String path = CFileUtils.copyFileToInternalDirectory(getContext(), result, file.getAbsolutePath(), "pic_" + CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT) + ".png");
             viewModel.getStyle().setImagePath(path);
             dismissStyleDialog();
         }

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfsignature/data/CSignatureDatas.java

@@ -71,7 +71,7 @@ public class CSignatureDatas {
 
     public static String saveSignatureImage(Context context, Uri imageUri){
         File file = new File(context.getFilesDir(), CFileUtils.SIGNATURE_FOLDER);
-        return CFileUtils.copyImageToInternalDirectory(context, imageUri, file.getAbsolutePath(),
+        return CFileUtils.copyFileToInternalDirectory(context, imageUri, file.getAbsolutePath(),
                 "signature_"+ CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT)+".png");
     }
 }

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfstamp/data/CStampDatas.java

@@ -141,7 +141,7 @@ public class CStampDatas {
 
     public static String saveStampImage(Context context, Uri imageUri) {
         File file = new File(context.getFilesDir(), CFileUtils.IMAGE_STAMP_FOLDER);
-        return CFileUtils.copyImageToInternalDirectory(context, imageUri, file.getAbsolutePath(),
+        return CFileUtils.copyFileToInternalDirectory(context, imageUri, file.getAbsolutePath(),
                 "stamp_" + CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT) + ".png");
     }
 }

+ 10 - 4
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/activity/CBasicActivity.java

@@ -13,7 +13,6 @@ package com.compdfkit.tools.common.activity;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.graphics.Color;
-import android.net.Uri;
 import android.os.Build;
 import android.os.Environment;
 import android.provider.Settings;
@@ -38,6 +37,7 @@ import com.compdfkit.tools.annotation.pdfproperties.pdfnote.CPDFtextAnnotImpl;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.contextmenu.impl.CEditImageContextMenuView;
 import com.compdfkit.tools.common.contextmenu.impl.CEditTextContextMenuView;
+import com.compdfkit.tools.common.contextmenu.impl.CSignatureContextMenuView;
 import com.compdfkit.tools.common.utils.CFileUtils;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleManager;
@@ -58,17 +58,17 @@ public class CBasicActivity extends AppCompatActivity {
 
     protected static final int REQUEST_EXTERNAL_PERMISSION = 1233;
 
-    protected final static String[] STORAGE_PERMISSIONS = new String[]{
+    public final static String[] STORAGE_PERMISSIONS = new String[]{
             android.Manifest.permission.READ_EXTERNAL_STORAGE,
             android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
     };
 
-    protected boolean hasPermissions(String... perms) {
+    public boolean hasStoragePermissions(String... perms) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
             return true;
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-            return true;
+            return Environment.isExternalStorageManager();
         }
         for (String perm : perms) {
             if (ContextCompat.checkSelfPermission(this, perm)
@@ -105,6 +105,12 @@ public class CBasicActivity extends AppCompatActivity {
                                 .defaultFormHelper()
                                 .create(pdfView));
                 break;
+            case Signature:
+                pdfView.getCPdfReaderView().setContextMenuShowListener(
+                        new CPDFContextMenuHelper.Builder()
+                                .setSignatureContextMenu(new CSignatureContextMenuView())
+                                .create(pdfView));
+                break;
             default:
                 break;
         }

+ 1 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CFileUtils.java

@@ -11,7 +11,6 @@ import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.provider.DocumentsContract;
 import android.provider.MediaStore;
-import android.util.Log;
 
 import androidx.core.content.FileProvider;
 
@@ -106,7 +105,7 @@ public class CFileUtils {
         }
     }
 
-    public static String copyImageToInternalDirectory(
+    public static String copyFileToInternalDirectory(
             Context context,
             Uri imageUri,
             String dir,

+ 49 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CPermissionUtil.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.tools.common.utils;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.Settings;
+
+import androidx.core.content.ContextCompat;
+
+public class CPermissionUtil {
+
+    public final static String[] STORAGE_PERMISSIONS = new String[]{
+            android.Manifest.permission.READ_EXTERNAL_STORAGE,
+            android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
+    };
+
+    public static boolean hasStoragePermissions(Context context) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            return true;
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            return Environment.isExternalStorageManager();
+        }
+        for (String perm : STORAGE_PERMISSIONS) {
+            if (ContextCompat.checkSelfPermission(context, perm)
+                    != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static void openAppSettings(Context context){
+        context.startActivity(new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION));
+    }
+
+}

+ 20 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CUriUtil.java

@@ -1,13 +1,16 @@
 package com.compdfkit.tools.common.utils;
 
+import android.content.ContentResolver;
 import android.content.Context;
 import android.database.Cursor;
 import android.media.ExifInterface;
 import android.net.Uri;
+import android.os.ParcelFileDescriptor;
 import android.provider.MediaStore;
 import android.text.TextUtils;
 
 import java.io.File;
+import java.io.InputStream;
 
 public class CUriUtil {
 
@@ -64,7 +67,7 @@ public class CUriUtil {
             if (TextUtils.isEmpty(fileName)) {
                 fileName = "pic_" + System.currentTimeMillis() + ".png";
             }
-            String image = CFileUtils.copyImageToInternalDirectory(
+            String image = CFileUtils.copyFileToInternalDirectory(
                     context, uri, file.getAbsolutePath(), fileName);
             return image;
         } catch (Exception e) {
@@ -102,4 +105,20 @@ public class CUriUtil {
             return degree;
         }
     }
+
+    public static int getUriFd(Context context, Uri uri){
+        try {
+            ContentResolver resolver = context.getContentResolver();
+            InputStream inputStream = resolver.openInputStream(uri);
+            ParcelFileDescriptor fileDescriptor = resolver.openFileDescriptor(uri, "r");
+            int detachFd = fileDescriptor.detachFd();
+            if (inputStream != null) {
+                inputStream.close();
+            }
+            fileDescriptor.close();
+            return detachFd;
+        } catch (Exception e) {
+            return 0;
+        }
+    }
 }

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/animation/CFillScreenManager.java

@@ -23,7 +23,7 @@ public class CFillScreenManager {
 
     public static final long CONFIG_SHORT_ANIM_TIME = 200L;
 
-    private LinkedHashSet<View> topToolViewList = new LinkedHashSet<>();
+    public LinkedHashSet<View> topToolViewList = new LinkedHashSet<>();
 
     public LinkedHashSet<View> bottomToolViewList = new LinkedHashSet<>();
 

+ 9 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/animation/ConstraintSetUtils.java

@@ -66,7 +66,15 @@ public class ConstraintSetUtils {
         constraintSet.connect(view.getId(), ConstraintSet.TOP, view.getId(), ConstraintSet.PARENT_ID, ConstraintSet.TOP);
         constraintSet.connect(view.getId(), ConstraintSet.BOTTOM, view.getId(), ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM);
     }
-    
+
+    public void show(ConstraintSet constraintSet, View view){
+        constraintSet.setVisibility(view.getId(), ConstraintSet.VISIBLE);
+    }
+
+    public void hide(ConstraintSet constraintSet, View view){
+        constraintSet.setVisibility(view.getId(), ConstraintSet.GONE);
+    }
+
     public void apply(ConstraintSet constraintSet, ConstraintLayout rootView){
         AutoTransition autoTransition = new AutoTransition();
         autoTransition.setDuration(200);

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

@@ -2,13 +2,19 @@ package com.compdfkit.tools.common.utils.date;
 
 
 import android.text.TextUtils;
+import android.text.format.DateUtils;
 
 import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.util.Calendar;
 import java.util.Date;
+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";
 
     /**
      * Transform a PDF date string in the format D:20230130060237+00'00' to a human-readable yyyy-MM-dd HH:mm:ss date string.

+ 2 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/view/CEditText.java

@@ -55,12 +55,14 @@ public class CEditText extends FrameLayout {
         TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CEditText);
         if (typedArray != null) {
             String title = typedArray.getString(R.styleable.CEditText_android_title);
+            String hint = typedArray.getString(R.styleable.CEditText_android_hint);
             int imeOptions = typedArray.getInt(R.styleable.CEditText_android_imeOptions, EditorInfo.IME_ACTION_DONE);
             int inputType = typedArray.getInt(R.styleable.CEditText_android_inputType, EditorInfo.TYPE_CLASS_TEXT);
             tvTitle.setVisibility(TextUtils.isEmpty(title)?  GONE : VISIBLE);
             tvTitle.setText(title);
             editText.setImeOptions(imeOptions);
             editText.setInputType(inputType);
+            editText.setHint(hint);
             typedArray.recycle();
         }
     }

+ 5 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/viewutils/CDimensUtils.java

@@ -24,6 +24,11 @@ public class CDimensUtils {
         return (int) (dp * scale + 0.5f);
     }
 
+    public static int spToPx(float sp, Context context) {
+        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
+        return (int) (sp * fontScale + 0.5f);
+    }
+
     public static DisplayMetrics getDisplayMetrics(Context context){
         return context.getResources().getDisplayMetrics();
     }

+ 4 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/CToolBar.java

@@ -15,6 +15,7 @@ import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.widget.FrameLayout;
 
@@ -26,6 +27,7 @@ import androidx.appcompat.widget.AppCompatImageView;
 import androidx.appcompat.widget.AppCompatTextView;
 
 import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 
 /**
@@ -83,6 +85,8 @@ public class CToolBar extends FrameLayout {
         TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CToolBar);
         if (typedArray != null) {
             String toolBarTitle = typedArray.getString(R.styleable.CToolBar_android_title);
+            float textSize = typedArray.getDimensionPixelSize(R.styleable.CToolBar_android_textSize, CDimensUtils.spToPx(22, getContext()));
+            tvToolBarTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
             if (!TextUtils.isEmpty(toolBarTitle)) {
                 tvToolBarTitle.setText(toolBarTitle);
             }

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/font/CExternFontSpinnerAdapter.java

@@ -68,7 +68,7 @@ public class CExternFontSpinnerAdapter extends BaseAdapter {
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         LayoutInflater inflater = LayoutInflater.from(mContext);
-        convertView = inflater.inflate(R.layout.tools_font_list_item, null);
+        convertView = inflater.inflate(R.layout.tools_spinner_list_item, null);
         if (convertView != null){
             AppCompatTextView textView = convertView.findViewById(R.id.tv_menu_title);
             if (position < list.size()) {

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/font/CFontSpinnerAdapter.java

@@ -54,7 +54,7 @@ public class CFontSpinnerAdapter extends BaseAdapter {
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         LayoutInflater inflater = LayoutInflater.from(mContext);
-        convertView = inflater.inflate(R.layout.tools_font_list_item, null);
+        convertView = inflater.inflate(R.layout.tools_spinner_list_item, null);
         if (convertView != null){
             AppCompatTextView textView = convertView.findViewById(R.id.tv_menu_title);
             CPDFTextAttribute.FontNameHelper.FontType fontType = (CPDFTextAttribute.FontNameHelper.FontType) getItem(position);

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfview/CPreviewMode.java

@@ -22,7 +22,7 @@ public enum CPreviewMode {
             case Form:
                 return R.string.tools_form_mode;
             case Signature:
-                return R.string.tools_signatures;
+                return R.string.tools_digital_signature;
             default:
                 return R.string.tools_pdf_viewer_mode;
         }

+ 10 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/CSignatureToolBar.java

@@ -12,6 +12,7 @@ package com.compdfkit.tools.signature;
 
 import android.content.Context;
 import android.util.AttributeSet;
+import android.view.View;
 import android.widget.FrameLayout;
 
 import androidx.annotation.NonNull;
@@ -27,6 +28,8 @@ public class CSignatureToolBar extends FrameLayout {
 
     ConstraintLayout clAddSignatures;
 
+    ConstraintLayout clVerifySign;
+
     private CPDFViewCtrl pdfView;
 
     public void initWithPDFView(CPDFViewCtrl pdfView) {
@@ -49,6 +52,7 @@ public class CSignatureToolBar extends FrameLayout {
     private void initView(Context context) {
         inflate(context, R.layout.tools_signature_tool_bar, this);
         clAddSignatures = findViewById(R.id.cl_add_digital_signature);
+        clVerifySign = findViewById(R.id.cl_verify_digital_signature);
         clAddSignatures.setOnClickListener(v -> {
             if (pdfView != null) {
                 clAddSignatures.setSelected(!clAddSignatures.isSelected());
@@ -62,4 +66,10 @@ public class CSignatureToolBar extends FrameLayout {
             }
         });
     }
+
+    public View getVerifySignButton() {
+        return clVerifySign;
+    }
+
+
 }

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

@@ -0,0 +1,175 @@
+/**
+ * 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.signature;
+
+
+import android.text.TextUtils;
+
+import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.core.document.signature.CPDFCertInfo;
+import com.compdfkit.core.document.signature.CPDFOwnerInfo;
+import com.compdfkit.core.document.signature.CPDFSignature;
+import com.compdfkit.core.document.signature.CPDFSigner;
+import com.compdfkit.core.document.signature.CPDFX509;
+import com.compdfkit.tools.common.utils.CLog;
+import com.compdfkit.tools.common.utils.CUriUtil;
+import com.compdfkit.tools.signature.pdfproperties.pdfsign.CDigitalSignStyleData;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CertificateDigitalDatas {
+
+    public static boolean generatePKCS12Cert(CPDFOwnerInfo ownerInfo, String password, String saveDir, String fileName) {
+        CPDFSignature.CertUsage flag = CPDFSignature.CertUsage.PDFDigSig;
+        String pfxPath = new File(saveDir, fileName).getAbsolutePath();
+        return CPDFSignature.generatePKCS12Cert(ownerInfo, password, pfxPath, flag, true);
+    }
+
+    public static CPDFCertInfo getCertInfo(String certFilePath, String password) {
+        if (CPDFSignature.checkPKCS12Password(certFilePath, password)) {
+            CPDFX509 x509 = CPDFSignature.getX509ByPKCS12Cert(certFilePath, password);
+            return x509.getCertInfo();
+        } else {
+            return null;
+        }
+    }
+
+    public static List<CPDFSignature> getDigitalSignList(CPDFDocument document) {
+        List<CPDFSignature> list = new ArrayList<>();
+        for (int i = 0; i < document.getSignatureCount(); i++) {
+            CPDFSignature signature = document.getPdfSignature(i);
+            if (signature == null) {
+                continue;
+            }
+            CPDFSigner[] signers = signature.getSignerArr();
+            if (signers != null && signers.length > 0) {
+                list.add(signature);
+            }
+        }
+        return list;
+    }
+
+    public static boolean signDocument(CPDFDocument document,
+                                       CPDFSignatureWidget signatureWidget,
+                                       CDigitalSignStyleData styleData,
+                                       String certPath,
+                                       String password,
+                                       String savePath
+    ) {
+        return document.writeSignatureToPath(signatureWidget,
+                document.getAbsolutePath(),
+                savePath,
+                certPath,
+                password,
+                styleData.getPosition(),
+                styleData.getReason(),
+                CPDFDocument.PDFDocMdpP.PDFDocMdpPForbidAllModify
+        );
+    }
+
+    public static boolean verifySignIsValid(CPDFSignature signature, CPDFDocument document) {
+        CPDFSigner[] signers = signature.getSignerArr();
+        if (!TextUtils.isEmpty(document.getAbsolutePath())) {
+            return signature.veryfyDocument(document, document.getAbsolutePath());
+        } else {
+            return signature.veryfyByFd(signers[0], CUriUtil.getUriFd(document.getContext(), document.getUri()));
+        }
+    }
+
+    public static int verifyDocumentSignStatus(CPDFDocument document) {
+        return 0;
+    }
+
+    public static void readData(CPDFDocument currentDocument) {
+        StringBuilder data = new StringBuilder();
+        data.append("Signature number = " + currentDocument.getSignatureCount() + "\n\n");
+        for (int i = 0; i < currentDocument.getSignatureCount(); i++) {
+            data.append("Signature " + i + ":\n");
+            CPDFSignature signature = currentDocument.getPdfSignature(i);
+            if (signature == null) continue;
+            data.append("reason=" + signature.getReason() + "\ndate=" + signature.getDate() + "\nname=" + signature.getName()
+                    + "\nbounds=" + signature.getBounds().toString() + "\nfilter=" + signature.getFilter() + "\nsubfilter=" + signature.getSubFilter() +
+                    "\nlocate=" + signature.getLocation() + "\npermission=" + signature.getPermissionType() +
+                    "\npageIndex=" + signature.getPageIndex(currentDocument) + " \n");
+
+            CPDFSigner[] signerArr = signature.getSignerArr();
+            if (signerArr != null && signerArr.length > 0) {
+                CPDFSigner signer = signerArr[0];
+                CPDFX509 cert = signer.getCert();
+                CPDFCertInfo info = cert.getCertInfo();
+                data.append("begin date=" + info.getValidDateBegin() + " \nend date=" + info.getValidDateEnd() + " \npublickey=" + info.getPublicKey()
+                        + " \nsubjectname=" + info.getSubject() + " \nversion=" + info.getVersion() + " \nSignature Algrithm=" + info.getSignatureAlgOid()
+                        + " \nissuer=" + info.getIssuer().toString()
+                );
+
+                String[] ocspUrl = info.getOcspURL();
+                if (ocspUrl != null) {
+                    data.append("\nOCSP=");
+                    for (int j = 0; j < ocspUrl.length; j++) {
+                        data.append("\n" + ocspUrl[j]);
+                    }
+                }
+                data.append("\n");
+                String[] crl = info.getExtInfo().getCrlDistribute();
+                if (crl != null) {
+                    data.append("\nCRL:");
+                    for (int j = 0; j < crl.length; j++) {
+                        data.append("\n" + crl[j]);
+                    }
+                }
+                data.append("\n");
+                String[] policies = info.getExtInfo().getCertificatePolicies();
+                if (policies != null) {
+                    data.append("\nPOLICIES:");
+                    for (int j = 0; j < policies.length; j++) {
+                        data.append("\n" + policies[j]);
+                    }
+                }
+                data.append("\n\n");
+
+                int certchain = cert.verifyGetChain(signature, "/storage/emulated/0/certificate.pfx");
+                data.append("verifyGetChain=" + certchain);
+                data.append("\n");
+                CPDFX509[] trust = cert.getChanin();
+                data.append("trust chain:");
+                if (trust == null) {
+                    data.append(0);
+                } else {
+                    data.append(trust.length);
+                }
+
+
+                String documentPath = currentDocument.getAbsolutePath();
+                if (!TextUtils.isEmpty(documentPath)) {
+                    data.append("\n\n veryfy=" + signature.veryfyByPath(signer, documentPath));
+                    data.append("\n veryfy document=" + signature.veryfyDocument(currentDocument, documentPath));
+                }
+                data.append("\n has been modified:" + signature.haveDiffInfo());
+
+            }
+            data.append("\n===============================\n");
+        }
+    }
+
+
+    public static boolean removeDigitalSign(CPDFDocument document, CPDFSignature signature) {
+        try {
+            boolean result = signature.removeSignature(document, true);
+            document.save();
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+}

+ 34 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/bean/CPDFSignatureItemData.java

@@ -0,0 +1,34 @@
+package com.compdfkit.tools.signature.bean;
+
+
+import com.compdfkit.core.document.signature.CPDFSignature;
+
+public class CPDFSignatureItemData {
+
+    public CPDFSignatureItemData(){}
+
+    public CPDFSignatureItemData(CPDFSignature signature, boolean isValid){
+        this.signature = signature;
+        this.isValid = isValid;
+    }
+
+    private CPDFSignature signature;
+
+    private boolean isValid;
+
+    public CPDFSignature getSignature() {
+        return signature;
+    }
+
+    public void setSignature(CPDFSignature signature) {
+        this.signature = signature;
+    }
+
+    public boolean isValid() {
+        return isValid;
+    }
+
+    public void setValid(boolean valid) {
+        isValid = valid;
+    }
+}

+ 0 - 66
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/create/CertificateDigitalDatas.java

@@ -1,66 +0,0 @@
-/**
- * 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.signature.dialog.create;
-
-
-import com.compdfkit.core.document.signature.CPDFCertInfo;
-import com.compdfkit.core.document.signature.CPDFOwnerInfo;
-import com.compdfkit.core.document.signature.CPDFSignature;
-import com.compdfkit.core.document.signature.CPDFX509;
-
-import java.io.File;
-
-public class CertificateDigitalDatas {
-
-
-
-    public static boolean generatePKCS12Cert(CPDFOwnerInfo ownerInfo, String password, String saveDir, String fileName){
-        CPDFSignature.CertUsage flag = CPDFSignature.CertUsage.PDFDigSig;
-        String pfxPath = new File(saveDir , fileName).getAbsolutePath();
-        return CPDFSignature.generatePKCS12Cert(ownerInfo, password, pfxPath, flag, true);
-    }
-
-    private void getX509ByPKCS12CertTest() {
-        String path = "/storage/emulated/0/certificate.pfx";
-        CPDFX509 x509 = CPDFSignature.getX509ByPKCS12Cert(path, "1234");
-        CPDFCertInfo info = x509.getCertInfo();
-    }
-
-    protected void signaturetest() {
-//        StringBuilder data = new StringBuilder();
-//        data.append("Signature number = " + currentDocument.getSignatureCount()+"\n\n");
-//        for (int i = 0; i < currentDocument.getSignatureCount(); i++) {
-//            data.append("Signature "+i +":\n");
-//
-//            CPDFSignature signature = currentDocument.getPdfSignature(i);
-//            if (signature == null) continue;
-//            data.append("reason="+ signature.getReason()+ ";  date="+signature.getDate()+ "; name="+signature.getName()
-//                    + "; bounds="+signature.getBounds().toString()+ "; filter="+signature.getFilter()+
-//                    "; locate=" + signature.getLocation() +
-//                    "; pageIndex=" + signature.getPageIndex(currentDocument) + " \n");
-//
-//            CPDFSigner[] signerArr = signature.getSignerArr();
-//            if (signerArr != null && signerArr.length > 0) {
-//                CPDFSigner signer = signerArr[0];
-//                CPDFX509 cert = signer.getCert();
-//                CPDFCertInfo info = cert.getCertInfo();
-//                data.append("begin date="+info.getValidDate_begin() + " \nend date="+info.getValidDate_end() + " \npublickey="+info.getPublic_key()
-//                        + " \nsubjectname="+ info.getSubjectName()+ " \nversion="+info.getVer());
-//
-//                String documentPath = "/storage/emulated/0/Download/jjjj.pdf";
-//                data.append("\n veryfy=" + signature.veryfyByPath(signer,documentPath));
-//                data.append("\n veryfy document=" + signature.veryfyDocument(currentDocument, documentPath));
-//                data.append("\n===============================\n");
-//            }
-//        }
-//        signInfo.setText(data);
-    }
-
-}

+ 13 - 4
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/CImportCertificateDigitalDialog.java

@@ -7,7 +7,7 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.signature.dialog;
+package com.compdfkit.tools.signature.importcert.create;
 
 
 import static com.compdfkit.tools.common.utils.CFileUtils.CERTIFICATE_DIGITAL_TYPE;
@@ -33,7 +33,7 @@ import androidx.appcompat.widget.AppCompatImageView;
 import androidx.appcompat.widget.AppCompatTextView;
 import androidx.constraintlayout.widget.ConstraintLayout;
 
-import com.compdfkit.core.utils.TFileUtils;
+import com.compdfkit.core.document.signature.CPDFSignature;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.CFileUtils;
 import com.compdfkit.tools.common.utils.CUriUtil;
@@ -43,6 +43,8 @@ import com.compdfkit.tools.signature.interfaces.COnSelectCertFileListener;
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
 import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
 
+import java.io.File;
+
 public class CImportCertificateDigitalDialog extends BottomSheetDialogFragment implements View.OnClickListener {
 
     public static final String EXTRA_CERTIFICATE_DIGITAL_URI = "extra_certificate_digital_uri";
@@ -70,6 +72,7 @@ public class CImportCertificateDigitalDialog extends BottomSheetDialogFragment i
     private ActivityResultLauncher<Intent> selectCertificateLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
         if (result.getData() != null && result.getData().getData() != null) {
             Uri certificateUri = result.getData().getData();
+            CFileUtils.takeUriPermission(getContext(), certificateUri);
             setCertificateInfo(certificateUri);
             if (getArguments() != null) {
                 getArguments().putParcelable(EXTRA_CERTIFICATE_DIGITAL_URI, certificateUri);
@@ -97,6 +100,7 @@ public class CImportCertificateDigitalDialog extends BottomSheetDialogFragment i
         super.onStart();
         BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
         CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
+        behavior.setDraggable(false);
     }
 
     @Nullable
@@ -132,7 +136,7 @@ public class CImportCertificateDigitalDialog extends BottomSheetDialogFragment i
         if (uri != null) {
             setCertificateInfo(uri);
         }
-        tvTitle.setText(R.string.tools_new_certificate_digital_id);
+        tvTitle.setText(R.string.tools_create_a_self_signed_digital_id);
         etPassword.addTextChangedListener(new TextWatcher() {
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -183,8 +187,13 @@ public class CImportCertificateDigitalDialog extends BottomSheetDialogFragment i
             return;
         }
         String password = etPassword.getText().toString();
+        String dir = new File(getContext().getCacheDir(), CFileUtils.CACHE_FOLDER + File.separator + "certFile").getAbsolutePath();
+        String certPath = CFileUtils.copyFileToInternalDirectory(getContext(), certificateUri, dir, CUriUtil.getUriFileName(getContext(), certificateUri));
+        if (!CPDFSignature.checkPKCS12Password(certPath, password)){
+            tvPasswordError.setVisibility(View.VISIBLE);
+            return;
+        }
         if (selectCertFileListener != null && certificateUri != null) {
-            String certPath = TFileUtils.toPath(getContext(), certificateUri);
             selectCertFileListener.certificateFile(certPath, password);
         }
     }

+ 17 - 4
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/CPDFSelectDigitalSignatureDialog.java

@@ -7,14 +7,16 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.signature.dialog;
+package com.compdfkit.tools.signature.importcert.create;
 
 
 import static com.compdfkit.tools.common.utils.CFileUtils.CERTIFICATE_DIGITAL_TYPE;
 
+import android.Manifest;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -32,8 +34,7 @@ import androidx.fragment.app.Fragment;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.annotation.pdfproperties.pdfsignature.CAddSignatureActivity;
 import com.compdfkit.tools.common.utils.CFileUtils;
-import com.compdfkit.tools.common.utils.CLog;
-import com.compdfkit.tools.signature.dialog.create.CreateCertificateDigitalDialog;
+import com.compdfkit.tools.common.utils.CPermissionUtil;
 import com.compdfkit.tools.signature.interfaces.COnSelectCertFileListener;
 
 public class CPDFSelectDigitalSignatureDialog extends DialogFragment implements View.OnClickListener {
@@ -46,6 +47,10 @@ public class CPDFSelectDigitalSignatureDialog extends DialogFragment implements
 
     private COnCertDigitalSignListener certDigitalSignListener;
 
+    private ActivityResultLauncher<String> requestStorageLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> {
+
+    });
+
     private ActivityResultLauncher<Intent> addSignatureLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
         Fragment fragment = getChildFragmentManager().findFragmentByTag("certDialog");
         if (fragment != null) {
@@ -77,7 +82,7 @@ public class CPDFSelectDigitalSignatureDialog extends DialogFragment implements
     private void openSignActivity(){
         Intent intent = new Intent(getContext(), CAddSignatureActivity.class);
         intent.putExtra(CAddSignatureActivity.EXTRA_SHOW_NONE_TYPE, true);
-        intent.putExtra(CAddSignatureActivity.EXTRA_TITLE, getString(R.string.tools_digital_signatures));
+        intent.putExtra(CAddSignatureActivity.EXTRA_TITLE, getString(R.string.tools_customize_the_signature_appearance));
         intent.putExtra(CAddSignatureActivity.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
         addSignatureLauncher.launch(intent);
     }
@@ -124,6 +129,14 @@ public class CPDFSelectDigitalSignatureDialog extends DialogFragment implements
         if (v.getId() == R.id.btn_cancel) {
             dismiss();
         } else if (v.getId() == R.id.btn_confirm) {
+            if (!CPermissionUtil.hasStoragePermissions(getContext())){
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                    CPermissionUtil.openAppSettings(getContext());
+                }else {
+                    requestStorageLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+                }
+                return;
+            }
             if (rgType.getCheckedRadioButtonId() == R.id.rb_import_digital_sign){
                 selectCertificateLauncher.launch(CFileUtils.getIntent(CERTIFICATE_DIGITAL_TYPE));
             }else {

+ 94 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/importcert/create/CountryReginSpinnerAdapter.java

@@ -0,0 +1,94 @@
+/**
+ * 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.signature.importcert.create;
+
+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.annotation.CPDFTextAttribute;
+import com.compdfkit.tools.R;
+
+import java.util.List;
+import java.util.Locale;
+
+
+public class CountryReginSpinnerAdapter extends BaseAdapter {
+
+    public List<Locale> list;
+
+    private Context mContext;
+
+    private Locale selectLocal;
+
+    public CountryReginSpinnerAdapter(@NonNull Context context, List<Locale> locales) {
+        selectLocal = new Locale("", Locale.getDefault().getCountry());
+        this.list = locales;
+        mContext = context;
+    }
+
+    public void setSelectLocal(Locale selectLocal) {
+        this.selectLocal = selectLocal;
+    }
+
+    public int getSelectPosition(){
+        if (selectLocal != null){
+            for (int i = 0; i < list.size(); i++) {
+                Locale item = list.get(i);
+                if (selectLocal.equals(item)) {
+                    return i;
+                }
+            }
+        }
+        return 0;
+    }
+
+    public String getSelectCountryRegin(){
+        if (selectLocal != null){
+            return selectLocal.getCountry();
+        }
+        return Locale.getDefault().getCountry();
+    }
+
+    @Override
+    public int getCount() {
+        return list.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return list.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        convertView = inflater.inflate(R.layout.tools_spinner_list_item, null);
+        if (convertView != null){
+            AppCompatTextView textView = convertView.findViewById(R.id.tv_menu_title);
+            Locale locale = list.get(position);
+            textView.setText(locale.getCountry() +" - " + locale.getDisplayName(Locale.US));
+            textView.setTypeface(selectLocal != null && selectLocal == locale ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
+            convertView.setBackgroundResource(locale == selectLocal ? R.drawable.tools_annotation_font_bold_bg : 0);
+        }
+        return convertView;
+    }
+}

+ 93 - 43
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/create/CreateCertificateDigitalDialog.java

@@ -7,7 +7,7 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.signature.dialog.create;
+package com.compdfkit.tools.signature.importcert.create;
 
 import android.app.Dialog;
 import android.content.Intent;
@@ -18,7 +18,9 @@ import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.AdapterView;
 import android.widget.LinearLayout;
+import android.widget.ScrollView;
 import android.widget.Switch;
 import android.widget.ViewSwitcher;
 
@@ -30,22 +32,24 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.widget.AppCompatButton;
 import androidx.appcompat.widget.AppCompatImageView;
+import androidx.appcompat.widget.AppCompatSpinner;
 import androidx.appcompat.widget.AppCompatTextView;
 
-import com.compdfkit.core.document.signature.CPDFCertInfo;
 import com.compdfkit.core.document.signature.CPDFOwnerInfo;
-import com.compdfkit.core.document.signature.CPDFSignature;
-import com.compdfkit.core.document.signature.CPDFX509;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.CFileUtils;
-import com.compdfkit.tools.common.utils.CLog;
 import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
+import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
 import com.compdfkit.tools.common.utils.view.CEditText;
+import com.compdfkit.tools.signature.CertificateDigitalDatas;
 import com.compdfkit.tools.signature.interfaces.COnSelectCertFileListener;
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
 import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
 import java.util.UUID;
 
 
@@ -57,15 +61,15 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
 
     private CEditText etName;
 
-    private CEditText etGrantor;
+    private CEditText etOrganizationUnit;
 
-    private CEditText etSectoral;
+    private CEditText etOrganizationName;
 
-    private CEditText etEmail;
+    private CEditText etEmailAddress;
 
-    private CEditText etCountryArea;
+    private AppCompatSpinner spinnerCountry;
 
-    private Switch swContinuous;
+    private Switch swSaveToFile;
 
     private AppCompatButton btnOk;
 
@@ -87,14 +91,22 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
 
     private String customSavePath;
 
+    private AppCompatTextView tvPasswordError;
+
     private COnSelectCertFileListener selectCertFileListener;
 
+    private ScrollView scrollView;
+
+    private CountryReginSpinnerAdapter countryReginSpinnerAdapter;
+
+    private String fileName = "";
+
     private ActivityResultLauncher<Intent> selectDirLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
         if (result.getData() != null && result.getData().getData() != null) {
             Uri uri = result.getData().getData();
             CFileUtils.takeUriPermission(getContext(), result.getData().getData());
             customSavePath = Environment.getExternalStorageDirectory().getAbsolutePath()  + File.separator + uri.getPath().replace("/tree/primary:", "");
-            tvSaveAddress.setText(getSaveAddress());
+            tvSaveAddress.setText(getSaveAddress() + File.separator + fileName);
         }
     });
 
@@ -139,6 +151,7 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
         super.onStart();
         BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
         CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
+        behavior.setDraggable(false);
     }
 
     @Nullable
@@ -148,11 +161,12 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
         tvTitle = view.findViewById(R.id.tv_tool_bar_title);
         ivClose = view.findViewById(R.id.iv_tool_bar_close);
         etName = view.findViewById(R.id.et_name);
-        etGrantor = view.findViewById(R.id.et_grantor);
-        etSectoral = view.findViewById(R.id.et_sectoral);
-        etEmail = view.findViewById(R.id.et_email);
-        etCountryArea = view.findViewById(R.id.et_country_area);
-        swContinuous = view.findViewById(R.id.sw_continuous);
+        etOrganizationUnit = view.findViewById(R.id.et_organization_unit);
+        etOrganizationName = view.findViewById(R.id.et_organization_name);
+        scrollView = view.findViewById(R.id.scroll_view);
+        etEmailAddress = view.findViewById(R.id.et_email_address);
+        spinnerCountry = view.findViewById(R.id.spinner_country_regin);
+        swSaveToFile = view.findViewById(R.id.sw_save_to_file);
         btnOk = view.findViewById(R.id.btn_ok);
         switcher = view.findViewById(R.id.view_switcher);
         tvSaveAddress = view.findViewById(R.id.tv_save_address);
@@ -160,6 +174,7 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
         etPassword = view.findViewById(R.id.et_password);
         etConfirmPassword = view.findViewById(R.id.et_confirm_password);
         btnConfirmCreate = view.findViewById(R.id.btn_save);
+        tvPasswordError = view.findViewById(R.id.tv_password_error);
         btnOk.setOnClickListener(this);
         tvSaveAddress.setOnClickListener(this);
         btnConfirmCreate.setOnClickListener(this);
@@ -170,34 +185,32 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        tvTitle.setText(R.string.tools_new_certificate_digital_id);
+        String uuid = UUID.randomUUID().toString();
+        String fileName = "new_cert_"+  uuid.substring(uuid.length()-4, uuid.length())+".p12";
+        tvTitle.setText(R.string.tools_create_a_self_signed_digital_id);
+        initCountryReginData();
         etName.addTextChangedListener((s, start, before, count) -> {
             enableConfirmButton();
         });
-        etGrantor.addTextChangedListener((s, start, before, count) -> {
-            enableConfirmButton();
-        });
-        etEmail.addTextChangedListener((s, start, before, count) -> {
+        etOrganizationUnit.addTextChangedListener((s, start, before, count) -> {
             enableConfirmButton();
         });
-        etSectoral.addTextChangedListener((s, start, before, count) -> {
+        etEmailAddress.addTextChangedListener((s, start, before, count) -> {
             enableConfirmButton();
         });
-        etCountryArea.addTextChangedListener((s, start, before, count) -> {
+        etOrganizationName.addTextChangedListener((s, start, before, count) -> {
             enableConfirmButton();
         });
-
-        swContinuous.setOnCheckedChangeListener((buttonView, isChecked) -> {
+        swSaveToFile.setOnCheckedChangeListener((buttonView, isChecked) -> {
             llSaveAddress.setVisibility(isChecked ? View.VISIBLE : View.GONE);
-            tvSaveAddress.setText(getSaveAddress());
+            tvSaveAddress.setText(getSaveAddress() + File.separator + fileName);
+
         });
-        tvSaveAddress.setText(getSaveAddress());
+        tvSaveAddress.setText(getSaveAddress() + File.separator + fileName);
         etName.setText("刘小龙");
-        etGrantor.setText("ComPDFKit");
-        etSectoral.setText("CR10");
-        etEmail.setText("xiaolong.liu.work@gmail.com");
-        etCountryArea.setText("China");
-
+        etOrganizationUnit.setText("ComPDFKit");
+        etOrganizationName.setText("CR10");
+        etEmailAddress.setText("xiaolong.liu.work@gmail.com");
 
     }
 
@@ -213,20 +226,22 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
             selectDirLauncher.launch(CFileUtils.selectSystemDir(true));
         } else if (v.getId() == R.id.btn_save){
             String name = etName.getText();
-            String grantor = etGrantor.getText();
-            String sectoral = etSectoral.getText();
-            String email = etEmail.getText();
-            String countryArea = etCountryArea.getText();
+            String grantor = etOrganizationUnit.getText();
+            String sectoral = etOrganizationName.getText();
+            String email = etEmailAddress.getText();
+            String countryArea = countryReginSpinnerAdapter.getSelectCountryRegin();
             String password = etPassword.getText();
             String verifyPassword = etConfirmPassword.getText();
 
             if (TextUtils.isEmpty(password) || TextUtils.isEmpty(verifyPassword) || !password.equals(verifyPassword)){
                 etPassword.setError(true);
                 etConfirmPassword.setError(true);
+                tvPasswordError.setVisibility(View.VISIBLE);
                 return;
             }
             etPassword.setError(false);
             etConfirmPassword.setError(false);
+            tvPasswordError.setVisibility(View.GONE);
 
             CPDFOwnerInfo ownerInfo = new CPDFOwnerInfo();
             ownerInfo.setCommonName(name);
@@ -234,10 +249,8 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
             ownerInfo.setOrgnize(sectoral);
             ownerInfo.setEmail(email);
             ownerInfo.setCountry(countryArea);
-            String uuid = UUID.randomUUID().toString();
 
             String saveDir = getSaveAddress();
-            String fileName = "new_cert_"+  uuid.substring(uuid.length()-4, uuid.length())+".p12";
             boolean success = CertificateDigitalDatas.generatePKCS12Cert(ownerInfo, etPassword.getText(),
                     saveDir, fileName);
             if (success){
@@ -248,13 +261,38 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
         }
     }
 
+    private void initCountryReginData(){
+        CThreadPoolUtils.getInstance().execute(()->{
+            List<Locale> datas = getLocals();
+            if (getActivity() != null) {
+                getActivity().runOnUiThread(()->{
+                    countryReginSpinnerAdapter = new CountryReginSpinnerAdapter(getContext(), datas);
+                    spinnerCountry.setAdapter(countryReginSpinnerAdapter);
+                    spinnerCountry.setSelection(countryReginSpinnerAdapter.getSelectPosition());
+                });
+            }
+        });
+        spinnerCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                if (countryReginSpinnerAdapter != null) {
+                    countryReginSpinnerAdapter.setSelectLocal(countryReginSpinnerAdapter.list.get(position));
+                }
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+    }
 
     private void enableConfirmButton() {
         String name = etName.getText();
-        String grantor = etGrantor.getText();
-        String sectoral = etSectoral.getText();
-        String email = etEmail.getText();
-        String countryArea = etCountryArea.getText();
+        String grantor = etOrganizationUnit.getText();
+        String sectoral = etOrganizationName.getText();
+        String email = etEmailAddress.getText();
+        String countryArea = "CN";
         boolean enable = !TextUtils.isEmpty(name) && !TextUtils.isEmpty(grantor)
                 && !TextUtils.isEmpty(sectoral) && !TextUtils.isEmpty(email) && !TextUtils.isEmpty(countryArea);
         btnOk.setEnabled(enable);
@@ -264,12 +302,15 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
         switcher.setInAnimation(getContext(), R.anim.tools_slide_in_right);
         switcher.setOutAnimation(getContext(), R.anim.tools_slide_out_left);
         switcher.showNext();
+        tvTitle.setText(R.string.tools_save_a_self_signed_digital_id);
     }
 
     private void showInfoStatusView() {
         switcher.setInAnimation(getContext(), R.anim.tools_slide_in_left);
         switcher.setOutAnimation(getContext(), R.anim.tools_slide_out_right);
         switcher.showPrevious();
+        tvTitle.setText(R.string.tools_create_a_self_signed_digital_id);
+
     }
 
     private String getSaveAddress() {
@@ -277,7 +318,7 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
             return customSavePath;
         }
         File file;
-        if (swContinuous.isChecked()) {
+        if (swSaveToFile.isChecked()) {
             file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), CFileUtils.ROOT_FOLDER);
         } else {
             file = new File(getContext().getCacheDir(), CFileUtils.CACHE_FOLDER);
@@ -285,6 +326,15 @@ public class CreateCertificateDigitalDialog extends BottomSheetDialogFragment im
         return file.getAbsolutePath();
     }
 
+    private List<Locale> getLocals(){
+        String[] isos = Locale.getISOCountries();
+        List<Locale> list = new ArrayList<>();
+        for (String iso : isos) {
+            list.add(new Locale("", iso));
+        }
+        return list;
+    }
+
     public void setSelectCertFileListener(COnSelectCertFileListener selectCertFileListener) {
         this.selectCertFileListener = selectCertFileListener;
     }

+ 81 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertDetailsDialog.java

@@ -0,0 +1,81 @@
+/**
+ * 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.signature.info;
+
+
+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.appcompat.widget.AppCompatImageView;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+public class CertDetailsDialog extends BottomSheetDialogFragment implements View.OnClickListener {
+
+    private AppCompatTextView tvTitle;
+
+    private AppCompatImageView ivClose;
+
+
+    public static CertDetailsDialog newInstance() {
+        Bundle args = new Bundle();
+        CertDetailsDialog fragment = new CertDetailsDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
+        CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.tools_sign_certificate_digital_sign_info_fragment, container, false);
+        tvTitle = view.findViewById(R.id.tv_tool_bar_title);
+        ivClose = view.findViewById(R.id.iv_tool_bar_close);
+
+        ivClose.setOnClickListener(this);
+
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        tvTitle.setText(R.string.tools_create_a_self_signed_digital_id);
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.iv_tool_bar_close) {
+            dismiss();
+        }
+    }
+
+
+}

+ 90 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertDigitalSignAttributesDialog.java

@@ -0,0 +1,90 @@
+/**
+ * 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.signature.info;
+
+
+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.appcompat.widget.AppCompatTextView;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
+import com.compdfkit.tools.common.views.CToolBar;
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+public class CertDigitalSignAttributesDialog extends BottomSheetDialogFragment {
+
+    private CToolBar toolBar;
+
+    private AppCompatTextView tvVersion;
+
+    private AppCompatTextView tvSignOrithm;
+
+    private AppCompatTextView tvThematic;
+
+    private AppCompatTextView tvProductKey;
+
+    private AppCompatTextView tvValidityPeriod;
+
+    private AppCompatTextView tvCertPolicy;
+
+    private AppCompatTextView tvCrlPoint;
+
+
+    public static CertDigitalSignAttributesDialog newInstance() {
+        Bundle args = new Bundle();
+        CertDigitalSignAttributesDialog fragment = new CertDigitalSignAttributesDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
+        CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.tools_sign_certificate_attributes_fragment, container, false);
+        toolBar = view.findViewById(R.id.tool_bar);
+        tvVersion = view.findViewById(R.id.tv_version_value);
+        tvSignOrithm = view.findViewById(R.id.tv_sign_orithm_value);
+        tvThematic = view.findViewById(R.id.tv_thematic_value);
+        tvProductKey = view.findViewById(R.id.tv_product_key_value);
+        tvValidityPeriod = view.findViewById(R.id.tv_validity_period_value);
+        tvCertPolicy = view.findViewById(R.id.tv_cert_policy_value);
+        tvCrlPoint = view.findViewById(R.id.tv_crl_distri_value);
+        toolBar.setBackBtnClickListener(v -> {
+            dismiss();
+        });
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+    }
+
+}

+ 128 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/CertDigitalSignInfoDialog.java

@@ -0,0 +1,128 @@
+/**
+ * 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.signature.info;
+
+
+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.appcompat.widget.AppCompatButton;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.core.document.signature.CPDFCertInfo;
+import com.compdfkit.core.document.signature.CPDFSignature;
+import com.compdfkit.core.document.signature.CPDFSigner;
+import com.compdfkit.core.document.signature.CPDFX509;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.CLog;
+import com.compdfkit.tools.common.utils.date.CDateUtil;
+import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
+import com.compdfkit.tools.signature.CertificateDigitalDatas;
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+public class CertDigitalSignInfoDialog extends BottomSheetDialogFragment implements View.OnClickListener {
+
+    private AppCompatTextView tvTitle;
+
+    private AppCompatImageView ivClose;
+
+    private AppCompatTextView tvFounder;
+
+    private AppCompatTextView tvDateOfSignature;
+
+    private AppCompatButton btnSignDetails;
+
+    private CPDFSignature cpdfSignature;
+
+    private AppCompatTextView tvSignStatement;
+
+    private CPDFDocument document;
+
+    public static CertDigitalSignInfoDialog newInstance() {
+        Bundle args = new Bundle();
+        CertDigitalSignInfoDialog fragment = new CertDigitalSignInfoDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    public void setDocument(CPDFDocument document){
+        this.document = document;
+    }
+
+    public void setPDFSignature(CPDFSignature signature){
+        this.cpdfSignature = signature;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle_TopCorners);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
+        CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.tools_sign_certificate_digital_sign_info_fragment, container, false);
+        tvTitle = view.findViewById(R.id.tv_tool_bar_title);
+        ivClose = view.findViewById(R.id.iv_tool_bar_close);
+        tvFounder = view.findViewById(R.id.tv_sign_founder);
+        btnSignDetails = view.findViewById(R.id.btn_cert_detail);
+        tvDateOfSignature = view.findViewById(R.id.tv_date_of_sign);
+        tvSignStatement = view.findViewById(R.id.tv_sign_statement_info);
+        ivClose.setOnClickListener(this);
+        btnSignDetails.setOnClickListener(this);
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        tvTitle.setText(R.string.tools_view_digital_signature);
+        if (cpdfSignature != null) {
+            CPDFSigner[] signers = cpdfSignature.getSignerArr();
+            if (signers != null && signers.length >0){
+                CPDFX509 cert = signers[0].getCert();
+                CPDFCertInfo certInfo = cert.getCertInfo();
+                String commonName = certInfo.getIssuer().getCommonName();
+                tvFounder.setText(commonName);
+            }
+            tvDateOfSignature.setText(CDateUtil.transformPDFDate(cpdfSignature.getDate()));
+            boolean signIsValid = CertificateDigitalDatas.verifySignIsValid(cpdfSignature, document);
+            if (signIsValid){
+                tvSignStatement.setText(R.string.tools_sign_is_valid_info);
+            }else {
+                tvSignStatement.setText(R.string.tools_sign_is_in_valid_info);
+            }
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.iv_tool_bar_close) {
+            dismiss();
+        } else if (v.getId() == R.id.btn_cert_detail){
+
+        }
+    }
+}

+ 148 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/signlist/CPDFCertDigitalSignListDialog.java

@@ -0,0 +1,148 @@
+package com.compdfkit.tools.signature.info.signlist;
+
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ProgressBar;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.core.document.signature.CPDFSignature;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.CLog;
+import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
+import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
+import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
+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.pdfview.CPDFViewCtrl;
+import com.compdfkit.tools.signature.CertificateDigitalDatas;
+import com.compdfkit.tools.signature.bean.CPDFSignatureItemData;
+import com.compdfkit.tools.signature.info.CertDigitalSignInfoDialog;
+import com.compdfkit.tools.signature.info.signlist.adapter.CertDigitalSignListAdapter;
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CPDFCertDigitalSignListDialog extends BottomSheetDialogFragment {
+
+    private RecyclerView recyclerView;
+
+    private CToolBar toolBar;
+
+    private ProgressBar progressBar;
+
+    private CPDFViewCtrl pdfView;
+
+    private CertDigitalSignListAdapter signListAdapter;
+
+
+    public void initWithPDFView(CPDFViewCtrl pdfView) {
+        this.pdfView = pdfView;
+    }
+
+    public static CPDFCertDigitalSignListDialog newInstance() {
+        Bundle args = new Bundle();
+        CPDFCertDigitalSignListDialog fragment = new CPDFCertDigitalSignListDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
+        CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
+        CDialogFragmentUtil.setDimAmount(getDialog(), CViewUtils.isLandScape(getContext()) ? 0.2F : 0F);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.tools_sign_cert_digital_sign_list_fragment, container, false);
+        recyclerView = view.findViewById(R.id.recycler_view);
+        toolBar = view.findViewById(R.id.tool_bar);
+        progressBar = view.findViewById(R.id.progress_bar);
+        toolBar.setBackBtnClickListener(v -> {
+            dismiss();
+        });
+        return view;
+    }
+
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        signListAdapter = new CertDigitalSignListAdapter(pdfView.getCPdfReaderView().getPDFDocument());
+        recyclerView.setAdapter(signListAdapter);
+        initSignatureDatas();
+        signListAdapter.setOnItemClickListener((adapter, view1, position) -> {
+            CPDFSignatureItemData signature = adapter.list.get(position);
+            CertDigitalSignInfoDialog infoDialog = CertDigitalSignInfoDialog.newInstance();
+            infoDialog.setPDFSignature(signature.getSignature());
+            infoDialog.setDocument(pdfView.getCPdfReaderView().getPDFDocument());
+            infoDialog.show(getChildFragmentManager(), "signInfoDialog");
+        });
+        signListAdapter.addOnItemChildClickListener(R.id.iv_delete, (adapter, view1, position) -> {
+            CPDFSignatureItemData signature = adapter.list.get(position);
+            CAlertDialog alertDialog = CAlertDialog.newInstance(getString(R.string.tools_warning), getString(R.string.tools_are_you_sure_to_delete));
+            alertDialog.setCancelClickListener(v -> {
+                alertDialog.dismiss();
+            });
+            alertDialog.setConfirmClickListener(v -> {
+                boolean result = CertificateDigitalDatas.removeDigitalSign(pdfView.getCPdfReaderView().getPDFDocument(), signature.getSignature());
+                if (result) {
+                    signListAdapter.remove(position);
+                    signListAdapter.notifyItemRemoved(position);
+                }
+                alertDialog.dismiss();
+            });
+            alertDialog.show(getChildFragmentManager(), "alertDialog");
+        });
+    }
+
+    private void initSignatureDatas() {
+        progressBar.setVisibility(View.VISIBLE);
+        SimpleBackgroundTask<List<CPDFSignatureItemData>> task = new SimpleBackgroundTask<List<CPDFSignatureItemData>>(getContext()) {
+
+            @Override
+            protected List<CPDFSignatureItemData> onRun() {
+                CPDFDocument document = pdfView.getCPdfReaderView().getPDFDocument();
+                List<CPDFSignatureItemData> itemDataList = new ArrayList<>();
+                List<CPDFSignature> list = CertificateDigitalDatas.getDigitalSignList(document);
+                for (CPDFSignature signature : list) {
+                    long time = System.currentTimeMillis();
+                    boolean isValid = CertificateDigitalDatas.verifySignIsValid(signature, document);
+                    CLog.e("耗时", System.currentTimeMillis()- time+"ms");
+                    itemDataList.add(new CPDFSignatureItemData(signature, isValid));
+                }
+                return itemDataList;
+            }
+
+            @Override
+            protected void onSuccess(List<CPDFSignatureItemData> result) {
+                signListAdapter.setList(result);
+                progressBar.setVisibility(View.GONE);
+                recyclerView.setVisibility(View.VISIBLE);
+            }
+        };
+        task.execute();
+
+    }
+}

+ 55 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/info/signlist/adapter/CertDigitalSignListAdapter.java

@@ -0,0 +1,55 @@
+package com.compdfkit.tools.signature.info.signlist.adapter;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.ViewGroup;
+
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.core.document.signature.CPDFCertInfo;
+import com.compdfkit.core.document.signature.CPDFSignature;
+import com.compdfkit.core.document.signature.CPDFSigner;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.CUriUtil;
+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 com.compdfkit.tools.signature.CertificateDigitalDatas;
+import com.compdfkit.tools.signature.bean.CPDFSignatureItemData;
+
+
+public class CertDigitalSignListAdapter extends CBaseQuickAdapter<CPDFSignatureItemData, CBaseQuickViewHolder> {
+
+    private CPDFDocument document;
+
+    public CertDigitalSignListAdapter(CPDFDocument document){
+        this.document = document;
+    }
+
+    @Override
+    protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
+        return new CBaseQuickViewHolder(R.layout.tools_sign_cert_digital_sign_list_item, parent);
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CPDFSignatureItemData item) {
+        Context context = holder.itemView.getContext();
+        CPDFSigner[] signers = item.getSignature().getSignerArr();
+        CPDFCertInfo certInfos = signers[0].getCert().getCertInfo();
+        if (item.isValid()) {
+            holder.setText(R.id.tv_sign_status, R.string.tools_authentication_successful);
+            holder.setImageResource(R.id.iv_icon, R.drawable.tools_ic_digital_sign_is_valid);
+            holder.setText(R.id.tv_sign_desc, context.getString(R.string.tools_valid_signature) + "," +
+                    context.getString(R.string.tools_signed_by) + " " + certInfos.getIssuer().getCommonName());
+        } else {
+            holder.setText(R.id.tv_sign_status, R.string.tools_authentication_failures);
+            holder.setImageResource(R.id.iv_icon, R.drawable.tools_ic_digital_sign_is_failures);
+            holder.setText(R.id.tv_sign_desc, context.getString(R.string.tools_valid_in_signature) + "," +
+                    context.getString(R.string.tools_signed_by) + " " + certInfos.getIssuer().getCommonName());
+        }
+        if (TextUtils.isEmpty(item.getSignature().getDate())) {
+            holder.setText(R.id.tv_sign_date, "");
+        } else {
+            holder.setText(R.id.tv_sign_date, context.getString(R.string.tools_signature_time) + " " + CDateUtil.transformPDFDate(item.getSignature().getDate()));
+        }
+    }
+}

+ 21 - 27
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignStyleData.java

@@ -10,6 +10,10 @@
 package com.compdfkit.tools.signature.pdfproperties.pdfsign;
 
 
+import androidx.annotation.DrawableRes;
+
+import com.compdfkit.core.document.CPDFSdk;
+import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.date.CDateUtil;
 
 public class CDigitalSignStyleData {
@@ -21,11 +25,11 @@ public class CDigitalSignStyleData {
 
     public static CDigitalSignStyleData defaultConfig(String signImagePath){
         CDigitalSignStyleData data = new CDigitalSignStyleData();
-        data.setShowLogo(true);
+        data.setLogoResId(R.drawable.tools_ic_compdfkit_logo);
         data.setSignImagePath(signImagePath);
         data.setDate(CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT));
-        data.setName("long");
-        data.setTab(true);
+        data.setName("");
+        data.setSdkVersion(CPDFSdk.getSDKVersion());
         data.setAlignment(CDigitalSignStylePreviewView.Alignment.left);
         return data;
     }
@@ -38,17 +42,15 @@ public class CDigitalSignStyleData {
 
     private String reason;
 
-    private boolean tab;
-
     private String name;
 
     private String date;
 
-    private boolean showLogo;
+    private @DrawableRes int logoResId;
 
     private String digtinguishableName;
 
-    private String comPDFKitVersion;
+    private String sdkVersion;
 
     public String getSignImagePath() {
         return signImagePath;
@@ -74,14 +76,6 @@ public class CDigitalSignStyleData {
         this.reason = reason;
     }
 
-    public boolean isTab() {
-        return tab;
-    }
-
-    public void setTab(boolean tab) {
-        this.tab = tab;
-    }
-
     public String getName() {
         return name;
     }
@@ -98,14 +92,6 @@ public class CDigitalSignStyleData {
         this.date = date;
     }
 
-    public boolean isShowLogo() {
-        return showLogo;
-    }
-
-    public void setShowLogo(boolean showLogo) {
-        this.showLogo = showLogo;
-    }
-
     public String getDigtinguishableName() {
         return digtinguishableName;
     }
@@ -114,12 +100,12 @@ public class CDigitalSignStyleData {
         this.digtinguishableName = digtinguishableName;
     }
 
-    public String getComPDFKitVersion() {
-        return comPDFKitVersion;
+    public String getSdkVersion() {
+        return sdkVersion;
     }
 
-    public void setComPDFKitVersion(String comPDFKitVersion) {
-        this.comPDFKitVersion = comPDFKitVersion;
+    public void setSdkVersion(String sdkVersion) {
+        this.sdkVersion = sdkVersion;
     }
 
 
@@ -130,4 +116,12 @@ public class CDigitalSignStyleData {
     public CDigitalSignStylePreviewView.Alignment getAlignment() {
         return alignment;
     }
+
+    public int getLogoResId() {
+        return logoResId;
+    }
+
+    public void setLogoResId(int logoResId) {
+        this.logoResId = logoResId;
+    }
 }

+ 69 - 26
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignStylePreviewView.java

@@ -17,7 +17,6 @@ import androidx.constraintlayout.widget.ConstraintLayout;
 import androidx.constraintlayout.widget.ConstraintSet;
 import androidx.transition.TransitionManager;
 
-import com.compdfkit.core.document.CPDFSdk;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.date.CDateUtil;
 import com.compdfkit.tools.common.utils.glide.GlideApp;
@@ -39,6 +38,22 @@ public class CDigitalSignStylePreviewView extends FrameLayout {
 
     private ConstraintSet constraintSet = new ConstraintSet();
 
+    private boolean showName = false;
+
+    private boolean showDate = false;
+
+    private boolean showLogo = false;
+
+    private boolean showDistinguishableName;
+
+    private boolean showSDKVersion;
+
+    private boolean showTab;
+
+    private boolean showPosition;
+
+    private boolean showReason;
+
     public CDigitalSignStylePreviewView(@NonNull Context context) {
         this(context, null);
     }
@@ -72,33 +87,46 @@ public class CDigitalSignStylePreviewView extends FrameLayout {
         update();
     }
 
-    public void showName(boolean show) {
-        previewData.setName(show ? "long" : "");
+    public void setShowName(boolean show) {
+        this.showName = show;
+        update();
+    }
+
+    public void setShowTab(boolean show) {
+        this.showTab = show;
         update();
     }
 
-    public void showTab(boolean show) {
-        previewData.setTab(show);
+    public void setShowSDKVersion(boolean show) {
+        this.showSDKVersion = show;
         update();
     }
 
-    public void showComPDFKitVersion(boolean show) {
-        previewData.setComPDFKitVersion(show ? CPDFSdk.getSDKVersion() : "");
+    public void setShowDate(boolean show) {
+        if (previewData != null) {
+            previewData.setDate(show ? CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT_1) : "");
+        }
+        this.showDate = show;
         update();
     }
 
-    public void showDate(boolean show) {
-        previewData.setDate(show ? CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT) : "");
+    public void setShowLogo(boolean show) {
+        this.showLogo = show;
         update();
     }
 
-    public void showLogo(boolean show) {
-        previewData.setShowLogo(show);
+    public void setShowDistinguishableName(boolean show) {
+        this.showDistinguishableName = show;
         update();
     }
 
-    public void showDistinguishableName(boolean show) {
-        previewData.setDigtinguishableName(show ? "Digtinguishable" : "");
+    public void setShowPosition(boolean show){
+        this.showPosition = show;
+        update();
+    }
+
+    public void setShowReason(boolean show){
+        this.showReason = show;
         update();
     }
 
@@ -112,6 +140,10 @@ public class CDigitalSignStylePreviewView extends FrameLayout {
         update();
     }
 
+    public CDigitalSignStyleData getPreviewData() {
+        return previewData;
+    }
+
     public void setAlignment(Alignment alignment){
         previewData.setAlignment(alignment);
         update();
@@ -138,36 +170,47 @@ public class CDigitalSignStylePreviewView extends FrameLayout {
                         .into(ivSignImage);
             }
             ivSignImage.setVisibility(TextUtils.isEmpty(previewData.getSignImagePath()) ? GONE : VISIBLE);
-            ivLogo.setVisibility(previewData.isShowLogo() ? VISIBLE : GONE);
+            ivLogo.setVisibility(showLogo ? VISIBLE : GONE);
             StringBuilder builder = new StringBuilder();
-            appendData(builder, previewData.isTab(), R.string.tools_field_name, previewData.getName());
-            if (!TextUtils.isEmpty(previewData.getDigtinguishableName())){
+            if (showName){
+                appendData(builder, showTab, R.string.tools_field_name, previewData.getName());
+            }
+            if (!TextUtils.isEmpty(builder) && showDistinguishableName && !TextUtils.isEmpty(previewData.getDigtinguishableName())){
                 builder.append("\n");
             }
-            appendData(builder, previewData.isTab(), R.string.tools_distinguishable_name, previewData.getDigtinguishableName());
-            if (!TextUtils.isEmpty(previewData.getReason())){
+            if (showDistinguishableName){
+                appendData(builder, showTab, R.string.tools_distinguishable_name, previewData.getDigtinguishableName());
+            }
+            if (!TextUtils.isEmpty(builder) && showReason && !TextUtils.isEmpty(previewData.getReason())){
                 builder.append("\n");
             }
-            appendData(builder, previewData.isTab(), R.string.tools_reason, previewData.getReason());
-            if (!TextUtils.isEmpty(previewData.getPosition())){
+            if (showReason){
+                appendData(builder, showTab, R.string.tools_reason, previewData.getReason());
+            }
+            if (!TextUtils.isEmpty(builder) && showPosition && !TextUtils.isEmpty(previewData.getPosition())){
                 builder.append("\n");
             }
-            appendData(builder, previewData.isTab(), R.string.tools_position, previewData.getPosition());
-            if (!TextUtils.isEmpty(previewData.getDate())){
+            if (showPosition){
+                appendData(builder, showTab, R.string.tools_location, previewData.getPosition());
+            }
+            if (!TextUtils.isEmpty(builder) && showDate && !TextUtils.isEmpty(previewData.getDate())){
                 builder.append("\n");
             }
-            appendData(builder, previewData.isTab(), R.string.tools_date, previewData.getDate());
-            if (!TextUtils.isEmpty(previewData.getComPDFKitVersion())){
+            if (showDate){
+                appendData(builder, showTab, R.string.tools_date, previewData.getDate());
+            }
+            if (!TextUtils.isEmpty(builder) && showSDKVersion && !TextUtils.isEmpty(previewData.getSdkVersion())){
                 builder.append("\n");
             }
-            appendData(builder, previewData.isTab(), R.string.tools_compdfkit_versions, previewData.getComPDFKitVersion());
+            if (showSDKVersion) {
+                appendData(builder, showTab, R.string.tools_compdfkit_versions, previewData.getSdkVersion());
+            }
             tvSignInfo.setText(builder);
             if (previewData.getAlignment() == Alignment.left) {
                 tvSignInfo.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
             }else {
                 tvSignInfo.setGravity(Gravity.CENTER_VERTICAL | Gravity.END);
             }
-
         }
     }
 

+ 46 - 4
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/pdfproperties/pdfsign/CDigitalSignatureWidgetImpl.java

@@ -15,25 +15,67 @@ import androidx.fragment.app.FragmentActivity;
 
 import com.compdfkit.core.annotation.CPDFImageScaleType;
 import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
+import com.compdfkit.core.document.signature.CPDFCertInfo;
+import com.compdfkit.core.document.signature.CPDFSignature;
+import com.compdfkit.core.document.signature.CPDFSigner;
+import com.compdfkit.core.document.signature.CPDFX509;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.activity.CBasicActivity;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.CToastUtil;
 import com.compdfkit.tools.common.utils.image.CBitmapUtil;
-import com.compdfkit.tools.signature.dialog.CPDFSelectDigitalSignatureDialog;
-import com.compdfkit.tools.signature.dialog.preview.CDigitalSignStylePreviewDialog;
-import com.compdfkit.tools.signature.interfaces.COnSelectCertFileListener;
+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.CertDigitalSignInfoDialog;
+import com.compdfkit.tools.signature.preview.CDigitalSignStylePreviewDialog;
 import com.compdfkit.ui.proxy.form.CPDFSignatureWidgetImpl;
 
+import java.io.File;
+
 
 public class CDigitalSignatureWidgetImpl extends CPDFSignatureWidgetImpl {
 
     @Override
     public void onSignatureWidgetFocused(CPDFSignatureWidget cpdfSignatureWidget) {
+        CPDFSignature signature = readerView.getPDFDocument().getPdfSignature(cpdfSignatureWidget);
+        CPDFSigner[]  signers = signature.getSignerArr();
+        if (signers != null && signers.length >0){
+            CertDigitalSignInfoDialog signInfoDialog = CertDigitalSignInfoDialog.newInstance();
+            signInfoDialog.setDocument(readerView.getPDFDocument());
+            signInfoDialog.setPDFSignature(signature);
+            if (readerView.getContext() instanceof FragmentActivity) {
+                signInfoDialog.show(((FragmentActivity) readerView.getContext()).getSupportFragmentManager(), "signInfoDialog");
+            }
+            return;
+        }
+
         CPDFSelectDigitalSignatureDialog dialog = CPDFSelectDigitalSignatureDialog.newInstance();
         dialog.setCertDigitalSignListener((certFilePath, certPassword, signImagePath) -> {
+            CPDFCertInfo certInfo = CertificateDigitalDatas.getCertInfo(certFilePath, certPassword);
             CDigitalSignStylePreviewDialog previewDialog = CDigitalSignStylePreviewDialog.newInstance(signImagePath);
-            previewDialog.setResultDigitalSignListener(digitalSignImagePath -> {
+            previewDialog.setCertInfo(certInfo);
+            previewDialog.setResultDigitalSignListener((digitalSignImagePath, styleData) -> {
                 try {
+                    // set sign image
                     Bitmap bitmap = CBitmapUtil.decodeBitmap(digitalSignImagePath);
                     ((CPDFSignatureWidget) pdfAnnotation).updateApWithBitmap(bitmap, CPDFImageScaleType.SCALETYPE_fitCenter);
                     refresh();
+                    File saveFile = new File(readerView.getContext().getCacheDir(),
+                            CFileUtils.ROOT_FOLDER + "digitalSign" + File.separator + readerView.getPDFDocument().getFileName());
+                    saveFile.getParentFile().mkdirs();
+                    // sign this pdf document
+                    boolean result = CertificateDigitalDatas.signDocument(readerView.getPDFDocument(),
+                            cpdfSignatureWidget, styleData,
+                            certFilePath, certPassword, saveFile.getAbsolutePath());
+                    if (result){
+                        CToastUtil.showToast(readerView.getContext(), readerView.getContext().getString(R.string.tools_digital_sign_success));
+                        if (readerView.getParent() instanceof CPDFViewCtrl) {
+                            // open signed pdf document
+                            CPDFViewCtrl pdfView = (CPDFViewCtrl) readerView.getParent();
+                            pdfView.openPDF(saveFile.getAbsolutePath());
+                        }
+                    }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }

+ 36 - 18
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/preview/CDigitalSignStylePreviewDialog.java

@@ -7,7 +7,7 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.signature.dialog.preview;
+package com.compdfkit.tools.signature.preview;
 
 import android.app.Dialog;
 import android.graphics.Bitmap;
@@ -28,13 +28,14 @@ import androidx.appcompat.widget.AppCompatCheckBox;
 import androidx.appcompat.widget.AppCompatImageView;
 import androidx.appcompat.widget.AppCompatTextView;
 
+import com.compdfkit.core.document.signature.CPDFCertInfo;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.annotation.pdfproperties.pdfsignature.data.CSignatureDatas;
 import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 import com.compdfkit.tools.common.views.CToolBar;
-import com.compdfkit.tools.signature.dialog.preview.view.CSignStylePositionView;
-import com.compdfkit.tools.signature.dialog.preview.view.CSignStyleReasonView;
+import com.compdfkit.tools.signature.preview.view.CSignStylePositionView;
+import com.compdfkit.tools.signature.preview.view.CSignStyleReasonView;
 import com.compdfkit.tools.signature.pdfproperties.pdfsign.CDigitalSignStyleData;
 import com.compdfkit.tools.signature.pdfproperties.pdfsign.CDigitalSignStylePreviewView;
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
@@ -89,6 +90,8 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
 
     private COnResultDigitalSignListener resultDigitalSignListener;
 
+    private CPDFCertInfo certInfo;
+
     public static CDigitalSignStylePreviewDialog newInstance(String signImagePath) {
         Bundle args = new Bundle();
         args.putString(EXTRA_SIGN_IMAGE_PATH, signImagePath);
@@ -97,6 +100,10 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
         return fragment;
     }
 
+    public void setCertInfo(CPDFCertInfo certInfo){
+        this.certInfo = certInfo;
+    }
+
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
@@ -117,7 +124,7 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle_TopCorners);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle_FillScreen);
     }
 
     @Override
@@ -125,7 +132,8 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
         super.onStart();
         BottomSheetBehavior<View> behavior = BottomSheetBehavior.from((View) getView().getParent());
         CDialogFragmentUtil.setBottomSheetDialogFragmentFullScreen(getDialog(), behavior);
-        CDialogFragmentUtil.setDimAmount(getDialog(), CViewUtils.isLandScape(getContext()) ? 0.2F : 0F);
+        CDialogFragmentUtil.setDimAmount(getDialog(), 0F);
+        behavior.setDraggable(false);
     }
 
     @Nullable
@@ -172,11 +180,10 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
         positionView.setCheckedChangeListener((buttonView, isChecked) -> {
             if (isChecked){
                 tvPositionDesc.setText(positionView.getPosition());
-                previewView.setPosition(positionView.getPosition());
             }else {
                 tvPositionDesc.setText(R.string.tools_close);
-                previewView.setPosition("");
             }
+            previewView.setShowPosition(isChecked);
         });
         positionView.setTextChangedListener((s, start, before, count) -> {
             if (positionView.isEnablePosition()){
@@ -187,11 +194,11 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
         reasonView.setOnCheckedChangeListener((buttonView, isChecked) -> {
             if (isChecked){
                 tvReasonDesc.setText(reasonView.getReason());
-                previewView.setReason(reasonView.getReason());
             } else {
                 tvReasonDesc.setText(R.string.tools_close);
-                previewView.setReason("");
             }
+            previewView.setShowReason(isChecked);
+            previewView.setReason(reasonView.getReason());
         });
         reasonView.setSelectReasonListener(reason -> {
             if (reasonView.isEnableReason()){
@@ -199,17 +206,28 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
                 previewView.setReason(reason);
             }
         });
-        cbTab.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.showTab(isChecked));
-        cbName.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.showName(isChecked));
-        cbDate.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.showDate(isChecked));
-        cbDistinguishableName.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.showDistinguishableName(isChecked));
-        cbSDKVersion.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.showComPDFKitVersion(isChecked));
-        cbLogo.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.showLogo(isChecked));
+        cbTab.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.setShowTab(isChecked));
+        cbName.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.setShowName(isChecked));
+        cbDate.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.setShowDate(isChecked));
+        cbDistinguishableName.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.setShowDistinguishableName(isChecked));
+        cbSDKVersion.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.setShowSDKVersion(isChecked));
+        cbLogo.setOnCheckedChangeListener((buttonView, isChecked) -> previewView.setShowLogo(isChecked));
     }
 
     private void initData(){
         String signImagePath = getArguments().getString(EXTRA_SIGN_IMAGE_PATH, "");
-        previewView.setPreviewData(CDigitalSignStyleData.defaultConfig(signImagePath));
+        CDigitalSignStyleData data = CDigitalSignStyleData.defaultConfig(signImagePath);
+        if (certInfo != null) {
+            data.setDigtinguishableName(certInfo.getIssuer().getCommonName());
+            data.setName(certInfo.getIssuer().getCommonName());
+        }
+        previewView.setPreviewData(data);
+        previewView.setShowName(cbName.isChecked());
+        previewView.setShowDate(cbDate.isChecked());
+        previewView.setShowLogo(cbLogo.isChecked());
+        previewView.setShowDistinguishableName(cbDistinguishableName.isChecked());
+        previewView.setShowSDKVersion(cbSDKVersion.isChecked());
+        previewView.setShowTab(cbTab.isChecked());
         ivAlignmentLeft.setSelected(true);
         tvAlignment.setVisibility(TextUtils.isEmpty(signImagePath) ? View.GONE : View.VISIBLE);
         llAlignment.setVisibility(TextUtils.isEmpty(signImagePath) ? View.GONE : View.VISIBLE);
@@ -257,7 +275,7 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
             Bitmap bitmap = previewView.getBitmap();
             String imagePath = CSignatureDatas.saveSignatureBitmap(getContext(), bitmap);
             if (resultDigitalSignListener != null) {
-                resultDigitalSignListener.sign(imagePath);
+                resultDigitalSignListener.sign(imagePath, previewView.getPreviewData());
             }
             dismiss();
         }
@@ -268,6 +286,6 @@ public class CDigitalSignStylePreviewDialog extends BottomSheetDialogFragment im
     }
 
     public interface COnResultDigitalSignListener{
-        void sign(String digitalSignImagePath);
+        void sign(String digitalSignImagePath, CDigitalSignStyleData styleData);
     }
 }

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/preview/view/CSignStylePositionView.java

@@ -7,7 +7,7 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.signature.dialog.preview.view;
+package com.compdfkit.tools.signature.preview.view;
 
 import android.content.Context;
 import android.text.Editable;

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/dialog/preview/view/CSignStyleReasonView.java

@@ -7,7 +7,7 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.signature.dialog.preview.view;
+package com.compdfkit.tools.signature.preview.view;
 
 
 import android.content.Context;

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

@@ -0,0 +1,126 @@
+/**
+ * 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.signature.verify.view;
+
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+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.info.signlist.CPDFCertDigitalSignListDialog;
+
+public class CVerifySignStatusView extends FrameLayout {
+
+    private AppCompatImageView ivStatus;
+
+    private AppCompatTextView tvStatus;
+
+    private AppCompatButton btnDetails;
+
+    private Status status;
+
+    private CPDFViewCtrl pdfView;
+
+    public void initWithPDFView(CPDFViewCtrl pdfView) {
+        this.pdfView = pdfView;
+    }
+
+    public CVerifySignStatusView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public CVerifySignStatusView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CVerifySignStatusView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initAttr(context, attrs);
+        initView(context);
+        updateStatus();
+    }
+
+    private void initView(Context context) {
+        inflate(context, R.layout.tools_sign_verify_sign_status_view, this);
+        ivStatus = findViewById(R.id.iv_status);
+        tvStatus = findViewById(R.id.tv_status);
+        btnDetails = findViewById(R.id.btn_details);
+        btnDetails.setOnClickListener(v -> {
+            if (getContext() instanceof FragmentActivity) {
+                CPDFCertDigitalSignListDialog signListDialog = CPDFCertDigitalSignListDialog.newInstance();
+                signListDialog.initWithPDFView(pdfView);
+                signListDialog.show(((FragmentActivity) getContext()).getSupportFragmentManager(), "signListDialog");
+            }
+        });
+    }
+
+    private void initAttr(Context context, AttributeSet attrs) {
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CVerifySignStatusView);
+        if (typedArray != null) {
+            int statusFlag = typedArray.getInt(R.styleable.CVerifySignStatusView_status, Status.VALID.ordinal());
+            switch (statusFlag) {
+                case 1:
+                    status = Status.FAILURES;
+                    break;
+                case 2:
+                    status = Status.WRONG;
+                    break;
+                default:
+                    status = Status.VALID;
+                    break;
+            }
+            typedArray.recycle();
+        }
+    }
+
+    public void setStatus(Status status) {
+        this.status = status;
+        updateStatus();
+    }
+
+    private void updateStatus() {
+        switch (status) {
+            case VALID:
+                ivStatus.setImageResource(R.drawable.tools_ic_digital_sign_is_valid);
+                tvStatus.setText(R.string.tools_sign_is_valid_info);
+                break;
+            case FAILURES:
+                ivStatus.setImageResource(R.drawable.tools_ic_digital_sign_is_failures);
+                tvStatus.setText(R.string.tools_sign_is_in_valid_info);
+                break;
+            case WRONG:
+                ivStatus.setImageResource(R.drawable.tools_ic_digital_sign_is_wrong);
+                tvStatus.setText(R.string.tools_sign_cert_has_expired);
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    public enum Status {
+
+        VALID,
+
+        FAILURES,
+
+        WRONG
+    }
+}

File diff suppressed because it is too large
+ 27 - 0
ComPDFKit_Tools/src/main/res/drawable/tools_ic_digital_sign_is_failures.xml


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


File diff suppressed because it is too large
+ 17 - 0
ComPDFKit_Tools/src/main/res/drawable/tools_ic_digital_sign_is_wrong.xml


+ 6 - 0
ComPDFKit_Tools/src/main/res/drawable/tools_sign_cert_info_btn_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke android:color="@color/tools_color_accent" android:width="1dp"
+        />
+    <corners android:radius="2dp"/>
+</shape>

+ 71 - 0
ComPDFKit_Tools/src/main/res/layout-land/tools_sign_style_preview_dialog.xml

@@ -0,0 +1,71 @@
+<?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"
+    android:background="@color/tools_style_content_bg">
+
+    <com.compdfkit.tools.common.views.CToolBar
+        android:id="@+id/tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?android:attr/actionBarSize"
+        android:elevation="4dp"
+        android:title="@string/tools_customize_the_signature_appearance"
+        app:layout_constraintTop_toTopOf="parent"
+        app:tools_toolbar_back_icon="@drawable/tools_ic_back">
+
+        <androidx.appcompat.widget.AppCompatButton
+            android:id="@+id/btn_save"
+            android:layout_width="wrap_content"
+            android:layout_height="32dp"
+            android:layout_gravity="end|center_vertical"
+            android:layout_marginEnd="16dp"
+            android:background="@drawable/tools_properties_signature_add_sign"
+            android:minWidth="70dp"
+            android:text="@string/tools_save"
+            android:textColor="@color/tools_color_accent"
+            android:textSize="16sp" />
+
+    </com.compdfkit.tools.common.views.CToolBar>
+
+
+    <include
+        layout="@layout/tools_sign_style_preview_main"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guide_center"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_percent="0.5" />
+
+    <com.compdfkit.tools.signature.preview.view.CSignStylePositionView
+        android:id="@+id/view_position"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@id/guide_center"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar"
+        tools:background="@color/tools_color_background" />
+
+    <com.compdfkit.tools.signature.preview.view.CSignStyleReasonView
+        android:id="@+id/view_reason"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@id/guide_center"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar"
+        tools:background="@color/tools_color_background" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 244 - 0
ComPDFKit_Tools/src/main/res/layout-land/tools_sign_style_preview_main.xml

@@ -0,0 +1,244 @@
+<?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">
+
+    <com.compdfkit.tools.signature.pdfproperties.pdfsign.CDigitalSignStylePreviewView
+        android:id="@+id/digital_sign_preview"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/guide_center_1"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/guide_center_1"
+        app:layout_constraintGuide_percent="0.5"
+        android:orientation="vertical"
+        />
+
+    <ScrollView
+        android:layout_width="0dp"
+        android:id="@+id/sl_main"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/guide_center_1"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_text_signature"
+                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_text_properties"
+                android:textColor="@color/tools_text_color_primary"
+                android:textSize="12sp"
+                app:layout_constraintTop_toTopOf="parent" />
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_alignment"
+                android:layout_width="match_parent"
+                android:layout_height="48dp"
+                android:background="@drawable/tools_common_btn_rectangle_ripple"
+                android:gravity="center_vertical"
+                android:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:text="@string/tools_annot_align_type"
+                android:textColor="@color/tools_text_color_primary"
+                app:layout_constraintTop_toBottomOf="@id/tv_text_signature" />
+
+
+            <LinearLayout
+                android:id="@+id/ll_alignment_type"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="24dp"
+                android:background="@drawable/tools_annotation_font_alignment_root_bg"
+                android:orientation="horizontal"
+                app:layout_constraintBottom_toBottomOf="@id/tv_alignment"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="@id/tv_alignment">
+
+                <androidx.appcompat.widget.AppCompatImageView
+                    android:id="@+id/iv_alignment_left"
+                    android:layout_width="49dp"
+                    android:layout_height="32dp"
+                    android:background="@drawable/tools_annotation_font_alignment_bg"
+                    android:button="@null"
+                    android:padding="4dp"
+                    android:textSize="0sp"
+                    app:srcCompat="@drawable/tools_font_alignment_left"
+                    app:tint="@color/tools_font_style_iv_color" />
+
+                <androidx.appcompat.widget.AppCompatImageView
+                    android:id="@+id/iv_alignment_right"
+                    android:layout_width="49dp"
+                    android:layout_height="32dp"
+                    android:background="@drawable/tools_annotation_font_alignment_bg"
+                    android:padding="4dp"
+                    app:srcCompat="@drawable/tools_font_alignment_right"
+                    app:tint="@color/tools_font_style_iv_color" />
+
+            </LinearLayout>
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_position"
+                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:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:text="@string/tools_location"
+                android:textColor="@color/tools_text_color_primary"
+                app:drawableTint="@color/tools_text_color_primary"
+                app:layout_constraintTop_toBottomOf="@id/tv_alignment" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_position_desc"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="48dp"
+                android:text="@string/tools_close"
+                android:textColor="@color/tools_text_color_primary"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_position"
+                app:layout_constraintEnd_toEndOf="parent" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_reason"
+                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:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:text="@string/tools_reason"
+                android:textColor="@color/tools_text_color_primary"
+                app:drawableTint="@color/tools_text_color_primary"
+                app:layout_constraintTop_toBottomOf="@id/tv_position" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_reason_desc"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="48dp"
+                android:text="@string/tools_close"
+                android:textColor="@color/tools_text_color_primary"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_reason"
+                app:layout_constraintEnd_toEndOf="parent" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_optional_reasons"
+                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_include_text"
+                android:textColor="@color/tools_text_color_primary"
+                android:textSize="12sp"
+                app:layout_constraintTop_toBottomOf="@id/tv_reason" />
+
+            <androidx.constraintlayout.helper.widget.Flow
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="16dp"
+                android:orientation="vertical"
+                app:constraint_referenced_ids="cb_name,cb_date,cb_logo,cb_distinguishable_name,cb_compdfkit_version,cb_tab"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/tv_optional_reasons"
+
+                />
+
+            <androidx.appcompat.widget.AppCompatCheckBox
+                android:id="@+id/cb_name"
+                android:layout_width="0dp"
+                android:layout_height="45dp"
+                android:button="@drawable/tools_ic_digital_sign_checkbox"
+                android:checked="true"
+                android:gravity="center_vertical"
+                android:paddingStart="8dp"
+                android:text="@string/tools_field_name"
+                android:textColor="@color/tools_text_color_primary" />
+
+            <androidx.appcompat.widget.AppCompatCheckBox
+                android:id="@+id/cb_date"
+                android:layout_width="0dp"
+                android:layout_height="45dp"
+                android:button="@drawable/tools_ic_digital_sign_checkbox"
+                android:checked="true"
+                android:gravity="center_vertical"
+                android:paddingStart="8dp"
+                android:text="@string/tools_date"
+                android:textColor="@color/tools_text_color_primary" />
+
+            <androidx.appcompat.widget.AppCompatCheckBox
+                android:id="@+id/cb_logo"
+                android:layout_width="0dp"
+                android:layout_height="45dp"
+                android:button="@drawable/tools_ic_digital_sign_checkbox"
+                android:checked="true"
+                android:gravity="center_vertical"
+                android:paddingStart="8dp"
+                android:text="@string/tools_logo"
+                android:textColor="@color/tools_text_color_primary" />
+
+            <androidx.appcompat.widget.AppCompatCheckBox
+                android:id="@+id/cb_distinguishable_name"
+                android:layout_width="0dp"
+                android:layout_height="45dp"
+                android:button="@drawable/tools_ic_digital_sign_checkbox"
+                android:gravity="center_vertical"
+                android:paddingStart="8dp"
+                android:text="@string/tools_distinguishable_name"
+                android:textColor="@color/tools_text_color_primary" />
+
+            <androidx.appcompat.widget.AppCompatCheckBox
+                android:id="@+id/cb_compdfkit_version"
+                android:layout_width="0dp"
+                android:layout_height="45dp"
+                android:button="@drawable/tools_ic_digital_sign_checkbox"
+                android:gravity="center_vertical"
+                android:paddingStart="8dp"
+                android:text="@string/tools_compdfkit_versions"
+                android:textColor="@color/tools_text_color_primary" />
+
+            <androidx.appcompat.widget.AppCompatCheckBox
+                android:id="@+id/cb_tab"
+                android:layout_width="0dp"
+                android:layout_height="45dp"
+                android:button="@drawable/tools_ic_digital_sign_checkbox"
+                android:checked="true"
+                android:gravity="center_vertical"
+                android:paddingStart="8dp"
+                android:text="@string/tools_tab"
+                android:textColor="@color/tools_text_color_primary" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </ScrollView>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
+

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

@@ -24,6 +24,7 @@
         android:layout_marginTop="8dp"
         android:background="@drawable/tools_bg_import_certificate_digital_id_item"
         android:ellipsize="end"
+        android:textColorHint="@color/tools_text_color_primary"
         android:paddingHorizontal="8dp"
         android:singleLine="true"
         android:textColor="@color/tools_text_color_primary"

+ 36 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_cert_digital_sign_list_fragment.xml

@@ -0,0 +1,36 @@
+<?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"
+        android:title="@string/tools_signature_list"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:visibility="invisible"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar"
+        tools:listitem="@layout/tools_sign_cert_digital_sign_list_item" />
+
+
+    <ProgressBar
+        android:id="@+id/progress_bar"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar"
+        app:layout_constraintVertical_bias="0.4" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 98 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_cert_digital_sign_list_item.xml

@@ -0,0 +1,98 @@
+<?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"
+    android:layout_marginHorizontal="16dp"
+    android:layout_marginTop="16dp"
+    android:foreground="@drawable/tools_common_btn_rectangle_ripple"
+    android:background="@drawable/tools_style_signature_list_item_bg">
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_icon"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:src="@drawable/tools_ic_digital_sign_is_valid"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginEnd="16dp"
+        android:textColor="@color/tools_text_color_primary"
+        android:textSize="15sp"
+        android:textStyle="bold"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintStart_toEndOf="@id/iv_icon"
+        app:layout_constraintTop_toTopOf="@id/iv_icon"
+        tools:text="Digital Signature Name" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_desc"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:layout_marginEnd="16dp"
+        android:lineSpacingMultiplier="1.2"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintStart_toStartOf="@id/tv_sign_name"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_name"
+        tools:text="Valid signature, Signed by ComPDFKit xxxx@gmail.com " />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:layout_marginEnd="16dp"
+        android:lineSpacingMultiplier="1.2"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintStart_toStartOf="@id/tv_sign_name"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_desc"
+        tools:text="Signature Time:2023 01 01 10:00:00" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginBottom="16dp"
+        android:lineSpacingMultiplier="1.2"
+        android:textColor="@color/tools_text_color_secondary"
+        android:textSize="12sp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintStart_toStartOf="@id/tv_sign_name"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_date"
+        tools:text="Authentication Successful" />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_delete"
+        android:layout_width="35dp"
+        android:layout_height="35dp"
+        android:layout_margin="4dp"
+        android:background="@drawable/tools_common_oval_ripple"
+        android:padding="6dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/tools_ic_red_delete" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 264 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_certificate_attributes_fragment.xml

@@ -0,0 +1,264 @@
+<?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"
+    android:background="@drawable/tools_annot_style_dialog_window_bg">
+
+    <com.compdfkit.tools.common.views.CToolBar
+        android:id="@+id/tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:elevation="4dp"
+        android:title="@string/tools_digital_sign_attr"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:fillViewport="true"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+
+            <androidx.constraintlayout.widget.Guideline
+                android:id="@+id/guide_start"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                app:layout_constraintGuide_begin="16dp" />
+
+            <androidx.constraintlayout.widget.Barrier
+                android:id="@+id/barrier_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:barrierDirection="end"
+                app:constraint_referenced_ids="tv_version_title,tv_sign_orithm_title,tv_thematic_title,tv_product_key_title,tv_validity_period_title,tv_cert_policy_title,tv_crl_distri_point_title" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_version_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:text="@string/tools_version"
+                android:textStyle="bold"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_sign_orithm_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                android:textStyle="bold"
+                android:text="@string/tools_signature_orithm"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toBottomOf="@id/tv_version_title" />
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_thematic_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                android:textStyle="bold"
+                android:text="@string/tools_thematic"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toBottomOf="@id/barrier_sign_orithm" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_product_key_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                android:text="@string/tools_product_key"
+                android:textStyle="bold"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toBottomOf="@id/barrier_thematic" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_validity_period_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                android:text="@string/tools_validity_period"
+                android:textStyle="bold"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toBottomOf="@id/tv_product_key_title" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_cert_policy_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                android:textStyle="bold"
+
+                android:text="@string/tools_certificate_policy"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toBottomOf="@id/barrier_validity_period" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_crl_distri_point_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                android:textStyle="bold"
+                android:text="@string/tools_crl_distri_point"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constraintStart_toStartOf="@id/guide_start"
+                app:layout_constraintTop_toBottomOf="@id/barrier_cert_policy" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_version_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_version_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="V3" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_sign_orithm_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_sign_orithm_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="SHA - 256 with RSA encryption (1.2.840.113549.1.11)" />
+
+            <androidx.constraintlayout.widget.Barrier
+                android:id="@+id/barrier_sign_orithm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:barrierDirection="bottom"
+                app:constraint_referenced_ids="tv_sign_orithm_title,tv_sign_orithm_value" />
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_thematic_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_thematic_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="C=CN,O=ComPDFKit" />
+
+            <androidx.constraintlayout.widget.Barrier
+                android:id="@+id/barrier_thematic"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:barrierDirection="bottom"
+                app:constraint_referenced_ids="tv_thematic_title,tv_thematic_value" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_product_key_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_product_key_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="000000000000000000" />
+
+            <androidx.constraintlayout.widget.Barrier
+                android:id="@+id/barrier_product_key"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:barrierDirection="bottom"
+                app:constraint_referenced_ids="tv_product_key_title,tv_product_key_value" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_validity_period_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_validity_period_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="2023-01-01 10:00:00 +8`00`" />
+
+            <androidx.constraintlayout.widget.Barrier
+                android:id="@+id/barrier_validity_period"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:barrierDirection="bottom"
+                app:constraint_referenced_ids="tv_validity_period_title,tv_validity_period_value" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_cert_policy_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_cert_policy_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="Windows Certificate Policy" />
+
+            <androidx.constraintlayout.widget.Barrier
+                android:id="@+id/barrier_cert_policy"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                app:barrierDirection="bottom"
+                app:constraint_referenced_ids="tv_cert_policy_title,tv_cert_policy_value" />
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_crl_distri_value"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:layout_marginTop="24dp"
+                android:textColor="@color/tools_text_color_secondary"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintBaseline_toBaselineOf="@id/tv_crl_distri_point_title"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0"
+                app:layout_constraintStart_toEndOf="@id/barrier_title"
+                tools:text="/" />
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    </ScrollView>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 101 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_certificate_details.xml

@@ -0,0 +1,101 @@
+<?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"
+    android:background="@drawable/tools_annot_style_dialog_window_bg">
+
+    <include
+        android:id="@+id/tool_bar"
+        layout="@layout/tools_dialog_tool_bar" />
+
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_message"
+        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_signature_message"
+        android:textColor="@color/tools_text_color_primary"
+        android:textSize="12sp"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_founder_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:text="@string/tools_founder"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_message" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_founder"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_sign_founder_title"
+        app:layout_constraintEnd_toEndOf="parent"
+        tools:text="ComPDFKit" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="16dp"
+        android:background="@color/tools_item_dividing_line_color"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_founder_title" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_date_of_sign_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:text="@string/tools_date_of_signature"
+        android:textColor="@color/tools_text_color_primary"
+
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/view_line" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_date_of_sign"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_date_of_sign_title"
+        app:layout_constraintEnd_toEndOf="parent"
+        tools:text="08/08/2023 15:12:04 " />
+
+    <androidx.appcompat.widget.AppCompatButton
+        android:id="@+id/btn_cert_detail"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginBottom="40dp"
+        android:background="@drawable/tools_sign_cert_info_btn_bg"
+        android:foreground="@drawable/tools_common_btn_corner_ripple"
+        android:gravity="center"
+        android:text="@string/tools_cert_detail"
+        android:textColor="@color/tools_color_accent"
+        android:textSize="16sp"
+        android:textStyle="bold"
+        android:textAllCaps="false"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintDimensionRatio="320:40"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 143 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_certificate_digital_sign_info_fragment.xml

@@ -0,0 +1,143 @@
+<?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"
+    android:background="@drawable/tools_annot_style_dialog_window_bg">
+
+    <include
+        android:id="@+id/tool_bar"
+        layout="@layout/tools_dialog_tool_bar" />
+
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_message"
+        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_annot_signature"
+        android:textColor="@color/tools_text_color_primary"
+        android:textSize="12sp"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar" />
+
+    <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="tv_sign_founder_title,tv_date_of_sign_title" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_founder_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:text="@string/tools_signer"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_message" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_founder"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:gravity="end"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_sign_founder_title"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="1"
+        app:layout_constraintStart_toEndOf="@id/barrier"
+        tools:text="ComPDFKitComPDFKitComPDFKitComPDFKitComPDFKitComPDFKit" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="16dp"
+        android:background="@color/tools_item_dividing_line_color"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_founder" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_date_of_sign_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:text="@string/tools_signing_time"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/view_line" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_date_of_sign"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="16dp"
+        android:textColor="@color/tools_text_color_primary"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_date_of_sign_title"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="1"
+        app:layout_constraintStart_toEndOf="@id/barrier"
+        tools:text="08/08/2023 15:12:04 " />
+
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_cert_auth_statement"
+        android:layout_width="match_parent"
+        android:layout_height="28dp"
+        android:layout_marginTop="16dp"
+        android:background="@color/tools_reader_setting_head_bg_color"
+        android:gravity="center_vertical"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:text="@string/tools_cert_auth_statement"
+        android:textColor="@color/tools_text_color_primary"
+        android:textSize="12sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_date_of_sign_title" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_sign_statement_info"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="16dp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_cert_auth_statement"
+        tools:text="@string/tools_sign_is_valid_info" />
+
+    <androidx.appcompat.widget.AppCompatButton
+        android:id="@+id/btn_cert_detail"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="32dp"
+        android:layout_marginBottom="40dp"
+        android:background="@drawable/tools_sign_cert_info_btn_bg"
+        android:foreground="@drawable/tools_common_btn_corner_ripple"
+        android:gravity="center"
+        android:text="@string/tools_view_cert"
+        android:textAllCaps="false"
+        android:textColor="@color/tools_color_accent"
+        android:textSize="16sp"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_sign_statement_info"
+        app:layout_constraintVertical_bias="1" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -11,6 +11,7 @@
         layout="@layout/tools_dialog_tool_bar" />
 
     <ScrollView
+        android:id="@+id/scroll_view"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:fillViewport="true"

+ 47 - 23
ComPDFKit_Tools/src/main/res/layout/tools_sign_create_cert_digital_id_info_layout.xml

@@ -2,6 +2,7 @@
 <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">
 
@@ -26,7 +27,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical"
-        app:constraint_referenced_ids="et_name,et_grantor,et_sectoral,et_email,et_country_area"
+        app:constraint_referenced_ids="et_name,et_organization_unit,et_organization_name,et_email_address,tv_country_regin_title"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/tv_import_desc" />
@@ -35,66 +36,89 @@
         android:id="@+id/et_name"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:hint="@string/tools_please_enter_your_name"
         android:imeOptions="actionNext"
         android:title="@string/tools_field_name" />
 
     <com.compdfkit.tools.common.utils.view.CEditText
-        android:id="@+id/et_grantor"
+        android:id="@+id/et_organization_unit"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:hint="@string/tools_enter_the_name_of_the_organization_unit"
         android:imeOptions="actionNext"
-        android:title="@string/tools_grantor" />
+        android:title="@string/tools_organization_unit" />
 
     <com.compdfkit.tools.common.utils.view.CEditText
-        android:id="@+id/et_sectoral"
+        android:id="@+id/et_organization_name"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:hint="@string/tools_enter_the_name_of_the_organization"
         android:imeOptions="actionNext"
-
-        android:title="@string/tools_sectoral" />
+        android:title="@string/tools_organization_name" />
 
     <com.compdfkit.tools.common.utils.view.CEditText
-        android:id="@+id/et_email"
+        android:id="@+id/et_email_address"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:hint="@string/tools_email_address_hint"
         android:imeOptions="actionNext"
+        android:title="@string/tools_email_address" />
 
-        android:title="@string/tools_email" />
-
-    <com.compdfkit.tools.common.utils.view.CEditText
-        android:id="@+id/et_country_area"
-        android:layout_width="match_parent"
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_country_regin_title"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:imeOptions="actionDone"
-        android:title="@string/tools_country_area" />
+        android:layout_marginStart="16dp"
+        android:paddingTop="16dp"
+        android:text="@string/tools_country_region"
+        android:textColor="@color/tools_text_color_disable"
+        app:layout_constraintStart_toStartOf="parent" />
+
+
+    <androidx.appcompat.widget.AppCompatSpinner
+        android:id="@+id/spinner_country_regin"
+        android:layout_width="0dp"
+        android:layout_height="40dp"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="8dp"
+        android:background="@drawable/tools_bg_import_certificate_digital_id_item"
+        android:dropDownSelector="@color/tools_color_primary"
+        android:foreground="@drawable/tools_common_btn_rectangle_ripple"
+        android:paddingHorizontal="16dp"
+        android:paddingStart="0dp"
+        android:paddingEnd="0dp"
+        android:popupBackground="@drawable/tools_common_window_bg"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_country_regin_title" />
 
     <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/tv_continuous"
+        android:id="@+id/tv_save_to_file"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
         android:layout_marginTop="24dp"
-        android:text="@string/tools_continuous_page_flip"
+        android:text="@string/tools_save_to_file"
         android:textColor="@color/tools_text_color_disable"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/et_country_area" />
+        app:layout_constraintTop_toBottomOf="@id/spinner_country_regin" />
 
     <Switch
-        android:id="@+id/sw_continuous"
+        android:id="@+id/sw_save_to_file"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:checked="true"
         android:layout_marginEnd="16dp"
-        app:layout_constraintBottom_toBottomOf="@id/tv_continuous"
+        android:checked="true"
+        app:layout_constraintBottom_toBottomOf="@id/tv_save_to_file"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="@id/tv_continuous" />
+        app:layout_constraintTop_toTopOf="@id/tv_save_to_file" />
 
     <androidx.appcompat.widget.AppCompatButton
         android:id="@+id/btn_ok"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginHorizontal="16dp"
-        android:layout_marginTop="10dp"
+        android:layout_marginTop="14dp"
         android:layout_marginBottom="32dp"
         android:background="@drawable/tools_verify_pwd_confirm_btn_bg"
         android:elevation="0dp"
@@ -102,7 +126,7 @@
         android:textColor="@android:color/white"
         android:textSize="16sp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_continuous"
+        app:layout_constraintTop_toBottomOf="@id/tv_save_to_file"
         app:layout_constraintVertical_bias="1" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 38 - 23
ComPDFKit_Tools/src/main/res/layout/tools_sign_create_cert_digital_id_save_layout.xml

@@ -1,10 +1,9 @@
 <?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"
-    xmlns:tools="http://schemas.android.com/tools">
+    android:layout_height="match_parent">
 
 
     <androidx.appcompat.widget.AppCompatTextView
@@ -26,12 +25,12 @@
     <androidx.constraintlayout.helper.widget.Flow
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginTop="16dp"
         android:orientation="vertical"
         app:constraint_referenced_ids="ll_save_address,et_password,et_confirm_password"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        android:layout_marginTop="16dp"
-        android:layout_marginHorizontal="16dp"
         app:layout_constraintTop_toBottomOf="@id/tv_save_desc" />
 
 
@@ -39,19 +38,18 @@
         android:id="@+id/ll_save_address"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
         android:layout_marginHorizontal="16dp"
-        android:orientation="vertical">
+        android:orientation="vertical"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
 
         <androidx.appcompat.widget.AppCompatTextView
             android:id="@+id/tv_save_address_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/tools_save_address"
+            android:text="@string/tools_save_location"
             android:textColor="@color/tools_text_color_disable"
-            app:layout_constraintStart_toStartOf="@id/tv_save_desc"
-            />
+            app:layout_constraintStart_toStartOf="@id/tv_save_desc" />
 
 
         <androidx.appcompat.widget.AppCompatTextView
@@ -60,29 +58,28 @@
             android:layout_height="40dp"
             android:layout_marginTop="8dp"
             android:background="@drawable/tools_bg_import_certificate_digital_id_item"
+            android:ellipsize="start"
+            android:foreground="@drawable/tools_common_btn_rectangle_ripple"
+            android:gravity="center_vertical"
             android:paddingHorizontal="8dp"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
+            android:singleLine="true"
             android:textColor="@color/tools_text_color_primary"
             android:textSize="14sp"
-            android:singleLine="true"
-            android:ellipsize="start"
-            android:gravity="center_vertical"
-            tools:text="Document/compdfkit"
-            android:foreground="@drawable/tools_common_btn_rectangle_ripple"
-            />
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            tools:text="Document/compdfkit" />
 
     </LinearLayout>
 
 
-
     <com.compdfkit.tools.common.utils.view.CEditText
         android:id="@+id/et_password"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:imeOptions="actionNext"
         android:inputType="textPassword"
-        android:title="@string/tools_document_password" />
+        android:hint="@string/tools_please_enter_your_password"
+        android:title="@string/tools_set_a_password" />
 
     <com.compdfkit.tools.common.utils.view.CEditText
         android:id="@+id/et_confirm_password"
@@ -90,15 +87,33 @@
         android:layout_height="wrap_content"
         android:imeOptions="actionDone"
         android:inputType="textPassword"
+        android:hint="@string/tools_enter_the_password_again"
         android:title="@string/tools_confirm_password" />
 
 
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_password_error"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:text="@string/tools_confirm_password_error"
+        android:textColor="@color/tools_error"
+        android:visibility="gone"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constrainedWidth="true"
+        android:layout_marginStart="16dp"
+        app:layout_constraintStart_toStartOf="@id/et_confirm_password"
+        app:layout_constraintTop_toBottomOf="@id/et_confirm_password"
+        tools:visibility="visible" />
+
+
     <androidx.appcompat.widget.AppCompatButton
         android:id="@+id/btn_save"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginHorizontal="16dp"
-        android:layout_marginTop="10dp"
+        android:layout_marginTop="32dp"
         android:layout_marginBottom="32dp"
         android:background="@drawable/tools_verify_pwd_confirm_btn_bg"
         android:elevation="0dp"
@@ -106,7 +121,7 @@
         android:textColor="@android:color/white"
         android:textSize="16sp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/et_confirm_password"
+        app:layout_constraintTop_toBottomOf="@id/tv_password_error"
         app:layout_constraintVertical_bias="1" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 4 - 5
ComPDFKit_Tools/src/main/res/layout/tools_sign_digital_sign_select_dialog.xml

@@ -27,7 +27,7 @@
             android:textSize="16sp"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
-            android:text="@string/tools_select_digital_signatures" />
+            android:text="@string/tools_select_a_digital_id" />
 
 
         <RadioGroup
@@ -47,7 +47,7 @@
                 android:id="@+id/rb_import_digital_sign"
                 android:checked="true"
                 android:textColor="@color/tools_text_color_primary"
-                android:text="@string/tools_import_certificate_digital_id"
+                android:text="@string/tools_use_a_digital_id_from_a_file"
                 />
 
             <androidx.appcompat.widget.AppCompatRadioButton
@@ -56,8 +56,7 @@
                 android:id="@+id/rb_new_digital_sign"
                 android:layout_marginTop="8dp"
                 android:textColor="@color/tools_text_color_primary"
-
-                android:text="@string/tools_new_certificate_digital_id"
+                android:text="@string/tools_create_a_new_digital_id"
                 />
 
         </RadioGroup>
@@ -82,7 +81,7 @@
                 android:id="@+id/btn_confirm"
                 style="@style/tools_dialog_button_style"
                 android:background="@drawable/tools_common_btn_corner_ripple"
-                android:text="@string/tools_page_edit_toolbar_done"
+                android:text="@string/tools_continue"
                 tools:textColor="@color/tools_normal_btn_text_color" />
 
         </LinearLayout>

+ 159 - 139
ComPDFKit_Tools/src/main/res/layout/tools_sign_import_certificate_digital_id_fragment.xml

@@ -3,151 +3,171 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:background="@drawable/tools_annot_style_dialog_window_bg"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:background="@drawable/tools_annot_style_dialog_window_bg">
 
     <include
         android:id="@+id/tool_bar"
         layout="@layout/tools_dialog_tool_bar" />
 
-    <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/tv_import_desc"
+    <ScrollView
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginTop="16dp"
-        android:background="@color/tools_reader_setting_head_bg_color"
-        android:lineSpacingMultiplier="1.25"
-        android:padding="16dp"
-        android:text="@string/tools_import_digital_desc"
-        android:textColor="@color/tools_text_color_primary"
-        android:textSize="12sp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tool_bar" />
-
-    <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/tv_certification"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="16dp"
-        android:layout_marginTop="16dp"
-        android:text="@string/tools_certification_documents"
-        android:textColor="@color/tools_text_color_disable"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_import_desc" />
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_certificate"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginTop="8dp"
-        android:background="@drawable/tools_bg_import_certificate_digital_id_item"
-        android:foreground="@drawable/tools_common_btn_rectangle_ripple"
-        app:layout_constraintTop_toBottomOf="@id/tv_certification">
-
-        <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_certificate"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:layout_marginEnd="8dp"
-            android:drawableRight="@drawable/tools_ic_right_arrow"
-            android:ellipsize="end"
-            android:maxLines="1"
-            android:gravity="center_vertical"
-            android:textColor="@color/tools_text_color_primary"
-            android:textSize="14sp"
-            app:drawableTint="@color/tools_text_color_primary"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="Test Certificate digital id.p12" />
-
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-
-    <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/tv_certificate_password"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="16dp"
-        android:layout_marginTop="16dp"
-        android:text="@string/tools_certificate_password"
-        android:textColor="@color/tools_text_color_disable"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/cl_certificate" />
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_certificate_password"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginTop="8dp"
-        app:layout_constraintTop_toBottomOf="@id/tv_certificate_password">
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintVertical_bias="0"
+        android:fillViewport="true"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar">
 
-        <androidx.appcompat.widget.AppCompatEditText
-            android:id="@+id/et_password"
+        <androidx.constraintlayout.widget.ConstraintLayout
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingHorizontal="8dp"
-            android:background="@drawable/tools_bg_import_certificate_digital_id_item"
-            android:ellipsize="end"
-            android:inputType="textPassword"
-            android:maxLines="1"
-            android:textColor="@color/tools_text_color_primary"
-            android:textSize="14sp"
-            android:imeOptions="actionDone"
-            app:drawableTint="@color/tools_text_color_primary"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="Test Certificate digital id.p12" />
-
-        <androidx.appcompat.widget.AppCompatImageView
-            android:id="@+id/iv_remove_password"
-            android:layout_width="40dp"
-            android:layout_height="40dp"
-            android:background="@drawable/tools_common_oval_ripple"
-            android:padding="10dp"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:srcCompat="@drawable/tools_ic_dark_oval_close"
-            tools:visibility="visible" />
-
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/tv_password_error"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:text="@string/tools_wrong_password"
-        android:textColor="@color/tools_error"
-        android:visibility="gone"
-        tools:visibility="visible"
-        app:layout_constraintStart_toStartOf="@id/cl_certificate_password"
-        app:layout_constraintTop_toBottomOf="@id/cl_certificate_password" />
-
-    <androidx.appcompat.widget.AppCompatButton
-        android:id="@+id/btn_ok"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginBottom="48dp"
-        android:background="@drawable/tools_verify_pwd_confirm_btn_bg"
-        android:elevation="0dp"
-        android:text="@string/tools_okay"
-        android:textColor="@android:color/white"
-        android:textSize="16sp"
-        android:enabled="false"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_password_error"
-        app:layout_constraintVertical_bias="1" />
+            android:layout_height="wrap_content">
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_import_desc"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginTop="16dp"
+                android:background="@color/tools_reader_setting_head_bg_color"
+                android:lineSpacingMultiplier="1.25"
+                android:padding="16dp"
+                android:text="@string/tools_import_digital_desc"
+                android:textColor="@color/tools_text_color_primary"
+                android:textSize="12sp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_certification"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="16dp"
+                android:layout_marginTop="16dp"
+                android:text="@string/tools_certificate_file"
+                android:textColor="@color/tools_text_color_disable"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/tv_import_desc" />
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_certificate"
+                android:layout_width="match_parent"
+                android:layout_height="40dp"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginTop="8dp"
+                android:background="@drawable/tools_bg_import_certificate_digital_id_item"
+                android:foreground="@drawable/tools_common_btn_rectangle_ripple"
+                app:layout_constraintTop_toBottomOf="@id/tv_certification">
+
+                <androidx.appcompat.widget.AppCompatTextView
+                    android:id="@+id/tv_certificate"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="8dp"
+                    android:layout_marginEnd="8dp"
+                    android:drawableRight="@drawable/tools_ic_right_arrow"
+                    android:ellipsize="end"
+                    android:gravity="center_vertical"
+                    android:maxLines="1"
+                    android:textColor="@color/tools_text_color_primary"
+                    android:textSize="14sp"
+                    app:drawableTint="@color/tools_text_color_primary"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    tools:text="Test Certificate digital id.p12" />
+
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_certificate_password"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="16dp"
+                android:layout_marginTop="16dp"
+                android:text="@string/tools_password"
+                android:textColor="@color/tools_text_color_disable"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/cl_certificate" />
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_certificate_password"
+                android:layout_width="match_parent"
+                android:layout_height="40dp"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginTop="8dp"
+                app:layout_constraintTop_toBottomOf="@id/tv_certificate_password">
+
+                <androidx.appcompat.widget.AppCompatEditText
+                    android:id="@+id/et_password"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/tools_bg_import_certificate_digital_id_item"
+                    android:ellipsize="end"
+                    android:imeOptions="actionDone"
+                    android:inputType="textPassword"
+                    android:maxLines="1"
+                    android:paddingHorizontal="8dp"
+                    android:textColor="@color/tools_text_color_primary"
+                    android:textSize="14sp"
+                    android:hint="@string/tools_enter_the_password_of_the_cert_file"
+                    app:drawableTint="@color/tools_text_color_primary"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                     />
+
+                <androidx.appcompat.widget.AppCompatImageView
+                    android:id="@+id/iv_remove_password"
+                    android:layout_width="40dp"
+                    android:layout_height="40dp"
+                    android:background="@drawable/tools_common_oval_ripple"
+                    android:padding="10dp"
+                    android:visibility="gone"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:srcCompat="@drawable/tools_ic_dark_oval_close"
+                    tools:visibility="visible" />
+
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_password_error"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="8dp"
+                android:text="@string/tools_invalid_password"
+                android:textColor="@color/tools_error"
+                android:visibility="gone"
+                app:layout_constraintStart_toStartOf="@id/cl_certificate_password"
+                app:layout_constraintTop_toBottomOf="@id/cl_certificate_password"
+                tools:visibility="visible" />
+
+            <androidx.appcompat.widget.AppCompatButton
+                android:id="@+id/btn_ok"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginBottom="48dp"
+                android:background="@drawable/tools_verify_pwd_confirm_btn_bg"
+                android:elevation="0dp"
+                android:enabled="false"
+                app:layout_goneMarginTop="32dp"
+                android:text="@string/tools_okay"
+                android:textColor="@android:color/white"
+                android:textSize="16sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/tv_password_error"
+                app:layout_constraintVertical_bias="1" />
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </ScrollView>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
 
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 5
ComPDFKit_Tools/src/main/res/layout/tools_sign_style_preview_dialog.xml

@@ -11,7 +11,8 @@
         android:layout_width="match_parent"
         android:layout_height="?android:attr/actionBarSize"
         android:elevation="4dp"
-        android:title="@string/tools_add_signatures"
+        android:textSize="14sp"
+        android:title="@string/tools_customize_the_signature_appearance"
         app:layout_constraintTop_toTopOf="parent"
         app:tools_toolbar_back_icon="@drawable/tools_ic_back">
 
@@ -31,13 +32,13 @@
 
 
     <include
-        android:id="@+id/sl_main"
         layout="@layout/tools_sign_style_preview_main"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintTop_toBottomOf="@id/tool_bar" />
 
-    <com.compdfkit.tools.signature.dialog.preview.view.CSignStylePositionView
+    <com.compdfkit.tools.signature.preview.view.CSignStylePositionView
         android:id="@+id/view_position"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -46,7 +47,7 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/tool_bar" />
 
-    <com.compdfkit.tools.signature.dialog.preview.view.CSignStyleReasonView
+    <com.compdfkit.tools.signature.preview.view.CSignStyleReasonView
         android:id="@+id/view_reason"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"

+ 4 - 3
ComPDFKit_Tools/src/main/res/layout/tools_sign_style_preview_main.xml

@@ -3,6 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
+    android:id="@+id/sl_main"
     android:layout_height="wrap_content">
 
 
@@ -29,7 +30,7 @@
             android:gravity="center_vertical"
             android:paddingStart="16dp"
             android:paddingEnd="16dp"
-            android:text="@string/tools_text_signature"
+            android:text="@string/tools_text_properties"
             android:textColor="@color/tools_text_color_primary"
             android:textSize="12sp"
             app:layout_constraintTop_toBottomOf="@id/digital_sign_preview" />
@@ -91,7 +92,7 @@
             android:gravity="center_vertical"
             android:paddingStart="16dp"
             android:paddingEnd="16dp"
-            android:text="@string/tools_position"
+            android:text="@string/tools_location"
             app:drawableTint="@color/tools_text_color_primary"
             android:textColor="@color/tools_text_color_primary"
             app:layout_constraintTop_toBottomOf="@id/tv_alignment" />
@@ -138,7 +139,7 @@
             android:gravity="center_vertical"
             android:paddingStart="16dp"
             android:paddingEnd="16dp"
-            android:text="@string/tools_optional_reasons"
+            android:text="@string/tools_include_text"
             android:textColor="@color/tools_text_color_primary"
             android:textSize="12sp"
             app:layout_constraintTop_toBottomOf="@id/tv_reason" />

+ 2 - 2
ComPDFKit_Tools/src/main/res/layout/tools_sign_style_preview_position.xml

@@ -13,7 +13,7 @@
         android:layout_height="48dp"
         android:gravity="center_vertical"
         android:paddingStart="16dp"
-        android:text="@string/tools_position"
+        android:text="@string/tools_location"
         android:textColor="@color/tools_text_color_primary"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
@@ -43,7 +43,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone"
-        android:title="@string/tools_position"
+        android:title="@string/tools_location"
         tools:visibility="visible"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/view_line"

+ 52 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_verify_sign_status_view.xml

@@ -0,0 +1,52 @@
+<?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:minHeight="48dp"
+    android:clickable="true"
+    android:focusable="true"
+    android:background="@color/tools_annot_list_item_select_bg_color">
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_status"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:layout_marginStart="16dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/tools_ic_digital_sign_is_valid" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:paddingVertical="4dp"
+        android:text="@string/tools_sign_is_valid_info"
+        android:textColor="@color/tools_text_color_primary"
+        android:textSize="14sp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/btn_details"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintStart_toEndOf="@id/iv_status"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.AppCompatButton
+        android:id="@+id/btn_details"
+        android:layout_width="wrap_content"
+        android:layout_height="35dp"
+        android:layout_marginEnd="8dp"
+        android:background="@android:color/transparent"
+        android:text="@string/tools_view_all_signatures"
+        android:textAllCaps="false"
+        android:gravity="center_vertical"
+        android:textColor="@color/tools_color_accent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
ComPDFKit_Tools/src/main/res/layout/tools_signature_tool_bar.xml

@@ -33,7 +33,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginStart="8dp"
-            android:text="@string/tools_add_signatures"
+            android:text="@string/tools_add_a_signature_field"
             android:textColor="@color/tools_text_color_primary"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"

ComPDFKit_Tools/src/main/res/layout/tools_font_list_item.xml → ComPDFKit_Tools/src/main/res/layout/tools_spinner_list_item.xml


+ 10 - 0
ComPDFKit_Tools/src/main/res/values/tools_attrs.xml

@@ -13,6 +13,7 @@
     <declare-styleable name="CToolBar" tools:ignore="ResourceName">
         <attr name="android:title"/>
         <attr name="tools_toolbar_back_icon" format="reference"/>
+        <attr name="android:textSize"/>
     </declare-styleable>
 
     <declare-styleable name="CPDFReaderView" tools:ignore="ResourceName">
@@ -91,6 +92,15 @@
         <attr name="android:title"/>
         <attr name="android:imeOptions"/>
         <attr name="android:inputType"/>
+        <attr name="android:hint"/>
+    </declare-styleable>
+
+    <declare-styleable name="CVerifySignStatusView" tools:ignore="ResourceName">
+        <attr name="status" format="flags">
+            <flag name="valid" value="0"/>
+            <flag name="failures" value="1"/>
+            <flag name="wrong" value="2"/>
+        </attr>
     </declare-styleable>
 
 </resources>

+ 81 - 23
ComPDFKit_Tools/src/main/res/values/tools_strings.xml

@@ -303,40 +303,98 @@
     <string name="tools_reader_view_error_no_browser">There is no browser app found.</string>
     <string name="tools_reader_view_error_invalid_link">Invalid link address.</string>
 
+    <string name="tools_digital_signature">Digital Signature</string>
+    <string name="tools_add_a_signature_field">Add a Signature Field</string>
+    <string name="tools_verify_signatures">Verify the Signature</string>
+    <string name="tools_select_a_digital_id">Select a Digital ID</string>
+    <string name="tools_use_a_digital_id_from_a_file">Use a Digital ID from A File</string>
+    <string name="tools_create_a_new_digital_id">Create A New Digital ID</string>
+    <string name="tools_continue">Continue</string>
+    <string name="tools_certificate_file">Certificate File</string>
+    <string name="tools_enter_the_password_of_the_cert_file">Enter the password of the certificate file</string>
+    <string name="tools_customize_the_signature_appearance">Customize the Signature Appearance</string>
+    <string name="tools_text_properties">Text Properties</string>
+    <string name="tools_location">Location</string>
+    <string name="tools_reason">Reason</string>
+    <string name="tools_i_am_the_owner_of_the_document">I am the owner of the document</string>
+    <string name="tools_i_am_approving_the_document">I am approving the document</string>
+    <string name="tools_i_have_reviewed_this_document">I have reviewed this document</string>
+    <string name="tools_none">None</string>
+    <string name="tools_include_text">Include Text</string>
+    <string name="tools_distinguishable_name">Distinguishable name</string>
+    <string name="tools_date">Date</string>
+    <string name="tools_logo">Logo</string>
+    <string name="tools_compdfkit_versions">ComPDFKit Version</string>
+    <string name="tools_tab">Tab</string>
+    <string name="tools_create_a_self_signed_digital_id">Create A Self-Signed Digital ID</string>
+    <string name="tools_save_a_self_signed_digital_id">Save the Self-Signed Digital ID to A File</string>
+    <string name="tools_create_certificate_digital_id_desc">Digital IDs that are self-signed by individuals do not provide the assurance that the identifying information is valid. For this reason, they may not be accepted in some cases.</string>
+    <string name="tools_please_enter_your_name">Please enter your name</string>
+    <string name="tools_organization_unit">Organization Unit</string>
+    <string name="tools_enter_the_name_of_the_organization_unit">Enter the name of the organization unit</string>
+    <string name="tools_organization_name">Organization Name</string>
+    <string name="tools_enter_the_name_of_the_organization">Enter the name of the organization</string>
+    <string name="tools_email_address">Email Address</string>
+    <string name="tools_email_address_hint">Please enter your email address</string>
+    <string name="tools_country_region">Country Region</string>
+    <string name="tools_country_region_hint">Please select your country/region</string>
+    <string name="tools_save_to_file">Save to File</string>
+    <string name="tools_certificate_digital_id_save_info">After you create and save this Digital ID, it can be used again. </string>
+    <string name="tools_save_location">Save Location</string>
+    <string name="tools_set_a_password">Set A Password</string>
+    <string name="tools_please_enter_your_password">Please enter your password</string>
+    <string name="tools_confirm_password">Confirm the Password</string>
+    <string name="tools_enter_the_password_again">Enter the password again</string>
+    <string name="tools_confirm_password_error">Password and confirm password does not match</string>
+    <string name="tools_signer">Signer</string>
+    <string name="tools_signing_time">Signing Time</string>
+    <string name="tools_cert_auth_statement">Certification Authority Statement</string>
+    <string name="tools_sign_is_valid_info">The signature is valid. The document has not been modified since this signature was applied.</string>
+    <string name="tools_sign_is_in_valid_info">The signature is invalid. The document has been altered or corrupted since it was signed by the current user.</string>
+    <string name="tools_sign_cert_has_expired">The file was signed with a certificate that has expired. If you acquired this file recently, it may not be authentic.</string>
+    <string name="tools_view_all_signatures">View All Signatures</string>
+    <string name="tools_signature_list">Signature List</string>
+    <string name="tools_view_cert">View Certificate</string>
+
+
     <string name="tools_signatures">Signatures</string>
     <string name="tools_digital_signatures">Digital Signatures</string>
     <string name="tools_add_signatures">Add Signature</string>
-    <string name="tools_verify_signatures">Verify Signature</string>
     <string name="tools_import_certificate_digital_id">Import certificate digital ID</string>
     <string name="tools_import_certificate_digital_id_desc">Import an existing Digital ID that you have obtained as a file</string>
-    <string name="tools_new_certificate_digital_id">New certificate digital ID</string>
     <string name="tools_select_digital_signatures">Select Signing Certificate</string>
-    <string name="tools_import_digital_desc">Browse digital ID files. The Digital ID file is password protected. If you do not know its password, you cannot access the digital ID card.</string>
-    <string name="tools_create_certificate_digital_id_desc">Digital IDs are only used for: digital signatures, data encryption, digital signatures and data encryption</string>
+    <string name="tools_import_digital_desc">Browse a digital ID file. Digital ID cards are password-protected. If you do not know the password, you cannot obtain a digital ID card.</string>
     <string name="tools_certification_documents">Certification Documents</string>
     <string name="tools_certificate_password">Certificate Password</string>
     <string name="tools_wrong_password">Wrong Password</string>
     <string name="tools_grantor">Grantor</string>
     <string name="tools_sectoral">Sectoral</string>
-    <string name="tools_country_area">Country/Area</string>
-    <string name="tools_continuous_page_flip">Continuous Page Flip</string>
-    <string name="tools_certificate_digital_id_save_info">Digitally signed ID cards can be saved locally for secondary use</string>
-    <string name="tools_save_address">Save Address</string>
     <string name="tools_document_password">Document Password</string>
-    <string name="tools_confirm_password">Confirm Password</string>
-    <string name="tools_text_signature">Text Signature</string>
-    <string name="tools_position">Position</string>
-    <string name="tools_reason">Reason</string>
-    <string name="tools_optional_reasons">Optional reasons</string>
-    <string name="tools_date">Date</string>
-    <string name="tools_logo">Logo</string>
-    <string name="tools_distinguishable_name">Distinguishable Name</string>
-    <string name="tools_compdfkit_versions">ComPDFKit Versions</string>
-    <string name="tools_tab">Tab</string>
-    <string name="tools_i_am_the_owner_of_the_document">I am the owner of the document</string>
-    <string name="tools_i_am_approving_the_document">I am approving the document</string>
-    <string name="tools_i_have_reviewed_this_document">I have reviewed this document</string>
-    <string name="tools_none">None</string>
-    <string name="tools_close">Close</string>
 
+
+    <string name="tools_close">Close</string>
+    <string name="tools_signature_is_valid">Signature is valid</string>
+    <string name="tools_signature_is_failures">Signature is failures</string>
+    <string name="tools_signature_is_wrong">Signature is Wrong</string>
+    <string name="tools_details">Details</string>
+    <string name="tools_authentication_successful">Authentication Successful</string>
+    <string name="tools_authentication_failures">Authentication Failures</string>
+    <string name="tools_valid_signature">Valid signature</string>
+    <string name="tools_valid_in_signature">InValid signature</string>
+    <string name="tools_signed_by">Signed by</string>
+    <string name="tools_view_digital_signature">View Digital Signature</string>
+    <string name="tools_signature_message">Signature Message</string>
+    <string name="tools_founder">Founder</string>
+    <string name="tools_date_of_signature">Date of Signature</string>
+    <string name="tools_cert_detail">Certificate Detail</string>
+    <string name="tools_digital_sign_attr">Digital Signature Attributes</string>
+    <string name="tools_version">Version:</string>
+    <string name="tools_signature_orithm">Signature...orithm:</string>
+    <string name="tools_thematic">Thematic:</string>
+    <string name="tools_product_key">Product Key:</string>
+    <string name="tools_validity_period">Validity period:</string>
+    <string name="tools_certificate_policy">Certificate Policy:</string>
+    <string name="tools_crl_distri_point">CRL distri...point:</string>
+    <string name="tools_digital_sign_success">签名成功</string>
+    <string name="tools_signature_time">Signature Time:</string>
 </resources>

+ 4 - 0
ComPDFKit_Tools/src/main/res/values/tools_styles.xml

@@ -97,6 +97,10 @@
         <item name="android:maxWidth">@dimen/material_bottom_sheet_max_width</item>
     </style>
 
+    <style name="tools_basic_bottom_sheet_style.fillscreen" parent="Theme.MaterialComponents.Light.BottomSheetDialog">
+        <item name="android:background">@color/tools_color_background</item>
+    </style>
+
     <style name="tools_popwindow_anim_style">
         <item name="android:windowEnterAnimation">@anim/tools_pop_show</item>
         <item name="android:windowExitAnimation">@anim/tools_pop_hide</item>

+ 3 - 0
ComPDFKit_Tools/src/main/res/values/tools_themes.xml

@@ -60,4 +60,7 @@
         <item name="bottomSheetStyle">@style/tools_transparent_bottom_sheet_style</item>
     </style>
 
+    <style name="Tools_Base_Theme.BasicBottomSheetDialogStyle.FillScreen">
+        <item name="bottomSheetStyle">@style/tools_basic_bottom_sheet_style.fillscreen</item>
+    </style>
 </resources>

+ 2 - 3
ContentEditor/src/main/java/com/compdfkit/contenteditor/PDFEditSampleActivity.java

@@ -32,7 +32,6 @@ import com.compdfkit.core.edit.CPDFEditManager;
 import com.compdfkit.tools.common.activity.CBasicActivity;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.utils.CFileUtils;
-import com.compdfkit.tools.common.utils.CUriUtil;
 import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
 import com.compdfkit.tools.common.utils.task.CExtractAssetFileTask;
 import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
@@ -164,7 +163,7 @@ public class PDFEditSampleActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocument();
                 } else {
                     requestStoragePermissions();
@@ -297,7 +296,7 @@ public class PDFEditSampleActivity extends CBasicActivity {
 
     @AfterPermissionGranted(RC_PERMISSION_PERM)
     private void onDoNext() {
-        if (!hasPermissions()) {
+        if (!hasStoragePermissions()) {
             EasyPermissions.requestPermissions(this, getString(R.string.edit_app_permission_storage), RC_PERMISSION_PERM, STORAGE_PERMISSIONS);
         }
     }

BIN
DigitalSignature/src/main/assets/PSPDFKit_Widget_2_Widget.pdf


BIN
DigitalSignature/src/main/assets/測試樣張01_Signed拷貝.pdf


+ 11 - 23
DigitalSignature/src/main/java/com/compdfkit/digitalsignature/CViewerScreenStatusManager.java

@@ -10,6 +10,8 @@
 package com.compdfkit.digitalsignature;
 
 
+import android.view.View;
+
 import androidx.constraintlayout.widget.ConstraintSet;
 import androidx.core.view.WindowCompat;
 import androidx.core.view.WindowInsetsCompat;
@@ -32,7 +34,7 @@ public class CViewerScreenStatusManager {
 
     private ConstraintSetUtils constraintSetUtils = new ConstraintSetUtils();
 
-    private CFillScreenManager manager = new CFillScreenManager();
+    public CFillScreenManager manager = new CFillScreenManager();
 
     public CViewerScreenStatusManager(SignaturesPdfSampleActivityBinding binding) {
         this.binding = binding;
@@ -70,33 +72,19 @@ public class CViewerScreenStatusManager {
             }else {
                 constraintSetUtils.hideFromBottom(constraintSet, binding.signatureToolBar);
             }
+            if (manager.topToolViewList.contains(binding.signStatusView)) {
+                constraintSetUtils.show(constraintSet, binding.signStatusView);
+            }else {
+                constraintSetUtils.hide(constraintSet, binding.signStatusView);
+            }
             isFillScreen = false;
         }
         constraintSetUtils.apply(constraintSet, binding.getRoot());
     }
 
-    private void setFullScreen() {
-        if (binding.pdfView.getContext() instanceof FragmentActivity) {
-            FragmentActivity fragmentActivity = (FragmentActivity) binding.pdfView.getContext();
-            if (!CViewUtils.isLandScape(binding.pdfView.getContext())) {
-                WindowCompat.setDecorFitsSystemWindows(fragmentActivity.getWindow(), false);
-            }
-            WindowInsetsControllerCompat compat = new WindowInsetsControllerCompat(fragmentActivity.getWindow(), binding.getRoot());
-            compat.hide(WindowInsetsCompat.Type.systemBars());
-        }
+    public void constraintShow(View view){
+        constraintSetUtils.show(constraintSet, view);
+        constraintSetUtils.apply(constraintSet, binding.getRoot());
     }
 
-    /**
-     * exit full screen
-     */
-    private void cancelFullScreen() {
-        if (binding.pdfView.getContext() instanceof FragmentActivity) {
-            FragmentActivity fragmentActivity = (FragmentActivity) binding.pdfView.getContext();
-            if (!CViewUtils.isLandScape(binding.pdfView.getContext())) {
-                WindowCompat.setDecorFitsSystemWindows(fragmentActivity.getWindow(), true);
-            }
-            WindowInsetsControllerCompat compat = new WindowInsetsControllerCompat(fragmentActivity.getWindow(), binding.getRoot());
-            compat.show(WindowInsetsCompat.Type.systemBars());
-        }
-    }
 }

+ 29 - 4
DigitalSignature/src/main/java/com/compdfkit/digitalsignature/PDFSignaturesSampleActivity.java

@@ -14,7 +14,6 @@ import android.content.Intent;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
-import android.os.Environment;
 import android.provider.Settings;
 import android.view.View;
 
@@ -36,7 +35,10 @@ import com.compdfkit.tools.common.views.pdfbota.CPDFBotaDialogFragment;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBotaFragmentTabs;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
+import com.compdfkit.tools.signature.CertificateDigitalDatas;
 import com.compdfkit.tools.signature.pdfproperties.pdfsign.CDigitalSignatureWidgetImpl;
+import com.compdfkit.tools.signature.info.signlist.CPDFCertDigitalSignListDialog;
+import com.compdfkit.tools.signature.verify.view.CVerifySignStatusView;
 import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
 import com.compdfkit.ui.reader.CPDFReaderView;
 
@@ -49,7 +51,7 @@ public class PDFSignaturesSampleActivity extends CBasicActivity {
     /**
      * assets folder pdf file
      */
-    public static final String QUICK_START_GUIDE = "PDF32000_2008.pdf";
+    public static final String QUICK_START_GUIDE = "PDF32000_2008(2).pdf";
 
     private SignaturesPdfSampleActivityBinding binding;
 
@@ -68,7 +70,8 @@ public class PDFSignaturesSampleActivity extends CBasicActivity {
         super.onCreate(savedInstanceState);
         binding = SignaturesPdfSampleActivityBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
-        binding.pdfView.setViewMode(CPDFReaderView.ViewMode.FORM);
+        binding.pdfView.setViewMode(CPDFReaderView.ViewMode.VIEW);
+        binding.pdfView.changeFormType(CPDFWidget.WidgetType.Widget_Unknown);
         screenStatusManager = new CViewerScreenStatusManager(binding);
         initToolbarListener();
         initSearchBar();
@@ -99,6 +102,7 @@ public class PDFSignaturesSampleActivity extends CBasicActivity {
                 binding.pdfView.changeFormType(CPDFWidget.WidgetType.Widget_Unknown);
             } else {
                 binding.pdfView.setViewMode(CPDFReaderView.ViewMode.FORM);
+                binding.pdfView.changeFormType(CPDFWidget.WidgetType.Widget_SignatureFields);
             }
             resetContextMenu(binding.pdfView, mode);
         });
@@ -145,11 +149,14 @@ public class PDFSignaturesSampleActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocumentLauncher.launch(CFileUtils.getContentIntent());
                 } else {
                     requestStoragePermissions();
                 }
+                binding.pdfView.savePDF((filePath, pdfUri) -> {
+
+                }, e -> {});
             });
             menuWindow.setOnDismissListener(() -> v.setSelected(false));
             menuWindow.showAsDropDown(v);
@@ -184,8 +191,26 @@ public class PDFSignaturesSampleActivity extends CBasicActivity {
         });
     }
 
+
     private void initSignatureToolbar(){
+        binding.signStatusView.initWithPDFView(binding.pdfView);
         binding.signatureToolBar.initWithPDFView(binding.pdfView);
+        binding.signatureToolBar.getVerifySignButton().setOnClickListener(v -> {
+            verifyDocumentSignStatus();
+        });
+    }
+
+    private void verifyDocumentSignStatus(){
+        int status = CertificateDigitalDatas.verifyDocumentSignStatus(binding.pdfView.getCPdfReaderView().getPDFDocument());
+        if (status == 0){
+            binding.signStatusView.setStatus(CVerifySignStatusView.Status.VALID);
+        }else if (status == 1){
+            binding.signStatusView.setStatus(CVerifySignStatusView.Status.FAILURES);
+        }else {
+            binding.signStatusView.setStatus(CVerifySignStatusView.Status.WRONG);
+        }
+        screenStatusManager.manager.bindTopToolView(binding.signStatusView);
+        screenStatusManager.constraintShow(binding.signStatusView);
     }
 
     private void registerSignaturesHelper(CPDFViewCtrl pdfView) {

+ 15 - 6
DigitalSignature/src/main/res/layout/signatures_pdf_sample_activity.xml

@@ -22,10 +22,10 @@
             android:id="@+id/pdf_tool_bar"
             android:layout_width="match_parent"
             android:layout_height="?android:attr/actionBarSize"
+            android:title="@string/tools_pdf_viewer_mode"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            android:title="@string/tools_pdf_viewer_mode" />
+            app:layout_constraintTop_toTopOf="parent" />
 
         <com.compdfkit.tools.viewer.pdfsearch.CSearchToolbar
             android:id="@+id/pdf_search_tool_bar"
@@ -34,8 +34,7 @@
             android:visibility="gone"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            />
+            app:layout_constraintTop_toTopOf="parent" />
 
     </FrameLayout>
 
@@ -52,12 +51,22 @@
         app:tools_slider_bar_icon="@drawable/tools_ic_pdf_slider_bar"
         app:tools_slider_bar_position="right" />
 
+    <com.compdfkit.tools.signature.verify.view.CVerifySignStatusView
+        android:id="@+id/sign_status_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/fl_tool"
+        android:visibility="gone"
+        tools:visibility="visible"
+        app:status="valid" />
+
     <com.compdfkit.tools.signature.CSignatureToolBar
         android:id="@+id/signature_tool_bar"
         android:layout_width="match_parent"
         android:layout_height="?android:attr/actionBarSize"
-        app:layout_constraintBottom_toBottomOf="parent"
-        />
+        app:layout_constraintBottom_toBottomOf="parent" />
 
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
DocsEditor/src/main/java/com/compdfkit/docseditor/MainActivity.java

@@ -135,7 +135,7 @@ public class MainActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocument();
                 } else {
                     requestStoragePermissions();

+ 1 - 1
Forms/src/main/java/com/compdfkit/forms/PDFFormSampleActivity.java

@@ -162,7 +162,7 @@ public class PDFFormSampleActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocument();
                 } else {
                     requestStoragePermissions();

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

@@ -179,7 +179,7 @@ public class MainActivity extends CBasicActivity {
                 editManager.enable();
                 editManager.beginEdit(CPDFEditPage.LoadTextImage);
             }
-            if (!hasPermissions(STORAGE_PERMISSIONS)) {
+            if (!hasStoragePermissions(STORAGE_PERMISSIONS)) {
                 EasyPermissions.requestPermissions(this, "request permission", 1234, STORAGE_PERMISSIONS);
             }
         } else {
@@ -274,7 +274,7 @@ public class MainActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocument();
                 } else {
                     requestStoragePermissions();
@@ -342,7 +342,7 @@ public class MainActivity extends CBasicActivity {
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
         if (requestCode == REQUEST_EXTERNAL_PERMISSION) {
-            if (hasPermissions(STORAGE_PERMISSIONS)) {
+            if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                 selectDocument();
             }
         } else if (requestCode == 112) {
@@ -427,7 +427,7 @@ public class MainActivity extends CBasicActivity {
 
     @AfterPermissionGranted(RC_PERMISSION_PERM)
     private void onDoNext() {
-        if (!hasPermissions()) {
+        if (!hasStoragePermissions()) {
             EasyPermissions.requestPermissions(this, getString(R.string.app_permission_storage), RC_PERMISSION_PERM, STORAGE_PERMISSIONS);
         }
     }

+ 1 - 1
Viewer/src/main/java/com/compdfkit/viewer/PDFViewerSampleActivity.java

@@ -125,7 +125,7 @@ public class PDFViewerSampleActivity extends CBasicActivity {
                 sharePDF(binding.pdfView);
             });
             menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (hasPermissions(STORAGE_PERMISSIONS)) {
+                if (hasStoragePermissions(STORAGE_PERMISSIONS)) {
                     selectDocumentLauncher.launch(CFileUtils.getContentIntent());
                 } else {
                     requestStoragePermissions();