Преглед на файлове

PDFTool(Android) - 1.替换SDK 2.部分功能调整

liuxiaolong преди 1 година
родител
ревизия
8143489ac4
променени са 58 файла, в които са добавени 1099 реда и са изтрити 607 реда
  1. 1 5
      Annotations/src/main/AndroidManifest.xml
  2. 9 8
      Annotations/src/main/java/com/compdfkit/annotations/PDFAnnotationSampleActivity.java
  3. BIN
      ComPDFKit_Repo/compdfkit-ui/ComPDFKit-UI.aar
  4. BIN
      ComPDFKit_Repo/compdfkit/ComPDFKit.aar
  5. 15 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfsignature/data/CSignatureDatas.java
  6. 2 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/basic/activity/CBasicPDFActivity.java
  7. 2 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CEditTextContextMenuView.java
  8. 6 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/CFileUtils.java
  9. 13 70
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/CPDFToolBar.java
  10. 6 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/pdfstyle/manager/provider/CEditSelectionsProvider.java
  11. 29 6
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfview/CPreviewMode.java
  12. 3 2
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/contenteditor/CEditToolbar.java
  13. 0 21
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/contenteditor/CPDFEditPage.java
  14. 14 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/forms/pdfproperties/pdfsign/SignatureWidgetImpl.java
  15. 4 3
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CDocumentEncryptionDialog.java
  16. 6 4
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CEncryptAlgorithmSpinnerAdapter.java
  17. 101 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/importcert/create/CSelectSignTypeDialog.java
  18. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/preview/CDigitalSignStylePreviewDialog.java
  19. 48 53
      ComPDFKit_Tools/src/main/res/layout/tools_cpdf_security_document_encryption_dialog.xml
  20. 1 1
      ComPDFKit_Tools/src/main/res/layout/tools_cpdf_tool_bar.xml
  21. 24 0
      ComPDFKit_Tools/src/main/res/layout/tools_cpdf_tool_bar_pdf_view_menu_action.xml
  22. 67 64
      ComPDFKit_Tools/src/main/res/layout/tools_cpdf_tool_bar_pdf_view_menu_layout.xml
  23. 92 0
      ComPDFKit_Tools/src/main/res/layout/tools_sign_select_sign_type_dialog.xml
  24. 7 1
      ComPDFKit_Tools/src/main/res/values-zh-rCN/tools_strings.xml
  25. 0 3
      ComPDFKit_Tools/src/main/res/values/tools_attrs.xml
  26. 6 1
      ComPDFKit_Tools/src/main/res/values/tools_strings.xml
  27. 1 4
      ContentEditor/src/main/AndroidManifest.xml
  28. 15 17
      ContentEditor/src/main/java/com/compdfkit/contenteditor/PDFEditSampleActivity.java
  29. 1 5
      DigitalSignature/src/main/AndroidManifest.xml
  30. 12 13
      DigitalSignature/src/main/java/com/compdfkit/digitalsignature/PDFSignaturesSampleActivity.java
  31. 1 4
      DocsEditor/src/main/AndroidManifest.xml
  32. 12 14
      DocsEditor/src/main/java/com/compdfkit/docseditor/MainActivity.java
  33. 1 5
      Forms/src/main/AndroidManifest.xml
  34. 11 8
      Forms/src/main/java/com/compdfkit/forms/PDFFormSampleActivity.java
  35. 1 8
      PDFViewer/src/main/AndroidManifest.xml
  36. 27 0
      PDFViewer/src/main/assets/configuration.json
  37. 124 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/CPDFConfiguration.java
  38. 110 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/CPDFConfigurationUtils.java
  39. 0 49
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/Configuration.java
  40. 195 135
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/MainActivity.java
  41. 15 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/DocumentListFragment.java
  42. 7 4
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeActivity.java
  43. 6 0
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeFunFragment.java
  44. 44 13
      PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/samples/OpenPDFSamplesImpl.java
  45. 1 1
      PDFViewer/src/main/res/values-zh-rCN/strings.xml
  46. 1 1
      PDFViewer/src/main/res/values/strings.xml
  47. 1 4
      Samples/src/main/AndroidManifest.xml
  48. 15 10
      Samples/src/main/java/com/compdfkit/samples/samples/ImageExtractTest.java
  49. 3 10
      Samples/src/main/java/com/compdfkit/samples/samples/TextSearchTest.java
  50. 1 1
      Samples/src/main/java/com/compdfkit/samples/util/FileUtils.java
  51. 1 4
      Samples_kotlin/src/main/AndroidManifest.xml
  52. 1 3
      Samples_kotlin/src/main/java/com/compdfkit/samples/SampleDetailActivity.kt
  53. 1 1
      Samples_kotlin/src/main/java/com/compdfkit/samples/samples/DigitalSignaturesTest.kt
  54. 13 10
      Samples_kotlin/src/main/java/com/compdfkit/samples/samples/ImageExtractTest.kt
  55. 3 9
      Samples_kotlin/src/main/java/com/compdfkit/samples/samples/TextSearchTest.kt
  56. 1 5
      Viewer/src/main/AndroidManifest.xml
  57. 16 14
      Viewer/src/main/java/com/compdfkit/viewer/PDFViewerSampleActivity.java
  58. 1 1
      gradle.properties

Файловите разлики са ограничени, защото са твърде много
+ 1 - 5
Annotations/src/main/AndroidManifest.xml


+ 9 - 8
Annotations/src/main/java/com/compdfkit/annotations/PDFAnnotationSampleActivity.java

@@ -9,6 +9,7 @@ import androidx.activity.result.ActivityResultLauncher;
 
 import com.compdfkit.annotations.databinding.AnnotationPdfSampleActivityBinding;
 import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.edit.CPDFEditManager;
 import com.compdfkit.tools.common.basic.activity.CBasicPDFActivity;
 import com.compdfkit.tools.common.utils.CFileUtils;
 import com.compdfkit.tools.common.utils.CPermissionUtil;
@@ -103,19 +104,19 @@ public class PDFAnnotationSampleActivity extends CBasicPDFActivity {
             binding.pdfView.resetAnnotationType();
             resetContextMenu(binding.pdfView, mode);
         });
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
-            binding.pdfToolBar.setVisibility(View.GONE);
-            binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
-            binding.pdfSearchToolBar.showKeyboard();
-        });
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
             CPDFBotaDialogFragment dialogFragment = CPDFBotaDialogFragment.newInstance();
             dialogFragment.initWithPDFView(binding.pdfView);
             CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
             dialogFragment.setBotaDialogTab(annotationTab);
             dialogFragment.show(getSupportFragmentManager(), "ThumbnailList");
         });
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
+            binding.pdfToolBar.setVisibility(View.GONE);
+            binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
+            binding.pdfSearchToolBar.showKeyboard();
+        });
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
             ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
             CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.ANNOTATION, getString(R.string.tools_annotations));
             CPDFBotaFragmentTabs outlineTab = new CPDFBotaFragmentTabs(CPDFBOTA.OUTLINE, getString(R.string.tools_outlines));
@@ -133,7 +134,7 @@ public class PDFAnnotationSampleActivity extends CBasicPDFActivity {
             dialogFragment.setBotaDialogTabs(tabs);
             dialogFragment.show(getSupportFragmentManager(), "annotationList");
         });
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
             v.setSelected(true);
             //Show the PDF settings dialog fragment
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);

BIN
ComPDFKit_Repo/compdfkit-ui/ComPDFKit-UI.aar


BIN
ComPDFKit_Repo/compdfkit/ComPDFKit.aar


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

@@ -69,6 +69,21 @@ public class CSignatureDatas {
         }
     }
 
+    public static String saveDigitalSignatureBitmap(Context context, Bitmap bitmap){
+        if (bitmap == null){
+            return null;
+        }
+        File file = new File(context.getFilesDir(), CFileUtils.DIGITAL_SIGNATURE_FOLDER);
+        file.mkdirs();
+        File bitmapFile =  new File(file, "digital_signature_"+ CDateUtil.getDataTime(CDateUtil.NORMAL_DATE_FORMAT)+".png");
+        boolean success = CBitmapUtil.saveBitmapToFile(bitmap,bitmapFile, 100, Bitmap.CompressFormat.PNG);
+        if (success){
+            return bitmapFile.getAbsolutePath();
+        }else {
+            return null;
+        }
+    }
+
     public static String saveSignatureImage(Context context, Uri imageUri){
         File file = new File(context.getFilesDir(), CFileUtils.SIGNATURE_FOLDER);
         return CFileUtils.copyFileToInternalDirectory(context, imageUri, file.getAbsolutePath(),

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

@@ -26,6 +26,7 @@ import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
 import com.compdfkit.core.annotation.form.CPDFWidget;
 import com.compdfkit.core.common.CPDFDocumentException;
 import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.core.edit.CPDFEditPage;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.annotation.pdfproperties.pdflink.CLinkAnnotAttachHelper;
 import com.compdfkit.tools.annotation.pdfproperties.pdfnote.CPDFtextAnnotAttachHelper;
@@ -40,7 +41,6 @@ import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleManager;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
-import com.compdfkit.tools.contenteditor.CPDFEditPage;
 import com.compdfkit.tools.docseditor.pdfpageedit.CPDFPageEditDialogFragment;
 import com.compdfkit.tools.forms.pdfproperties.pdfcombobox.CustomComboBoxWidgetImpl;
 import com.compdfkit.tools.forms.pdfproperties.pdflistbox.CustomListBoxWidgetImpl;
@@ -53,7 +53,7 @@ import java.io.File;
 
 public class CBasicPDFActivity extends CPermissionActivity {
 
-    protected int curEditMode = CPDFEditPage.LoadUnknown;
+    protected int curEditMode = CPDFEditPage.LoadNone;
 
     protected void resetContextMenu(CPDFViewCtrl pdfView, CPreviewMode mode) {
         switch (mode) {

+ 2 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CEditTextContextMenuView.java

@@ -21,6 +21,7 @@ import android.view.View;
 
 import androidx.fragment.app.FragmentActivity;
 
+import com.compdfkit.core.edit.CPDFEditPage;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuEditTextProvider;
@@ -31,7 +32,6 @@ import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleDialogFragment;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleManager;
-import com.compdfkit.tools.contenteditor.CPDFEditPage;
 import com.compdfkit.ui.edit.CPDFEditSelections;
 import com.compdfkit.ui.edit.CPDFEditTextSelections;
 import com.compdfkit.ui.reader.CPDFPageView;
@@ -130,7 +130,7 @@ public class CEditTextContextMenuView implements ContextMenuEditTextProvider {
                     helper.dismissContextMenu();
                 });
             }
-        } else if(type == CPDFEditPage.LoadTextImage){
+        } else if(type == 4){
             if (!TextUtils.isEmpty(text)) {
                 menuView.addItem(R.string.tools_context_menu_paste, 0, v -> {
                     pageView.pasteEditTextArea(point, pageView.getCopyTextAreaWidth(), pageView.getCopyTextAreaHeight(), false);

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

@@ -34,6 +34,7 @@ public class CFileUtils {
     public static final String CACHE_FOLDER = "compdfkit/temp";
 
     public static final String SIGNATURE_FOLDER = "compdfkit/annot/signature";
+    public static final String DIGITAL_SIGNATURE_FOLDER = "compdfkit/form/digitalSignature";
 
     public static final String IMAGE_STAMP_FOLDER = "compdfkit/annot/stamp/image";
 
@@ -49,6 +50,11 @@ public class CFileUtils {
         return path + "/" + saveName;
     }
 
+    public static String getAssetsTempFile(Context context, String assetsName, String saveName, boolean overwrite) {
+        String path =  context.getCacheDir().getAbsolutePath();
+        copyFileFromAssets(context, assetsName, path, saveName, overwrite);
+        return path + "/" + saveName;
+    }
 
     public static void copyFileFromAssets(Context context,
                                           String assetName,

+ 13 - 70
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/CPDFToolBar.java

@@ -20,6 +20,7 @@ import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 
+import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.widget.AppCompatImageView;
@@ -33,7 +34,9 @@ import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 import com.compdfkit.tools.common.utils.window.CModeSwitchDialogFragment;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
 
+import java.util.ArrayList;
 import java.util.LinkedHashSet;
+import java.util.List;
 
 
 /**
@@ -61,32 +64,17 @@ import java.util.LinkedHashSet;
  * app:tools_toolbar_bota_icon="@drawable/xxx" <br/>
  * app:tools_toolbar_more_icon="@drawable/xxx" <br/>
  * <p/>
- * btn click listener
- * searchBtnClick:
- *
- * @see CPDFToolBar#setSearchBtnClickListener(OnClickListener)
- * <p>
- * botaBtnClick:
- * @see CPDFToolBar#setBoTaBtnClickListener(OnClickListener)
  */
 public class CPDFToolBar extends FrameLayout {
 
     private AppCompatTextView tvToolBarTitle;
 
-    private AppCompatImageView ivToolBarSearchBtn;
-
-    private AppCompatImageView ivToolBarBoTaBtn;
-
-    private AppCompatImageView ivToolBarMoreBtn;
-
-    private AppCompatImageView ivToolBarThumbnail;
+    private LinearLayout llMenu;
 
     private LinkedHashSet<CPreviewMode> previewModes = new LinkedHashSet<>();
 
     private CPreviewMode currentPreviewMode = CPreviewMode.Viewer;
 
-    private View.OnClickListener moreBtnClickListener;
-
     private CModeSwitchDialogFragment.OnPreviewModeChangeListener changeListener;
 
     public CPDFToolBar(@NonNull Context context) {
@@ -106,11 +94,8 @@ public class CPDFToolBar extends FrameLayout {
         LayoutInflater.from(getContext()).inflate(R.layout.tools_cpdf_tool_bar, this);
         ConstraintLayout clMainToolbar = findViewById(R.id.cl_pdf_root_tool_bar);
         clMainToolbar.setOnClickListener(v -> {});
+        llMenu = findViewById(R.id.ll_menu);
         tvToolBarTitle = findViewById(R.id.tv_tool_bar_title);
-        ivToolBarMoreBtn = findViewById(R.id.iv_tool_bar_more);
-        ivToolBarSearchBtn = findViewById(R.id.iv_tool_bar_search);
-        ivToolBarBoTaBtn = findViewById(R.id.iv_tool_bar_bota);
-        ivToolBarThumbnail = findViewById(R.id.iv_tool_bar_thumbnail);
         LinearLayout llTitle = findViewById(R.id.ll_title);
         llTitle.setOnClickListener(v -> {
             if (previewModes != null && previewModes.size() > 1) {
@@ -122,11 +107,6 @@ public class CPDFToolBar extends FrameLayout {
                 }
             }
         });
-        ivToolBarMoreBtn.setOnClickListener(v -> {
-            if (moreBtnClickListener != null) {
-                moreBtnClickListener.onClick(v);
-            }
-        });
         addMode(CPreviewMode.Viewer);
         initAttributes(context, attrs);
     }
@@ -135,22 +115,9 @@ public class CPDFToolBar extends FrameLayout {
         TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CPDFToolBar);
         if (typedArray != null) {
             String toolBarTitle = typedArray.getString(R.styleable.CPDFToolBar_android_title);
-            typedArray.getResourceId(R.styleable.CPDFToolBar_tools_toolbar_search_icon, -1);
             if (!TextUtils.isEmpty(toolBarTitle)) {
                 tvToolBarTitle.setText(toolBarTitle);
             }
-            Drawable searchIconDrawable = CViewUtils.loadDrawableFromAttributes(getContext(), typedArray, R.styleable.CPDFToolBar_tools_toolbar_search_icon, R.drawable.tools_ic_search);
-            if (searchIconDrawable != null) {
-                ivToolBarSearchBtn.setImageDrawable(searchIconDrawable);
-            }
-            Drawable boTaIconDrawable = CViewUtils.loadDrawableFromAttributes(getContext(), typedArray, R.styleable.CPDFToolBar_tools_toolbar_bota_icon, R.drawable.tools_ic_bookmark);
-            if (boTaIconDrawable != null) {
-                ivToolBarBoTaBtn.setImageDrawable(boTaIconDrawable);
-            }
-            Drawable moreIconDrawable = CViewUtils.loadDrawableFromAttributes(getContext(), typedArray, R.styleable.CPDFToolBar_tools_toolbar_more_icon, R.drawable.tools_ic_more);
-            if (moreIconDrawable != null) {
-                ivToolBarMoreBtn.setImageDrawable(moreIconDrawable);
-            }
             CViewUtils.applyViewBackground(this);
             typedArray.recycle();
         }
@@ -163,8 +130,6 @@ public class CPDFToolBar extends FrameLayout {
 
     public void addMode(CPreviewMode previewMode) {
         previewModes.add(previewMode);
-        currentPreviewMode = previewMode;
-        tvToolBarTitle.setText(previewMode.getTitleByMode());
         if (previewModes.size() > 1) {
             Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.tools_ic_syas_arrow);
             if (drawable != null) {
@@ -180,39 +145,17 @@ public class CPDFToolBar extends FrameLayout {
         return currentPreviewMode;
     }
 
-    public AppCompatImageView getBoTaButton() {
-        return ivToolBarBoTaBtn;
-    }
-
-    public AppCompatImageView getMoreButton() {
-        return ivToolBarMoreBtn;
-    }
-
-    public AppCompatImageView getSearchButton() {
-        return ivToolBarSearchBtn;
-    }
-
-    public AppCompatImageView getThumbnailButton() {
-        return ivToolBarThumbnail;
-    }
-
-    public void setSearchBtnClickListener(View.OnClickListener clickListener) {
-        ivToolBarSearchBtn.setOnClickListener(clickListener);
-    }
-
-    public void setBoTaBtnClickListener(View.OnClickListener clickListener) {
-        ivToolBarBoTaBtn.setOnClickListener(clickListener);
-    }
-
-    public void setThumbnailBtnClickListener(View.OnClickListener clickListener) {
-        ivToolBarThumbnail.setOnClickListener(clickListener);
+    public void addAction(@DrawableRes int drawableResId, View.OnClickListener listener){
+        View itemView = LayoutInflater.from(getContext()).inflate(R.layout.tools_cpdf_tool_bar_pdf_view_menu_action, null);
+        AppCompatImageView actionView =itemView.findViewById(R.id.iv_action);
+        actionView.setImageResource(drawableResId);
+        actionView.setOnClickListener(listener);
+        if (llMenu != null) {
+            llMenu.addView(itemView);
+        }
     }
 
     public void setPreviewModeChangeListener(CModeSwitchDialogFragment.OnPreviewModeChangeListener changeListener) {
         this.changeListener = changeListener;
     }
-
-    public void setMoreBtnClickListener(OnClickListener moreBtnClickListener) {
-        this.moreBtnClickListener = moreBtnClickListener;
-    }
 }

+ 6 - 6
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/pdfstyle/manager/provider/CEditSelectionsProvider.java

@@ -59,7 +59,8 @@ public class CEditSelectionsProvider implements CStyleProvider {
                 } else if (type == CAnnotStyle.EditUpdatePropertyType.TextColor) {
                     textSelections.setColor(style.getTextColor());
                 } else if (type == CAnnotStyle.EditUpdatePropertyType.TextColorOpacity) {
-                    textSelections.setTransparancy(style.getTextColorOpacity() / 255.0f);
+                    textSelections.setTransparancy(style.getTextColorOpacity());
+
                 } else if (type == CAnnotStyle.EditUpdatePropertyType.Italic) {
                     textSelections.setItalic(style.isFontItalic());
                 } else if (type == CAnnotStyle.EditUpdatePropertyType.Bold) {
@@ -86,7 +87,7 @@ public class CEditSelectionsProvider implements CStyleProvider {
                     }
                 } else {
                     textSelections.setColor(style.getTextColor());
-                    textSelections.setTransparancy(style.getTextColorOpacity() / 255.0f);
+                    textSelections.setTransparancy(style.getTextColorOpacity());
                     textSelections.setBold(style.isFontBold());
                     textSelections.setItalic(style.isFontItalic());
                     textSelections.setFontSize(style.getFontSize());
@@ -157,7 +158,7 @@ public class CEditSelectionsProvider implements CStyleProvider {
                         break;
                     default:
                         if (pageView != null) {
-                            pageView.operateEditImageArea(CPDFPageView.EditImageFuncType.TRANCPARENCY, style.getOpacity() / 255F);
+                            pageView.operateEditImageArea(CPDFPageView.EditImageFuncType.TRANCPARENCY, (float)style.getOpacity());
                         }
                         break;
                 }
@@ -171,7 +172,7 @@ public class CEditSelectionsProvider implements CStyleProvider {
         CAnnotStyle style = new CAnnotStyle(type);
         if (selections != null && selections instanceof CPDFEditTextSelections) {
             CPDFEditTextSelections textSelections = (CPDFEditTextSelections) selections;
-            style.setTextColorOpacity((int) (textSelections.getTransparancy() * 255));
+            style.setTextColorOpacity((int) (textSelections.getTransparancy()));
             style.setFontBold(textSelections.isBold());
             style.setFontItalic(textSelections.isItalic());
             style.setOpacity(255);
@@ -204,8 +205,7 @@ public class CEditSelectionsProvider implements CStyleProvider {
             CPDFEditArea editArea = pageView.getCurrentEditArea();
             if (editArea != null && editArea instanceof CPDFEditImageArea) {
                 float transparency = ((CPDFEditImageArea)editArea).getTransparency();
-                double opacity = Math.ceil( transparency * 255);
-                style.setOpacity((int) opacity);
+                style.setOpacity((int) transparency);
             } else {
                 style.setOpacity(255);
             }

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

@@ -3,13 +3,23 @@ package com.compdfkit.tools.common.views.pdfview;
 import com.compdfkit.tools.R;
 
 public enum CPreviewMode {
-    Viewer,
-    Annotation,
-    Edit,
-    Form,
-    PageEdit,
+    Viewer("viewer"),
 
-    Signature;
+    Annotation("annotations"),
+
+    Edit("contentEditor"),
+
+    Form("forms"),
+
+    PageEdit("pageEdit"),
+
+    Signature("digitalSignatures");
+
+    public String alias;
+
+    CPreviewMode(String alias){
+        this.alias = alias;
+    }
 
     public int getTitleByMode() {
         switch (this) {
@@ -27,4 +37,17 @@ public enum CPreviewMode {
                 return R.string.tools_pdf_viewer_mode;
         }
     }
+
+    public static CPreviewMode fromAlias(String alias){
+        try{
+            for (CPreviewMode value : CPreviewMode.values()) {
+                if (value.alias.equalsIgnoreCase(alias)){
+                    return value;
+                }
+            }
+        }catch (Exception e){
+            return null;
+        }
+        return null;
+    }
 }

+ 3 - 2
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/contenteditor/CEditToolbar.java

@@ -15,6 +15,7 @@ import android.view.View;
 import android.widget.RelativeLayout;
 
 import com.compdfkit.core.edit.CPDFEditManager;
+import com.compdfkit.core.edit.CPDFEditPage;
 import com.compdfkit.core.edit.OnEditStatusChangeListener;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
@@ -110,7 +111,7 @@ public class CEditToolbar extends RelativeLayout implements View.OnClickListener
         } else if (!ivEditText.isSelected() && ivEditImage.isSelected()) {
             pdfView.getCPdfReaderView().getEditManager().changeEditType(CPDFEditPage.LoadImage);
         } else if (!ivEditText.isSelected() && !ivEditImage.isSelected()) {
-            pdfView.getCPdfReaderView().getEditManager().changeEditType(CPDFEditPage.LoadTextImage);
+            pdfView.getCPdfReaderView().getEditManager().changeEditType(4);
         }
     }
 
@@ -174,7 +175,7 @@ public class CEditToolbar extends RelativeLayout implements View.OnClickListener
                 } else if (type == CPDFEditPage.LoadImage) {
                     ivEditText.setSelected(false);
                     ivEditImage.setSelected(true);
-                } else if (type == CPDFEditPage.LoadTextImage) {
+                } else if (type == 4) {
                     ivEditText.setSelected(false);
                     ivEditImage.setSelected(false);
                 }

+ 0 - 21
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/contenteditor/CPDFEditPage.java

@@ -1,21 +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.contenteditor;
-
-
-public class CPDFEditPage {
-    public static final int LoadUnknown = 0;
-
-    public static final int LoadText = com.compdfkit.core.edit.CPDFEditPage.LoadText;
-
-    public static final int LoadImage = com.compdfkit.core.edit.CPDFEditPage.LoadImage;
-
-    public static final int LoadTextImage = LoadText | LoadImage;
-}

+ 14 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/forms/pdfproperties/pdfsign/SignatureWidgetImpl.java

@@ -33,6 +33,7 @@ import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleMan
 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.importcert.create.CSelectSignTypeDialog;
 import com.compdfkit.tools.signature.info.CertDigitalSignInfoDialog;
 import com.compdfkit.tools.signature.preview.CDigitalSignStylePreviewDialog;
 import com.compdfkit.ui.proxy.form.CPDFSignatureWidgetImpl;
@@ -58,7 +59,19 @@ public class SignatureWidgetImpl extends CPDFSignatureWidgetImpl {
     public void onSignatureWidgetFocused(CPDFSignatureWidget cpdfSignatureWidget) {
         if (!cpdfSignatureWidget.isSigned()) {
             // unsigned
-            fillDigitalSign(cpdfSignatureWidget);
+            // select signature type
+            CSelectSignTypeDialog signTypeDialog = CSelectSignTypeDialog.newInstance();
+            signTypeDialog.setSelectSignaturesTypeListener(type -> {
+                signTypeDialog.dismiss();
+                if (type == CSelectSignTypeDialog.SignatureType.ElectronicSignature){
+                    fillElectronicSignature();
+                }else {
+                    fillDigitalSign(cpdfSignatureWidget);
+                }
+            });
+            if (readerView.getContext() instanceof FragmentActivity) {
+                signTypeDialog.show(((FragmentActivity) readerView.getContext()).getSupportFragmentManager(), "selectSignType");
+            }
             return;
         }
 

+ 4 - 3
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CDocumentEncryptionDialog.java

@@ -159,7 +159,6 @@ public class CDocumentEncryptionDialog extends CBasicBottomSheetDialogFragment i
 
     @Override
     protected void onViewCreate() {
-        initPermissionInfo();
         toolBar.setBackBtnClickListener(this);
         btnDone.setOnClickListener(this);
         ivUserPwdVisible.setOnClickListener(this);
@@ -183,9 +182,9 @@ public class CDocumentEncryptionDialog extends CBasicBottomSheetDialogFragment i
 
             }
         });
-        algorithmSpinnerAdapter = new CEncryptAlgorithmSpinnerAdapter(getContext());
+        algorithmSpinnerAdapter = new CEncryptAlgorithmSpinnerAdapter(getContext(), document.getEncryptAlgorithm());
         levelSpinner.setAdapter(algorithmSpinnerAdapter);
-
+        levelSpinner.setSelection(algorithmSpinnerAdapter.getSelectEncryptAlgoIndex());
         levelSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@@ -197,6 +196,8 @@ public class CDocumentEncryptionDialog extends CBasicBottomSheetDialogFragment i
 
             }
         });
+        initPermissionInfo();
+
     }
 
     @Override

+ 6 - 4
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/security/encryption/CEncryptAlgorithmSpinnerAdapter.java

@@ -34,9 +34,11 @@ class CEncryptAlgorithmSpinnerAdapter extends BaseAdapter {
 
     private CPDFDocument.PDFDocumentEncryptAlgo encryptAlgo;
 
-    public CEncryptAlgorithmSpinnerAdapter(@NonNull Context context) {
-        encryptAlgo = CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentRC4;
-        this.list = Arrays.asList(CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentRC4,
+    public CEncryptAlgorithmSpinnerAdapter(@NonNull Context context, CPDFDocument.PDFDocumentEncryptAlgo encryptAlgo) {
+        this.encryptAlgo = encryptAlgo;
+        this.list = Arrays.asList(
+                CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentNoEncryptAlgo,
+                CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentRC4,
                 CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentAES128,
                 CPDFDocument.PDFDocumentEncryptAlgo.PDFDocumentAES256);
         mContext = context;
@@ -103,7 +105,7 @@ class CEncryptAlgorithmSpinnerAdapter extends BaseAdapter {
             case PDFDocumentAES256:
                 return context.getString(R.string.tools_encryption_256_aes);
             case PDFDocumentNoEncryptAlgo:
-                return context.getString(R.string.tools_encryption_128_aes);
+                return context.getString(R.string.tools_encryption_no_encryption);
             default:
                 return context.getString(R.string.tools_encryption_128_aes);
         }

+ 101 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/importcert/create/CSelectSignTypeDialog.java

@@ -0,0 +1,101 @@
+/**
+ * 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 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;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.RadioGroup;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+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.CPermissionUtil;
+import com.compdfkit.tools.signature.interfaces.COnSelectCertFileListener;
+
+public class CSelectSignTypeDialog extends DialogFragment implements View.OnClickListener {
+
+    public enum SignatureType{
+
+        ElectronicSignature,
+
+        DigitalSignature;
+    }
+
+    private RadioGroup rgType;
+
+    private CSelectSignaturesTypeListener selectSignaturesTypeListener;
+
+    public static CSelectSignTypeDialog newInstance() {
+        Bundle args = new Bundle();
+        CSelectSignTypeDialog fragment = new CSelectSignTypeDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NO_TITLE, R.style.tools_dialog_theme);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        if (getDialog() != null && getDialog().getWindow() != null) {
+            getDialog().getWindow().setBackgroundDrawableResource(R.drawable.tools_dialog_background);
+        }
+        View view = inflater.inflate(R.layout.tools_sign_select_sign_type_dialog, container, false);
+        rgType = view.findViewById(R.id.rg_type);
+        Button btnCancel = view.findViewById(R.id.btn_cancel);
+        Button btnDone = view.findViewById(R.id.btn_confirm);
+        btnCancel.setOnClickListener(this);
+        btnDone.setOnClickListener(this);
+        return view;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.btn_cancel) {
+            dismiss();
+        } else if (v.getId() == R.id.btn_confirm) {
+            if (selectSignaturesTypeListener != null) {
+                selectSignaturesTypeListener.signatureType(rgType.getCheckedRadioButtonId() == R.id.rb_electronic_signature ? SignatureType.ElectronicSignature : SignatureType.DigitalSignature);
+            }
+        }
+    }
+
+    public void setSelectSignaturesTypeListener(CSelectSignaturesTypeListener selectSignaturesTypeListener) {
+        this.selectSignaturesTypeListener = selectSignaturesTypeListener;
+    }
+
+    public interface CSelectSignaturesTypeListener{
+        void signatureType(SignatureType type);
+    }
+}
+
+

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/signature/preview/CDigitalSignStylePreviewDialog.java

@@ -285,7 +285,7 @@ public class CDigitalSignStylePreviewDialog extends CBasicBottomSheetDialogFragm
                 return;
             }
             Bitmap bitmap = previewView.getBitmap();
-            String imagePath = CSignatureDatas.saveSignatureBitmap(getContext(), bitmap);
+            String imagePath = CSignatureDatas.saveDigitalSignatureBitmap(getContext(), bitmap);
             if (resultDigitalSignListener != null) {
                 resultDigitalSignListener.sign(imagePath, previewView.getConfig(), previewView.getLocation(), previewView.getReason());
             }

+ 48 - 53
ComPDFKit_Tools/src/main/res/layout/tools_cpdf_security_document_encryption_dialog.xml

@@ -48,7 +48,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginStart="16dp"
                 android:layout_marginTop="16dp"
-                android:text="@string/tools_set_password"
+                android:text="@string/tools_password_to_open_the_document"
                 android:textColor="@color/tools_text_color_primary"
                 android:textStyle="bold"
                 app:layout_constraintStart_toStartOf="parent"
@@ -75,36 +75,27 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/tv_setting_password_title" />
 
-            <androidx.appcompat.widget.AppCompatTextView
-                android:id="@+id/tv_enter_password"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="16dp"
-                android:layout_marginTop="16dp"
-                android:text="@string/tools_enter_password"
-                android:textColor="@color/tools_text_color_hint"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/line1" />
 
             <androidx.appcompat.widget.AppCompatEditText
                 android:id="@+id/et_user_password"
                 android:layout_width="0dp"
                 android:layout_height="35dp"
                 android:layout_marginStart="8dp"
+                android:layout_marginTop="8dp"
                 android:background="@null"
                 android:enabled="false"
-                android:gravity="end|center_vertical"
-                android:hint="@string/tools_please_enter_the_password"
+                android:gravity="center_vertical"
+                android:hint="@string/tools_set_password"
                 android:inputType="textPassword"
                 android:maxLines="1"
-                android:textSize="13sp"
+                android:paddingStart="8dp"
                 android:textColorHint="@color/tools_text_color_hint"
+                android:textSize="13sp"
                 app:layout_constrainedWidth="true"
-                app:layout_constraintBottom_toBottomOf="@id/tv_enter_password"
                 app:layout_constraintEnd_toStartOf="@id/iv_user_pwd_show"
                 app:layout_constraintHorizontal_bias="1"
-                app:layout_constraintStart_toEndOf="@id/tv_enter_password"
-                app:layout_constraintTop_toTopOf="@id/tv_enter_password" />
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/line1" />
 
             <androidx.appcompat.widget.AppCompatImageView
                 android:id="@+id/iv_user_pwd_show"
@@ -121,9 +112,9 @@
                 android:id="@+id/line2"
                 android:layout_width="match_parent"
                 android:layout_height="28dp"
-                android:layout_marginTop="16dp"
+                android:layout_marginTop="8dp"
                 android:background="@color/tools_reader_setting_head_bg_color"
-                app:layout_constraintTop_toBottomOf="@id/tv_enter_password" />
+                app:layout_constraintTop_toBottomOf="@id/et_user_password" />
 
 
             <androidx.appcompat.widget.AppCompatTextView
@@ -132,7 +123,7 @@
                 android:layout_height="wrap_content"
                 android:layout_marginStart="16dp"
                 android:layout_marginTop="16dp"
-                android:text="@string/tools_setting_permission_password"
+                android:text="@string/tools_owner_password"
                 android:textColor="@color/tools_text_color_primary"
                 android:textStyle="bold"
                 app:layout_constraintStart_toStartOf="parent"
@@ -159,36 +150,37 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/sw_setting_permission_password" />
 
-            <androidx.appcompat.widget.AppCompatTextView
-                android:id="@+id/tv_enter_permission_password"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="16dp"
-                android:layout_marginTop="16dp"
-                android:text="@string/tools_enter_password"
-                android:textColor="@color/tools_text_color_hint"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/line3" />
-
             <androidx.appcompat.widget.AppCompatEditText
                 android:id="@+id/et_owner_password"
                 android:layout_width="0dp"
                 android:layout_height="35dp"
                 android:layout_marginStart="8dp"
+                android:layout_marginTop="8dp"
                 android:background="@null"
                 android:enabled="false"
-                android:gravity="end|center_vertical"
-                android:hint="@string/tools_please_enter_owner_password"
+                android:gravity="center_vertical"
+                android:hint="@string/tools_set_password"
                 android:inputType="textPassword"
                 android:maxLines="1"
-                android:textSize="13sp"
+                android:paddingStart="8dp"
                 android:textColorHint="@color/tools_text_color_hint"
+                android:textSize="13sp"
                 app:layout_constrainedWidth="true"
-                app:layout_constraintBottom_toBottomOf="@id/tv_enter_permission_password"
                 app:layout_constraintEnd_toStartOf="@id/iv_owner_pwd_show"
                 app:layout_constraintHorizontal_bias="1"
-                app:layout_constraintStart_toEndOf="@id/tv_enter_permission_password"
-                app:layout_constraintTop_toTopOf="@id/tv_enter_permission_password" />
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/line3" />
+
+            <View
+                android:id="@+id/line4"
+                android:layout_width="match_parent"
+                android:layout_height="0.5dp"
+                android:layout_marginHorizontal="8dp"
+                android:layout_marginTop="8dp"
+                android:background="@color/tools_item_dividing_line_color"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/et_owner_password" />
 
             <androidx.appcompat.widget.AppCompatImageView
                 android:id="@+id/iv_owner_pwd_show"
@@ -202,24 +194,12 @@
                 app:srcCompat="@drawable/tools_btn_eyes_visible_selector" />
 
 
-            <androidx.appcompat.widget.AppCompatTextView
-                android:id="@+id/tv_owner_functions"
-                android:layout_width="match_parent"
-                android:layout_height="28dp"
-                android:layout_marginTop="8dp"
-                android:background="@color/tools_reader_setting_head_bg_color"
-                android:gravity="center_vertical"
-                android:paddingStart="16dp"
-                android:paddingEnd="16dp"
-                android:textColor="@color/tools_text_color_disable"
-                android:textSize="11sp"
-                app:layout_constraintTop_toBottomOf="@id/et_owner_password" />
-
             <androidx.appcompat.widget.AppCompatCheckBox
                 android:id="@+id/cb_print"
                 android:layout_width="0dp"
                 android:layout_height="45dp"
                 android:layout_marginStart="16dp"
+                android:layout_marginTop="12dp"
                 android:layout_marginEnd="16dp"
                 android:button="@drawable/tools_ic_digital_sign_checkbox"
                 android:enabled="false"
@@ -229,7 +209,7 @@
                 android:textColor="@color/tools_text_color_disable"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/tv_owner_functions" />
+                app:layout_constraintTop_toBottomOf="@id/et_owner_password" />
 
             <androidx.appcompat.widget.AppCompatCheckBox
                 android:id="@+id/cb_copy"
@@ -247,6 +227,20 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/cb_print" />
 
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/tv_owner_functions"
+                android:layout_width="match_parent"
+                android:layout_height="28dp"
+                android:layout_marginTop="8dp"
+                android:background="@color/tools_reader_setting_head_bg_color"
+                android:gravity="center_vertical"
+                android:paddingStart="16dp"
+                android:paddingEnd="16dp"
+                android:textColor="@color/tools_text_color_disable"
+                android:textSize="11sp"
+                app:layout_constraintTop_toBottomOf="@id/cb_copy" />
+
+
             <androidx.appcompat.widget.AppCompatTextView
                 android:id="@+id/tv_encryption_level"
                 android:layout_width="wrap_content"
@@ -256,7 +250,7 @@
                 android:text="@string/tools_encryption_level"
                 android:textColor="@color/tools_text_color_primary"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/cb_copy" />
+                app:layout_constraintTop_toBottomOf="@id/tv_owner_functions" />
 
             <LinearLayout
                 android:layout_width="wrap_content"
@@ -273,7 +267,8 @@
 
                 <androidx.appcompat.widget.AppCompatSpinner
                     android:id="@+id/spinner_cryptographic_level"
-                    android:layout_width="170dp"
+                    android:layout_width="wrap_content"
+                    android:minWidth="170dp"
                     android:layout_height="match_parent"
                     android:dropDownSelector="@color/tools_color_primary"
                     android:popupBackground="@drawable/tools_common_window_bg" />

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

@@ -10,7 +10,7 @@
     tools:layout_height="?android:attr/actionBarSize">
 
     <include
-        android:id="@+id/cl_menu"
+        android:id="@+id/ll_menu"
         layout="@layout/tools_cpdf_tool_bar_pdf_view_menu_layout"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"

+ 24 - 0
ComPDFKit_Tools/src/main/res/layout/tools_cpdf_tool_bar_pdf_view_menu_action.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <androidx.appcompat.widget.AppCompatImageView xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/iv_action"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_marginVertical="10dp"
+        android:layout_marginHorizontal="4dp"
+        android:background="@drawable/tools_common_oval_ripple"
+        android:clickable="true"
+        android:focusable="true"
+        android:padding="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintDimensionRatio="1:1"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/tools_ic_thumbnail"
+        app:tint="@color/tools_icon_status_color" />
+</FrameLayout>
+
+

+ 67 - 64
ComPDFKit_Tools/src/main/res/layout/tools_cpdf_tool_bar_pdf_view_menu_layout.xml

@@ -1,76 +1,79 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     style="@style/Tools_Base_Theme"
-    android:layout_width="match_parent"
+    android:layout_width="wrap_content"
+    android:orientation="horizontal"
+    android:id="@+id/ll_menu"
+    android:gravity="center_vertical"
     android:layout_height="?android:attr/actionBarSize"
+    android:layout_gravity="center_vertical"
     android:theme="@style/Tools_Base_Theme">
 
+<!--    <androidx.appcompat.widget.AppCompatImageView-->
+<!--        android:id="@+id/iv_tool_bar_thumbnail"-->
+<!--        android:layout_width="40dp"-->
+<!--        android:layout_height="40dp"-->
+<!--        android:layout_margin="10dp"-->
+<!--        android:background="@drawable/tools_common_oval_ripple"-->
+<!--        android:clickable="true"-->
+<!--        android:focusable="true"-->
+<!--        android:padding="8dp"-->
+<!--        app:layout_constraintBottom_toBottomOf="parent"-->
+<!--        app:layout_constraintDimensionRatio="1:1"-->
+<!--        app:layout_constraintEnd_toStartOf="@id/iv_tool_bar_search"-->
+<!--        app:layout_constraintTop_toTopOf="parent"-->
+<!--        app:srcCompat="@drawable/tools_ic_thumbnail"-->
+<!--        app:tint="@color/tools_icon_status_color" />-->
 
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/iv_tool_bar_thumbnail"
-        android:layout_width="40dp"
-        android:layout_height="40dp"
-        android:layout_margin="10dp"
-        android:background="@drawable/tools_common_oval_ripple"
-        android:clickable="true"
-        android:focusable="true"
-        android:padding="8dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintDimensionRatio="1:1"
-        app:layout_constraintEnd_toStartOf="@id/iv_tool_bar_search"
-        app:layout_constraintTop_toTopOf="parent"
-        app:srcCompat="@drawable/tools_ic_thumbnail"
-        app:tint="@color/tools_icon_status_color" />
 
+<!--    <androidx.appcompat.widget.AppCompatImageView-->
+<!--        android:id="@+id/iv_tool_bar_search"-->
+<!--        android:layout_width="40dp"-->
+<!--        android:layout_height="40dp"-->
+<!--        android:layout_margin="10dp"-->
+<!--        android:background="@drawable/tools_common_oval_ripple"-->
+<!--        android:clickable="true"-->
+<!--        android:focusable="true"-->
+<!--        android:padding="8dp"-->
+<!--        app:layout_constraintBottom_toBottomOf="parent"-->
+<!--        app:layout_constraintDimensionRatio="1:1"-->
+<!--        app:layout_constraintEnd_toStartOf="@id/iv_tool_bar_bota"-->
+<!--        app:layout_constraintTop_toTopOf="parent"-->
+<!--        app:srcCompat="@drawable/tools_ic_search"-->
+<!--        app:tint="@color/tools_icon_status_color" />-->
 
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/iv_tool_bar_search"
-        android:layout_width="40dp"
-        android:layout_height="40dp"
-        android:layout_margin="10dp"
-        android:background="@drawable/tools_common_oval_ripple"
-        android:clickable="true"
-        android:focusable="true"
-        android:padding="8dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintDimensionRatio="1:1"
-        app:layout_constraintEnd_toStartOf="@id/iv_tool_bar_bota"
-        app:layout_constraintTop_toTopOf="parent"
-        app:srcCompat="@drawable/tools_ic_search"
-        app:tint="@color/tools_icon_status_color" />
+<!--    <androidx.appcompat.widget.AppCompatImageView-->
+<!--        android:id="@+id/iv_tool_bar_bota"-->
+<!--        android:layout_width="40dp"-->
+<!--        android:layout_height="40dp"-->
+<!--        android:layout_margin="10dp"-->
+<!--        android:background="@drawable/tools_common_oval_ripple"-->
+<!--        android:clickable="true"-->
+<!--        android:focusable="true"-->
+<!--        android:padding="8dp"-->
+<!--        app:layout_constraintBottom_toBottomOf="parent"-->
+<!--        app:layout_constraintDimensionRatio="1:1"-->
+<!--        app:layout_constraintEnd_toStartOf="@id/iv_tool_bar_more"-->
+<!--        app:layout_constraintTop_toTopOf="parent"-->
+<!--        app:srcCompat="@drawable/tools_ic_bookmark"-->
+<!--        app:tint="@color/tools_icon_status_color" />-->
 
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/iv_tool_bar_bota"
-        android:layout_width="40dp"
-        android:layout_height="40dp"
-        android:layout_margin="10dp"
-        android:background="@drawable/tools_common_oval_ripple"
-        android:clickable="true"
-        android:focusable="true"
-        android:padding="8dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintDimensionRatio="1:1"
-        app:layout_constraintEnd_toStartOf="@id/iv_tool_bar_more"
-        app:layout_constraintTop_toTopOf="parent"
-        app:srcCompat="@drawable/tools_ic_bookmark"
-        app:tint="@color/tools_icon_status_color" />
+<!--    <androidx.appcompat.widget.AppCompatImageView-->
+<!--        android:id="@+id/iv_tool_bar_more"-->
+<!--        android:layout_width="40dp"-->
+<!--        android:layout_height="40dp"-->
+<!--        android:layout_margin="10dp"-->
+<!--        android:background="@drawable/tools_common_oval_ripple"-->
+<!--        android:clickable="true"-->
+<!--        android:focusable="true"-->
+<!--        android:padding="8dp"-->
+<!--        app:layout_constraintBottom_toBottomOf="parent"-->
+<!--        app:layout_constraintDimensionRatio="1:1"-->
+<!--        app:layout_constraintEnd_toEndOf="parent"-->
+<!--        app:layout_constraintTop_toTopOf="parent"-->
+<!--        app:srcCompat="@drawable/tools_ic_more"-->
+<!--        app:tint="@color/tools_icon_status_color" />-->
 
-    <androidx.appcompat.widget.AppCompatImageView
-        android:id="@+id/iv_tool_bar_more"
-        android:layout_width="40dp"
-        android:layout_height="40dp"
-        android:layout_margin="10dp"
-        android:background="@drawable/tools_common_oval_ripple"
-        android:clickable="true"
-        android:focusable="true"
-        android:padding="8dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintDimensionRatio="1:1"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:srcCompat="@drawable/tools_ic_more"
-        app:tint="@color/tools_icon_status_color" />
 
-
-</androidx.constraintlayout.widget.ConstraintLayout>
+</LinearLayout>

+ 92 - 0
ComPDFKit_Tools/src/main/res/layout/tools_sign_select_sign_type_dialog.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="@dimen/tools_dialog_layout_width"
+        android:layout_height="wrap_content"
+        android:paddingTop="24dp"
+        android:paddingBottom="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:layout_marginHorizontal="24dp"
+            android:textColor="@color/tools_text_color_primary"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:textSize="16sp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            android:text="@string/tools_select_sign_type" />
+
+
+        <RadioGroup
+            android:id="@+id/rg_type"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:layout_marginHorizontal="24dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_title"
+            app:layout_constraintStart_toStartOf="parent"
+             >
+
+            <androidx.appcompat.widget.AppCompatRadioButton
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:id="@+id/rb_electronic_signature"
+                android:checked="true"
+                android:textColor="@color/tools_text_color_primary"
+                android:text="@string/tools_sign_with_electronic_signatures"
+                />
+
+            <androidx.appcompat.widget.AppCompatRadioButton
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:id="@+id/rb_digital_signature"
+                android:layout_marginTop="8dp"
+                android:textColor="@color/tools_text_color_primary"
+                android:text="@string/tools_sign_with_digital_signatures"
+                />
+
+        </RadioGroup>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="end"
+            android:layout_marginTop="12dp"
+            android:orientation="horizontal"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/rg_type">
+
+            <Button
+                android:id="@+id/btn_cancel"
+                style="@style/tools_dialog_button_style"
+                android:background="@drawable/tools_common_btn_corner_ripple"
+                android:text="@string/tools_cancel"
+                tools:textColor="@color/tools_normal_btn_text_color" />
+
+            <Button
+                android:id="@+id/btn_confirm"
+                style="@style/tools_dialog_button_style"
+                android:background="@drawable/tools_common_btn_corner_ripple"
+                android:text="@string/tools_okay"
+                tools:textColor="@color/tools_normal_btn_text_color" />
+
+        </LinearLayout>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 7 - 1
ComPDFKit_Tools/src/main/res/values-zh-rCN/tools_strings.xml

@@ -422,6 +422,7 @@
     <string name="tools_set_password_failures">密码设置失败!</string>
     <string name="tools_password_remove_success">密码已移除!</string>
     <string name="tools_password_remove_fail">密码移除失败!</string>
+    <string name="tools_encryption_no_encryption">无加密级别</string>
 
     <string name="tools_watermark_removed_success">水印已移除!</string>
     <string name="tools_watermark_removed_failed">水印移除失败!</string>
@@ -439,7 +440,10 @@
 
     <string name="tools_security_settings">安全设置</string>
     <string name="tools_set_password">设置密码</string>
+    <string name="tools_password_to_open_the_document">Password to Open the Document</string>
     <string name="tools_enter_password">请输入密码</string>
+    <string name="tools_owner_password">权限</string>
+
     <string name="tools_enter_password_can_not_be_empty">密码不能为空。</string>
     <string name="tools_please_enter_owner_password">请输入权限密码</string>
     <string name="tools_restrict_document_printing">禁止打印</string>
@@ -453,5 +457,7 @@
     <string name="tools_save_success">保存成功</string>
 
     <string name="tools_signature_date_pattern">yyyy-MM-dd HH:mm:ss</string>
-
+    <string name="tools_select_sign_type">请选择签名类型</string>
+    <string name="tools_sign_with_electronic_signatures">电子签名</string>
+    <string name="tools_sign_with_digital_signatures">数字签名(数字证书签署)</string>
 </resources>

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

@@ -5,9 +5,6 @@
 
     <declare-styleable name="CPDFToolBar" tools:ignore="ResourceName">
         <attr name="android:title"/>
-        <attr name="tools_toolbar_search_icon" format="reference"/>
-        <attr name="tools_toolbar_bota_icon" format="reference"/>
-        <attr name="tools_toolbar_more_icon" format="reference"/>
     </declare-styleable>
 
     <declare-styleable name="CToolBar" tools:ignore="ResourceName">

+ 6 - 1
ComPDFKit_Tools/src/main/res/values/tools_strings.xml

@@ -441,12 +441,15 @@
 
     <string name="tools_security_settings">Security Settings</string>
     <string name="tools_set_password">Set Passwords</string>
+    <string name="tools_password_to_open_the_document">Password to Open the Document</string>
     <string name="tools_enter_password">Enter the Password</string>
+    <string name="tools_owner_password">Owner Password</string>
     <string name="tools_enter_password_can_not_be_empty">The password can\'t be empty.</string>
     <string name="tools_please_enter_owner_password">Please enter the owner\'s password</string>
     <string name="tools_restrict_document_printing">Restrict document printing</string>
     <string name="tools_restrict_content_copying">Restrict content copying</string>
     <string name="tools_encryption_level">Encryption Level</string>
+    <string name="tools_encryption_no_encryption">No Encryption</string>
     <string name="tools_encryption_rc4" translatable="false">128-bit RC4</string>
     <string name="tools_encryption_128_aes" translatable="false">128-bit AES</string>
     <string name="tools_encryption_256_aes" translatable="false">256-bit AES</string>
@@ -460,5 +463,7 @@
     <!--    Security Mode End-->
     <string name="tools_also_entrypts_the_followint_fuctions">Also Encrypts the following functions</string>
     <string name="tools_signature_date_pattern">dd MMMM yyyy HH:mm:ss</string>
-
+    <string name="tools_select_sign_type">Select Signature Type</string>
+    <string name="tools_sign_with_electronic_signatures">Sign with Electronic Signatures</string>
+    <string name="tools_sign_with_digital_signatures">Sign with Digital Signatures</string>
 </resources>

Файловите разлики са ограничени, защото са твърде много
+ 1 - 4
ContentEditor/src/main/AndroidManifest.xml


+ 15 - 17
ContentEditor/src/main/java/com/compdfkit/contenteditor/PDFEditSampleActivity.java

@@ -25,6 +25,7 @@ import androidx.annotation.Nullable;
 
 import com.compdfkit.contenteditor.databinding.EditPdfSampleActivityBinding;
 import com.compdfkit.core.edit.CPDFEditManager;
+import com.compdfkit.core.edit.CPDFEditPage;
 import com.compdfkit.tools.common.basic.activity.CBasicPDFActivity;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.utils.CFileUtils;
@@ -42,7 +43,6 @@ import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleDialogFragm
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleManager;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
-import com.compdfkit.tools.contenteditor.CPDFEditPage;
 import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
 import com.compdfkit.ui.reader.CPDFPageView;
 import com.compdfkit.ui.reader.CPDFReaderView;
@@ -108,7 +108,16 @@ public class PDFEditSampleActivity extends CBasicPDFActivity {
 
     private void initToolbarListener() {
         binding.pdfToolBar.addMode(CPreviewMode.Edit);
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
+            CPDFBotaDialogFragment botaDialogFragment = CPDFBotaDialogFragment.newInstance();
+            botaDialogFragment.initWithPDFView(binding.pdfView);
+            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
+            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
+            tabs.add(thumbnailTabs);
+            botaDialogFragment.setBotaDialogTabs(tabs);
+            botaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
+        });
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
             CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
             if (editManager.isEditMode()) {
                 curEditMode = binding.pdfView.getCPdfReaderView().getLoadType();
@@ -118,8 +127,7 @@ public class PDFEditSampleActivity extends CBasicPDFActivity {
             binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
             binding.pdfSearchToolBar.showKeyboard();
         });
-
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
             //Show a fragment of the PDF thumbnail and a dialog fragment of the PDF outline list.
             CPDFBotaDialogFragment botaDialogFragment = CPDFBotaDialogFragment.newInstance();
             botaDialogFragment.initWithPDFView(binding.pdfView);
@@ -131,17 +139,7 @@ public class PDFEditSampleActivity extends CBasicPDFActivity {
             botaDialogFragment.setBotaDialogTabs(tabs);
             botaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
         });
-
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
-            CPDFBotaDialogFragment botaDialogFragment = CPDFBotaDialogFragment.newInstance();
-            botaDialogFragment.initWithPDFView(binding.pdfView);
-            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
-            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
-            tabs.add(thumbnailTabs);
-            botaDialogFragment.setBotaDialogTabs(tabs);
-            botaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
-        });
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
             v.setSelected(true);
             //Show the PDF settings dialog fragment
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);
@@ -217,10 +215,10 @@ public class PDFEditSampleActivity extends CBasicPDFActivity {
         });
 
         binding.pdfSearchToolBar.setExitSearchListener(() -> {
-            if (curEditMode > 0) {
+            if (curEditMode > CPDFEditPage.LoadNone) {
                 CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
                 editManager.beginEdit(curEditMode);
-                curEditMode = 0;
+                curEditMode = CPDFEditPage.LoadNone;
             }
             binding.pdfToolBar.setVisibility(View.VISIBLE);
             binding.pdfSearchToolBar.setVisibility(View.GONE);

Файловите разлики са ограничени, защото са твърде много
+ 1 - 5
DigitalSignature/src/main/AndroidManifest.xml


+ 12 - 13
DigitalSignature/src/main/java/com/compdfkit/digitalsignature/PDFSignaturesSampleActivity.java

@@ -98,7 +98,16 @@ public class PDFSignaturesSampleActivity extends CBasicPDFActivity {
             binding.signatureToolBar.reset();
             resetContextMenu(binding.pdfView, mode);
         });
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
+            CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
+            boTaDialogFragment.initWithPDFView(binding.pdfView);
+            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
+            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
+            tabs.add(thumbnailTabs);
+            boTaDialogFragment.setBotaDialogTabs(tabs);
+            boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
+        });
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
             binding.pdfToolBar.setVisibility(View.GONE);
             binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
             binding.pdfSearchToolBar.showKeyboard();
@@ -106,7 +115,7 @@ public class PDFSignaturesSampleActivity extends CBasicPDFActivity {
             binding.signatureToolBar.reset();
         });
 
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
             //Show a fragment of the PDF thumbnail and a dialog fragment of the PDF outline list.
             CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
             boTaDialogFragment.initWithPDFView(binding.pdfView);
@@ -119,17 +128,7 @@ public class PDFSignaturesSampleActivity extends CBasicPDFActivity {
             boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
         });
 
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
-            CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
-            boTaDialogFragment.initWithPDFView(binding.pdfView);
-            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
-            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
-            tabs.add(thumbnailTabs);
-            boTaDialogFragment.setBotaDialogTabs(tabs);
-            boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
-        });
-
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
             v.setSelected(true);
             //Show the PDF settings dialog fragment
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);

Файловите разлики са ограничени, защото са твърде много
+ 1 - 4
DocsEditor/src/main/AndroidManifest.xml


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

@@ -87,12 +87,21 @@ public class MainActivity extends CBasicPDFActivity {
 
     private void initToolbarListener() {
         binding.pdfToolBar.addMode(CPreviewMode.PageEdit);
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
+            CPDFBotaDialogFragment botaDialogFragment = CPDFBotaDialogFragment.newInstance();
+            botaDialogFragment.initWithPDFView(binding.pdfView);
+            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
+            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
+            tabs.add(thumbnailTabs);
+            botaDialogFragment.setBotaDialogTabs(tabs);
+            botaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
+        });
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
             binding.pdfToolBar.setVisibility(View.GONE);
             binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
             binding.pdfSearchToolBar.showKeyboard();
         });
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
             //Show a fragment of the PDF thumbnail and a dialog fragment of the PDF outline list.
             CPDFBotaDialogFragment botaDialogFragment = CPDFBotaDialogFragment.newInstance();
             botaDialogFragment.initWithPDFView(binding.pdfView);
@@ -104,18 +113,7 @@ public class MainActivity extends CBasicPDFActivity {
             botaDialogFragment.setBotaDialogTabs(tabs);
             botaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
         });
-
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
-            CPDFBotaDialogFragment botaDialogFragment = CPDFBotaDialogFragment.newInstance();
-            botaDialogFragment.initWithPDFView(binding.pdfView);
-            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
-            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
-            tabs.add(thumbnailTabs);
-            botaDialogFragment.setBotaDialogTabs(tabs);
-            botaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
-        });
-
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
             v.setSelected(true);
             //Show the PDF settings dialog fragment
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);

Файловите разлики са ограничени, защото са твърде много
+ 1 - 5
Forms/src/main/AndroidManifest.xml


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

@@ -114,19 +114,22 @@ public class PDFFormSampleActivity extends CBasicPDFActivity {
             binding.formToolBar.reset();
             resetContextMenu(binding.pdfView, mode);
         });
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
-            binding.pdfToolBar.setVisibility(View.GONE);
-            binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
-            binding.pdfSearchToolBar.showKeyboard();
-        });
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
+
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
+
             CPDFBotaDialogFragment dialogFragment = CPDFBotaDialogFragment.newInstance();
             dialogFragment.initWithPDFView(binding.pdfView);
             CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
             dialogFragment.setBotaDialogTab(annotationTab);
             dialogFragment.show(getSupportFragmentManager(), "ThumbnailList");
         });
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
+            binding.pdfToolBar.setVisibility(View.GONE);
+            binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
+            binding.pdfSearchToolBar.showKeyboard();
+        });
+
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
             ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
             CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.ANNOTATION, getString(R.string.tools_annotations));
             CPDFBotaFragmentTabs outlineTab = new CPDFBotaFragmentTabs(CPDFBOTA.OUTLINE, getString(R.string.tools_outlines));
@@ -144,7 +147,7 @@ public class PDFFormSampleActivity extends CBasicPDFActivity {
             dialogFragment.setBotaDialogTabs(tabs);
             dialogFragment.show(getSupportFragmentManager(), "annotationList");
         });
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
             v.setSelected(true);
             //Show the PDF settings dialog fragment
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);

Файловите разлики са ограничени, защото са твърде много
+ 1 - 8
PDFViewer/src/main/AndroidManifest.xml


+ 27 - 0
PDFViewer/src/main/assets/configuration.json

@@ -0,0 +1,27 @@
+{
+  "modeConfig": {
+    "initialViewMode": "viewer"
+  },
+  "toolbarConfig": {
+    "androidAvailableActions": [
+      "thumbnail",
+      "search",
+      "bota",
+      "menu"
+    ],
+    "availableMenus": [
+      "viewSettings",
+      "documentEditor",
+      "security",
+      "watermark",
+      "documentInfo",
+      "save",
+      "share",
+      "openDocument"
+    ]
+  },
+  "readerViewConfig": {
+    "linkHighlight": true,
+    "formFieldHighlight": true
+  }
+}

+ 124 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/CPDFConfiguration.java

@@ -0,0 +1,124 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer;
+
+import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+public class CPDFConfiguration implements Serializable {
+
+    public ModeConfig modeConfig = new ModeConfig();
+
+    public ToolbarConfig toolbarConfig = new ToolbarConfig();
+
+    public ReaderViewConfig readerViewConfig = new ReaderViewConfig();
+
+    public static class ModeConfig implements Serializable {
+
+        public ModeConfig() {
+
+        }
+
+        public ModeConfig(CPreviewMode initialViewMode) {
+            this.initialViewMode = initialViewMode;
+        }
+
+        public CPreviewMode initialViewMode = CPreviewMode.Viewer;
+
+    }
+
+    public static class ToolbarConfig implements Serializable {
+
+        public ToolbarConfig() {
+
+        }
+
+        public enum ToolbarAction {
+            Back,
+            Thumbnail,
+            Search,
+            Bota,
+            Menu;
+
+            public static ToolbarAction fromString(String str) {
+                try {
+                    String firstLetter = str.substring(0, 1).toUpperCase();
+                    String result = firstLetter + str.substring(1);
+
+                    return ToolbarAction.valueOf(result);
+
+                } catch (Exception e) {
+                    return null;
+                }
+            }
+        }
+
+        public enum MenuAction {
+            ViewSettings,
+            DocumentEditor,
+            Security,
+            Watermark,
+            DocumentInfo,
+            Save,
+            Share,
+            OpenDocument;
+
+            public static MenuAction fromString(String str) {
+                try {
+                    String firstLetter = str.substring(0, 1).toUpperCase();
+                    String result = firstLetter + str.substring(1);
+                    return MenuAction.valueOf(result);
+                } catch (Exception e) {
+                    return null;
+                }
+            }
+        }
+
+        public List<ToolbarAction> androidAvailableActions;
+
+        public List<MenuAction> availableMenus;
+
+    }
+
+    public static class ReaderViewConfig implements Serializable {
+
+        public boolean linkHighlight;
+
+        public boolean formFieldHighlight;
+
+    }
+
+    public static class Builder {
+
+        CPDFConfiguration configuration = new CPDFConfiguration();
+
+        public Builder setModeConfig(ModeConfig modeConfig) {
+            configuration.modeConfig = modeConfig;
+            return this;
+        }
+
+        public Builder setToolbarConfig(ToolbarConfig toolbarConfig) {
+            configuration.toolbarConfig = toolbarConfig;
+            return this;
+        }
+
+        public Builder setReaderViewConfig(ReaderViewConfig readerViewConfig) {
+            configuration.readerViewConfig = readerViewConfig;
+            return this;
+        }
+
+        public CPDFConfiguration create() {
+            return configuration;
+        }
+    }
+}

+ 110 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/CPDFConfigurationUtils.java

@@ -0,0 +1,110 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.pdfviewer;
+
+
+import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class CPDFConfigurationUtils {
+
+
+    public static CPDFConfiguration normalConfig(){
+        CPDFConfiguration.Builder builder = new CPDFConfiguration.Builder()
+                .setModeConfig(new CPDFConfiguration.ModeConfig(CPreviewMode.Viewer));
+
+        CPDFConfiguration.ReaderViewConfig readerViewConfig = new CPDFConfiguration.ReaderViewConfig();
+        readerViewConfig.linkHighlight = true;
+        readerViewConfig.formFieldHighlight = true;
+        builder.setReaderViewConfig(readerViewConfig);
+
+        CPDFConfiguration.ToolbarConfig toolbarConfig = new CPDFConfiguration.ToolbarConfig();
+        toolbarConfig.androidAvailableActions = Arrays.asList(
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Thumbnail,
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Search,
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Bota,
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Menu
+        );
+        toolbarConfig.availableMenus = Arrays.asList(
+                CPDFConfiguration.ToolbarConfig.MenuAction.ViewSettings,
+                CPDFConfiguration.ToolbarConfig.MenuAction.DocumentEditor,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Security,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Watermark,
+                CPDFConfiguration.ToolbarConfig.MenuAction.DocumentInfo,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Save,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Share,
+                CPDFConfiguration.ToolbarConfig.MenuAction.OpenDocument
+        );
+        builder.setToolbarConfig(toolbarConfig);
+        return builder.create();
+    }
+
+    public static CPDFConfiguration fromJson(String json){
+        try {
+            CPDFConfiguration configuration = new CPDFConfiguration();
+            JSONObject rootJsonObject = new JSONObject(json);
+            configuration.modeConfig = parseModeConfig(rootJsonObject.getJSONObject("modeConfig"));
+            configuration.toolbarConfig = parseToolbarConfig(rootJsonObject.getJSONObject("toolbarConfig"));
+            configuration.readerViewConfig = parseReaderViewConfig(rootJsonObject.getJSONObject("readerViewConfig"));
+            return configuration;
+        } catch (Exception e) {
+            return  CPDFConfigurationUtils.normalConfig();
+        }
+    }
+
+    private static CPDFConfiguration.ModeConfig parseModeConfig(JSONObject jsonObject){
+        CPDFConfiguration.ModeConfig modeConfig = new CPDFConfiguration.ModeConfig();
+        CPreviewMode mode = CPreviewMode.fromAlias(jsonObject.optString("initialViewMode"));
+        modeConfig.initialViewMode = mode != null ? mode : CPreviewMode.Viewer;
+        return modeConfig;
+    }
+
+    private static CPDFConfiguration.ToolbarConfig parseToolbarConfig(JSONObject jsonObject){
+        CPDFConfiguration.ToolbarConfig toolbarConfig = new CPDFConfiguration.ToolbarConfig();
+        List<CPDFConfiguration.ToolbarConfig.ToolbarAction> androidAvailableActionsList = new ArrayList<>();
+        JSONArray androidAvailableActions = jsonObject.optJSONArray("androidAvailableActions");
+        if (androidAvailableActions != null) {
+            for (int i = 0; i < androidAvailableActions.length(); i++) {
+                CPDFConfiguration.ToolbarConfig.ToolbarAction action = CPDFConfiguration.ToolbarConfig.ToolbarAction.fromString(androidAvailableActions.optString(i));
+                if (action != null) {
+                    androidAvailableActionsList.add(action);
+                }
+            }
+        }
+        toolbarConfig.androidAvailableActions = androidAvailableActionsList;
+
+        // parse more menu actions
+        List<CPDFConfiguration.ToolbarConfig.MenuAction> menuActionList = new ArrayList<>();
+        JSONArray availableMenusArray = jsonObject.optJSONArray("availableMenus");
+        if (availableMenusArray != null) {
+            for (int i = 0; i < availableMenusArray.length(); i++) {
+                CPDFConfiguration.ToolbarConfig.MenuAction menuAction = CPDFConfiguration.ToolbarConfig.MenuAction.fromString(availableMenusArray.optString(i));
+                if (menuAction != null) {
+                    menuActionList.add(menuAction);
+                }
+            }
+        }
+        toolbarConfig.availableMenus = menuActionList;
+        return toolbarConfig;
+    }
+
+    private static CPDFConfiguration.ReaderViewConfig parseReaderViewConfig(JSONObject jsonObject){
+        CPDFConfiguration.ReaderViewConfig readerViewConfig = new CPDFConfiguration.ReaderViewConfig();
+        readerViewConfig.linkHighlight = jsonObject.optBoolean("linkHighlight", true);
+        readerViewConfig.formFieldHighlight = jsonObject.optBoolean("formFieldHighlight", true);
+        return readerViewConfig;
+    }
+}

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

@@ -1,49 +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.pdfviewer;
-
-import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
-
-import java.io.Serializable;
-
-
-public class Configuration implements Serializable {
-
-    private CPreviewMode mode;
-
-    private boolean highlightLink;
-
-    private boolean highlightForm;
-
-    public CPreviewMode getMode() {
-        return mode;
-    }
-
-    public void setMode(CPreviewMode mode) {
-        this.mode = mode;
-    }
-
-    public boolean isHighlightLink() {
-        return highlightLink;
-    }
-
-    public void setHighlightLink(boolean highlightLink) {
-        this.highlightLink = highlightLink;
-    }
-
-    public boolean isHighlightForm() {
-        return highlightForm;
-    }
-
-    public void setHighlightForm(boolean highlightForm) {
-        this.highlightForm = highlightForm;
-    }
-
-}

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

@@ -28,6 +28,7 @@ import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
 import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.core.edit.CPDFEditManager;
+import com.compdfkit.core.edit.CPDFEditPage;
 import com.compdfkit.pdfviewer.databinding.PdfSampleActivityBinding;
 import com.compdfkit.tools.common.basic.activity.CBasicPDFActivity;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
@@ -50,7 +51,7 @@ import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleManager;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
-import com.compdfkit.tools.contenteditor.CPDFEditPage;
+import com.compdfkit.tools.forms.pdfproperties.pdfsign.CustomSignatureWidgetImpl;
 import com.compdfkit.tools.forms.pdfproperties.pdfsign.SignatureWidgetImpl;
 import com.compdfkit.tools.security.encryption.CDocumentEncryptionDialog;
 import com.compdfkit.tools.security.encryption.CInputOwnerPwdDialog;
@@ -67,6 +68,7 @@ import com.compdfkit.ui.reader.CPDFPageView;
 import com.compdfkit.ui.reader.CPDFReaderView;
 
 import java.util.ArrayList;
+import java.util.List;
 
 
 public class MainActivity extends CBasicPDFActivity {
@@ -86,6 +88,8 @@ public class MainActivity extends CBasicPDFActivity {
 
     CSampleScreenManager screenManager = new CSampleScreenManager();
 
+    private CPDFConfiguration cpdfConfiguration;
+
     private ActivityResultLauncher<Void> selectDocumentLauncher = registerForActivityResult(new CSelectPDFDocumentResultContract(), uri -> {
         if (uri != null) {
             CPDFReaderView readerView = binding.pdfView.getCPdfReaderView();
@@ -115,6 +119,7 @@ public class MainActivity extends CBasicPDFActivity {
         binding = PdfSampleActivityBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
         screenManager.bind(binding);
+        parseConfiguration();
         //Extract PDF files from the Android assets folder
         initPDFView();
         initToolBarView();
@@ -123,11 +128,10 @@ public class MainActivity extends CBasicPDFActivity {
         initFormToolbar();
         initEditBar();
         initSignatureToolbar();
-        parseConfiguration();
         onDoNext();
     }
 
-    private void initDocument(){
+    private void initDocument() {
         String password = getIntent().getStringExtra(EXTRA_FILE_PASSWORD);
         if (!TextUtils.isEmpty(getIntent().getStringExtra(EXTRA_FILE_PATH))) {
             String path = getIntent().getStringExtra(EXTRA_FILE_PATH);
@@ -137,7 +141,7 @@ public class MainActivity extends CBasicPDFActivity {
             CFileUtils.takeUriPermission(this, getIntent().getData());
             binding.pdfView.openPDF(getIntent().getData(), password);
             binding.editToolBar.setEditMode(false);
-        }else {
+        } else {
             CExtractAssetFileTask.extract(this, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> {
                         binding.pdfView.openPDF(filePath);
                         binding.editToolBar.setEditMode(false);
@@ -148,9 +152,7 @@ public class MainActivity extends CBasicPDFActivity {
 
     private void initPDFView() {
         initDocument();
-
         binding.pdfView.getCPdfReaderView().setMinScaleEnable(false);
-        resetContextMenu(binding.pdfView, CPreviewMode.Viewer);
         initAnnotationAttr(binding.pdfView);
         initFormAttr(binding.pdfView);
         registerAnnotHelper(binding.pdfView);
@@ -210,6 +212,13 @@ public class MainActivity extends CBasicPDFActivity {
                 requestStoragePermissions();
             }
         } else {
+            if (mode == CPreviewMode.Signature){
+                binding.pdfView.getCPdfReaderView().getAnnotImplRegistry()
+                        .registImpl(CPDFSignatureWidget.class, SignatureWidgetImpl.class);
+            }else {
+                binding.pdfView.getCPdfReaderView().getAnnotImplRegistry()
+                        .registImpl(CPDFSignatureWidget.class, CustomSignatureWidgetImpl.class);
+            }
 
             if (editManager != null && editManager.isEditMode()) {
                 editManager.endEdit();
@@ -237,120 +246,67 @@ public class MainActivity extends CBasicPDFActivity {
         binding.pdfToolBar.addMode(CPreviewMode.Form);
         binding.pdfToolBar.addMode(CPreviewMode.Signature);
         binding.pdfToolBar.setPreviewModeChangeListener(this::setPreviewMode);
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
-            if (binding.pdfView.getCPdfReaderView().getEditManager().isEditMode()) {
-                curEditMode = binding.pdfView.getCPdfReaderView().getLoadType();
-            } else {
-                curEditMode = CPDFEditPage.LoadUnknown;
-            }
-            binding.pdfView.exitEditMode();
-            binding.pdfToolBar.setVisibility(View.GONE);
-            binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
-            binding.pdfSearchToolBar.showKeyboard();
-        });
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
-            showPageEdit(binding.pdfView, false, () -> {
-                if (curEditMode > 0 && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
-                    CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
-                    if (!editManager.isEditMode()) {
-                        editManager.beginEdit(curEditMode);
-                    }
+        if (cpdfConfiguration != null) {
+            CPDFConfiguration.ToolbarConfig toolbarConfig = cpdfConfiguration.toolbarConfig;
+            for (CPDFConfiguration.ToolbarConfig.ToolbarAction androidAvailableAction : toolbarConfig.androidAvailableActions) {
+                switch (androidAvailableAction) {
+                    case Thumbnail:
+                        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
+                            showPageEdit(binding.pdfView, false, () -> {
+                                if (curEditMode > CPDFEditPage.LoadNone && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
+                                    CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
+                                    if (!editManager.isEditMode()) {
+                                        editManager.beginEdit(curEditMode);
+                                    }
+                                }
+                            });
+                        });
+                        break;
+                    case Search:
+                        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
+                            if (binding.pdfView.getCPdfReaderView().getEditManager().isEditMode()) {
+                                curEditMode = binding.pdfView.getCPdfReaderView().getLoadType();
+                            } else {
+                                curEditMode = CPDFEditPage.LoadNone;
+                            }
+                            binding.pdfView.exitEditMode();
+                            binding.pdfToolBar.setVisibility(View.GONE);
+                            binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
+                            binding.pdfSearchToolBar.showKeyboard();
+                        });
+                        break;
+                    case Bota:
+                        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
+                            binding.pdfView.getCPdfReaderView().removeAllAnnotFocus();
+                            binding.pdfView.exitEditMode();
+                            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
+                            CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.ANNOTATION, getString(R.string.tools_annotations));
+                            CPDFBotaFragmentTabs outlineTab = new CPDFBotaFragmentTabs(CPDFBOTA.OUTLINE, getString(R.string.tools_outlines));
+                            CPDFBotaFragmentTabs bookmarkTab = new CPDFBotaFragmentTabs(CPDFBOTA.BOOKMARKS, getString(R.string.tools_bookmarks));
+                            if (binding.pdfToolBar.getMode() == CPreviewMode.Viewer) {
+                                tabs.add(outlineTab);
+                                tabs.add(bookmarkTab);
+                            } else {
+                                tabs.add(outlineTab);
+                                tabs.add(bookmarkTab);
+                                tabs.add(annotationTab);
+                            }
+                            CPDFBotaDialogFragment dialogFragment = CPDFBotaDialogFragment.newInstance();
+                            dialogFragment.initWithPDFView(binding.pdfView);
+                            dialogFragment.setBotaDialogTabs(tabs);
+                            dialogFragment.show(getSupportFragmentManager(), "annotationList");
+                        });
+                        break;
+
+                    case Menu:
+                        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
+                            showToolbarMenuDialog(v);
+                        });
+                        break;
+                    default:break;
                 }
-            });
-        });
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
-            binding.pdfView.getCPdfReaderView().removeAllAnnotFocus();
-            binding.pdfView.exitEditMode();
-            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
-            CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.ANNOTATION, getString(R.string.tools_annotations));
-            CPDFBotaFragmentTabs outlineTab = new CPDFBotaFragmentTabs(CPDFBOTA.OUTLINE, getString(R.string.tools_outlines));
-            CPDFBotaFragmentTabs bookmarkTab = new CPDFBotaFragmentTabs(CPDFBOTA.BOOKMARKS, getString(R.string.tools_bookmarks));
-            if (binding.pdfToolBar.getMode() == CPreviewMode.Viewer) {
-                tabs.add(outlineTab);
-                tabs.add(bookmarkTab);
-            } else {
-                tabs.add(outlineTab);
-                tabs.add(bookmarkTab);
-                tabs.add(annotationTab);
             }
-            CPDFBotaDialogFragment dialogFragment = CPDFBotaDialogFragment.newInstance();
-            dialogFragment.initWithPDFView(binding.pdfView);
-            dialogFragment.setBotaDialogTabs(tabs);
-            dialogFragment.show(getSupportFragmentManager(), "annotationList");
-        });
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
-            v.setSelected(true);
-            //Show the PDF settings dialog fragment
-            CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);
-            menuWindow.addItem(R.drawable.tools_ic_preview_settings, R.string.tools_view_setting, v1 -> {
-                showDisplaySettings(binding.pdfView);
-            });
-            menuWindow.addItem(R.drawable.tools_page_edit, R.string.tools_page_edit_toolbar_title, v1 -> {
-                showPageEdit(binding.pdfView, true, () -> {
-                    if (curEditMode > 0 && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
-                        CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
-                        if (!editManager.isEditMode()) {
-                            editManager.beginEdit(curEditMode);
-                        }
-                    }
-                });
-            });
-            menuWindow.addItem(R.drawable.tools_ic_add_security, R.string.tools_security, v1 -> {
-                CPDFDocument document = binding.pdfView.getCPdfReaderView().getPDFDocument();
-                if (document == null){
-                    return;
-                }
-                if (document.getPermissions() == CPDFDocument.PDFDocumentPermissions.PDFDocumentPermissionsUser) {
-                    CInputOwnerPwdDialog inputOwnerPwdDialog = CInputOwnerPwdDialog.newInstance();
-                    inputOwnerPwdDialog.setDocument(document);
-                    inputOwnerPwdDialog.setCancelClickListener(v2->{
-                        inputOwnerPwdDialog.dismiss();
-                    });
-                    inputOwnerPwdDialog.setConfirmClickListener(ownerPassword -> {
-                        document.reload(ownerPassword);
-                        showSettingEncryptionDialog();
-                        inputOwnerPwdDialog.dismiss();
-                    });
-                    inputOwnerPwdDialog.show(getSupportFragmentManager(), "inputPasswordDialog");
-                    return;
-                }
-                showSettingEncryptionDialog();
-            });
-            menuWindow.addItem(R.drawable.tools_ic_add_watermark, R.string.tools_watermark, v1 -> {
-                CWatermarkEditDialog watermarkEditDialog = CWatermarkEditDialog.newInstance();
-                watermarkEditDialog.setDocument(binding.pdfView.getCPdfReaderView().getPDFDocument());
-                watermarkEditDialog.setPageIndex(binding.pdfView.currentPageIndex);
-                watermarkEditDialog.setCompleteListener((pdfFile)->{
-                    binding.pdfView.openPDF(pdfFile);
-                    watermarkEditDialog.dismiss();
-                    CToastUtil.showLongToast(this, R.string.tools_watermark_add_success);
-                });
-                watermarkEditDialog.show(getSupportFragmentManager(), "watermarkEditDialog");
-            });
-            menuWindow.addItem(R.drawable.tools_ic_document_info, R.string.tools_document_info, v1 -> {
-                showDocumentInfo(binding.pdfView);
-            });
-            menuWindow.addItem(R.drawable.tools_ic_menu_save,R.string.tools_save, v1 -> {
-                binding.pdfView.savePDF((filePath, pdfUri) -> {
-                    CToastUtil.showLongToast(this, R.string.tools_save_success);
-                },e -> {
-
-                });
-            });
-            menuWindow.addItem(R.drawable.tools_ic_share, R.string.tools_share, v1 -> {
-                binding.editToolBar.resetStatus();
-                sharePDF(binding.pdfView);
-            });
-            menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
-                if (CPermissionUtil.hasStoragePermissions(this)) {
-                    selectDocument();
-                } else {
-                    requestStoragePermissions();
-                }
-            });
-            menuWindow.setOnDismissListener(() -> v.setSelected(false));
-            menuWindow.showAsDropDown(v);
-        });
+        }
     }
 
     private void requestStoragePermissions() {
@@ -410,7 +366,7 @@ public class MainActivity extends CBasicPDFActivity {
             });
         });
         binding.pdfSearchToolBar.setExitSearchListener(() -> {
-            if (curEditMode > 0) {
+            if (curEditMode > CPDFEditPage.LoadNone) {
                 CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
                 if (!editManager.isEditMode()) {
                     editManager.beginEdit(curEditMode);
@@ -468,26 +424,29 @@ public class MainActivity extends CBasicPDFActivity {
         });
     }
 
-    private void parseConfiguration(){
-        Configuration configuration;
-        if (!getIntent().hasExtra(EXTRA_CONFIGURATION)) {
-            setPreviewMode(CPreviewMode.Viewer);
-            return;
+    private void parseConfiguration() {
+        if (getIntent().hasExtra(EXTRA_CONFIGURATION)) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                cpdfConfiguration = getIntent().getSerializableExtra(EXTRA_CONFIGURATION, CPDFConfiguration.class);
+            } else {
+                cpdfConfiguration = (CPDFConfiguration) getIntent().getSerializableExtra(EXTRA_CONFIGURATION);
+            }
+        } else {
+            cpdfConfiguration = CPDFConfigurationUtils.normalConfig();
         }
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-            configuration = getIntent().getSerializableExtra(EXTRA_CONFIGURATION, Configuration.class);
-        }else {
-            configuration = (Configuration) getIntent().getSerializableExtra(EXTRA_CONFIGURATION);
+        if (cpdfConfiguration.readerViewConfig != null) {
+            CPDFConfiguration.ReaderViewConfig readerViewConfig = cpdfConfiguration.readerViewConfig;
+            binding.pdfView.getCPdfReaderView().setLinkHighlight(readerViewConfig.linkHighlight);
+            binding.pdfView.getCPdfReaderView().setFormFieldHighlight(readerViewConfig.formFieldHighlight);
         }
-        if (configuration != null) {
-            binding.pdfView.getCPdfReaderView().setLinkHighlight(configuration.isHighlightLink());
-            binding.pdfView.getCPdfReaderView().setFormFieldHighlight(configuration.isHighlightForm());
-            if (configuration.getMode() != CPreviewMode.PageEdit){
-                setPreviewMode(configuration.getMode());
-            }else {
+        if (cpdfConfiguration.modeConfig != null) {
+            CPDFConfiguration.ModeConfig modeConfig = cpdfConfiguration.modeConfig;
+            if (modeConfig.initialViewMode != CPreviewMode.PageEdit) {
+                setPreviewMode(modeConfig.initialViewMode);
+            } else {
                 setPreviewMode(CPreviewMode.Viewer);
                 showPageEdit(binding.pdfView, true, () -> {
-                    if (curEditMode > 0 && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
+                    if (curEditMode > CPDFEditPage.LoadNone && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
                         CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
                         if (!editManager.isEditMode()) {
                             editManager.beginEdit(curEditMode);
@@ -498,6 +457,107 @@ public class MainActivity extends CBasicPDFActivity {
         }
     }
 
+    private void showToolbarMenuDialog(View anchorView) {
+        //Show the PDF settings dialog fragment
+        CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);
+        if (cpdfConfiguration != null && cpdfConfiguration.toolbarConfig != null) {
+            List<CPDFConfiguration.ToolbarConfig.MenuAction> menuActions = cpdfConfiguration.toolbarConfig.availableMenus;
+            if (menuActions == null || menuActions.size() == 0) {
+                return;
+            }
+            anchorView.setSelected(true);
+            for (CPDFConfiguration.ToolbarConfig.MenuAction menuAction : menuActions) {
+                switch (menuAction) {
+                    case ViewSettings:
+                        menuWindow.addItem(R.drawable.tools_ic_preview_settings, R.string.tools_view_setting, v1 -> {
+                            showDisplaySettings(binding.pdfView);
+                        });
+                        break;
+                    case DocumentEditor:
+                        menuWindow.addItem(R.drawable.tools_page_edit, R.string.tools_page_edit_toolbar_title, v1 -> {
+                            showPageEdit(binding.pdfView, true, () -> {
+                                if (curEditMode > CPDFEditPage.LoadNone && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
+                                    CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
+                                    if (!editManager.isEditMode()) {
+                                        editManager.beginEdit(curEditMode);
+                                    }
+                                }
+                            });
+                        });
+                        break;
+                    case Security:
+                        menuWindow.addItem(R.drawable.tools_ic_add_security, R.string.tools_security, v1 -> {
+                            CPDFDocument document = binding.pdfView.getCPdfReaderView().getPDFDocument();
+                            if (document == null) {
+                                return;
+                            }
+                            if (document.getPermissions() == CPDFDocument.PDFDocumentPermissions.PDFDocumentPermissionsUser) {
+                                CInputOwnerPwdDialog inputOwnerPwdDialog = CInputOwnerPwdDialog.newInstance();
+                                inputOwnerPwdDialog.setDocument(document);
+                                inputOwnerPwdDialog.setCancelClickListener(v2 -> {
+                                    inputOwnerPwdDialog.dismiss();
+                                });
+                                inputOwnerPwdDialog.setConfirmClickListener(ownerPassword -> {
+                                    document.reload(ownerPassword);
+                                    showSettingEncryptionDialog();
+                                    inputOwnerPwdDialog.dismiss();
+                                });
+                                inputOwnerPwdDialog.show(getSupportFragmentManager(), "inputPasswordDialog");
+                                return;
+                            }
+                            showSettingEncryptionDialog();
+                        });
+                        break;
+                    case Watermark:
+                        menuWindow.addItem(R.drawable.tools_ic_add_watermark, R.string.tools_watermark, v1 -> {
+                            CWatermarkEditDialog watermarkEditDialog = CWatermarkEditDialog.newInstance();
+                            watermarkEditDialog.setDocument(binding.pdfView.getCPdfReaderView().getPDFDocument());
+                            watermarkEditDialog.setPageIndex(binding.pdfView.currentPageIndex);
+                            watermarkEditDialog.setCompleteListener((pdfFile) -> {
+                                binding.pdfView.openPDF(pdfFile);
+                                watermarkEditDialog.dismiss();
+                                CToastUtil.showLongToast(this, R.string.tools_watermark_add_success);
+                            });
+                            watermarkEditDialog.show(getSupportFragmentManager(), "watermarkEditDialog");
+                        });
+                        break;
+                    case DocumentInfo:
+                        menuWindow.addItem(R.drawable.tools_ic_document_info, R.string.tools_document_info, v1 -> {
+                            showDocumentInfo(binding.pdfView);
+                        });
+                        break;
+                    case Save:
+                        menuWindow.addItem(R.drawable.tools_ic_menu_save, R.string.tools_save, v1 -> {
+                            binding.pdfView.savePDF((filePath, pdfUri) -> {
+                                CToastUtil.showLongToast(this, R.string.tools_save_success);
+                            }, e -> {
+
+                            });
+                        });
+                        break;
+                    case Share:
+                        menuWindow.addItem(R.drawable.tools_ic_share, R.string.tools_share, v1 -> {
+                            binding.editToolBar.resetStatus();
+                            sharePDF(binding.pdfView);
+                        });
+                        break;
+                    case OpenDocument:
+                        menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
+                            if (CPermissionUtil.hasStoragePermissions(this)) {
+                                selectDocument();
+                            } else {
+                                requestStoragePermissions();
+                            }
+                        });
+                        break;
+                    default:break;
+                }
+            }
+        }
+        menuWindow.setOnDismissListener(() -> anchorView.setSelected(false));
+        menuWindow.showAsDropDown(anchorView);
+    }
+
     /**
      *
      */

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

@@ -11,6 +11,7 @@ package com.compdfkit.pdfviewer.home;
 
 import android.net.Uri;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -72,6 +73,11 @@ public class DocumentListFragment extends Fragment {
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+        if (funType == null){
+            if (savedInstanceState != null && !TextUtils.isEmpty(savedInstanceState.getString("funType"))) {
+                funType = HomeFunBean.FunType.valueOf(savedInstanceState.getString("funType"));
+            }
+        }
         initDocumentList();
         binding.fabAdd.setOnClickListener(v -> {
             // A pop-up window will pop up, giving you the option to
@@ -129,6 +135,9 @@ public class DocumentListFragment extends Fragment {
      * Initialize the sample document list
      */
     private void initDocumentList() {
+        if (funType == null) {
+            return;
+        }
         funListAdapter = new CHomeFunListAdapter();
         funListAdapter.setList(FunDatas.getDocumentListByFunType(getContext(), funType));
         binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
@@ -146,4 +155,10 @@ public class DocumentListFragment extends Fragment {
         SamplesFactory factory = new SamplesFactory(this, filePath, uri);
         factory.getImpl(funType).run();
     }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        outState.putString("funType", funType.name());
+        super.onSaveInstanceState(outState);
+    }
 }

+ 7 - 4
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/HomeActivity.java

@@ -15,6 +15,7 @@ import android.os.Bundle;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
+import com.compdfkit.core.document.CPDFSdk;
 import com.compdfkit.pdfviewer.R;
 import com.compdfkit.pdfviewer.databinding.ActivityHomeBinding;
 
@@ -37,10 +38,12 @@ public class HomeActivity extends AppCompatActivity {
             return false;
         });
 
-        getSupportFragmentManager()
-                .beginTransaction()
-                .replace(R.id.fragment_content, new HomeFunFragment(), "homeFunFragment")
-                .commit();
+        if (getSupportFragmentManager().findFragmentByTag("homeFunFragment") == null){
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .replace(R.id.fragment_content, new HomeFunFragment(), "homeFunFragment")
+                    .commit();
+        }
     }
 
     @Override

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

@@ -20,12 +20,18 @@ import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.LinearLayoutManager;
 
+import com.compdfkit.pdfviewer.CPDFConfiguration;
+import com.compdfkit.pdfviewer.CPDFConfigurationUtils;
 import com.compdfkit.pdfviewer.MainActivity;
 import com.compdfkit.pdfviewer.R;
 import com.compdfkit.pdfviewer.databinding.FragmentHomeBinding;
 import com.compdfkit.pdfviewer.home.datas.FunDatas;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.CLog;
 import com.compdfkit.ui.utils.CPDFCommomUtils;
 
+import java.io.File;
+
 
 public class HomeFunFragment extends Fragment {
 

+ 44 - 13
PDFViewer/src/main/java/com/compdfkit/pdfviewer/home/samples/OpenPDFSamplesImpl.java

@@ -1,6 +1,6 @@
 /**
  * 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.
@@ -10,17 +10,24 @@
 package com.compdfkit.pdfviewer.home.samples;
 
 
+import android.app.AlertDialog;
 import android.content.Intent;
 import android.net.Uri;
 
 import androidx.fragment.app.Fragment;
 
-import com.compdfkit.pdfviewer.Configuration;
+import com.compdfkit.pdfviewer.CPDFConfiguration;
+import com.compdfkit.pdfviewer.CPDFConfigurationUtils;
 import com.compdfkit.pdfviewer.MainActivity;
 import com.compdfkit.pdfviewer.home.HomeFunBean;
 import com.compdfkit.pdfviewer.home.datas.SettingDatas;
+import com.compdfkit.tools.common.utils.CFileUtils;
+import com.compdfkit.tools.common.utils.CLog;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
 
+import java.io.File;
+import java.util.Arrays;
+
 public class OpenPDFSamplesImpl extends BasicFeaturesSamples {
 
     protected String filePath;
@@ -34,7 +41,7 @@ public class OpenPDFSamplesImpl extends BasicFeaturesSamples {
         super(fragment, funType);
     }
 
-    public void setPDFFile(String filePath, Uri uri, String password){
+    public void setPDFFile(String filePath, Uri uri, String password) {
         this.filePath = filePath;
         this.uri = uri;
         this.password = password;
@@ -45,7 +52,7 @@ public class OpenPDFSamplesImpl extends BasicFeaturesSamples {
         startPDFActivity(filePath, uri, password);
     }
 
-    protected void startPDFActivity(String filePath, Uri uri, String password){
+    protected void startPDFActivity(String filePath, Uri uri, String password) {
         Intent intent = new Intent(fragment.getContext(), MainActivity.class);
         intent.putExtra(MainActivity.EXTRA_FILE_PATH, filePath);
         intent.setData(uri);
@@ -58,16 +65,39 @@ public class OpenPDFSamplesImpl extends BasicFeaturesSamples {
      * Enter the additional configuration information of pdf Activity
      * @return
      */
-    protected Configuration getConfiguration(){
-        Configuration configuration = new Configuration();
-        configuration.setHighlightForm(SettingDatas.isHighlightForm(fragment.getContext()));
-        configuration.setHighlightLink(SettingDatas.isHighlightLink(fragment.getContext()));
-        configuration.setMode(getPreviewMode());
-        return configuration;
+    protected CPDFConfiguration getConfiguration() {
+        CPDFConfiguration.Builder builder = new CPDFConfiguration.Builder()
+                .setModeConfig(new CPDFConfiguration.ModeConfig(getPreviewMode()));
+
+        CPDFConfiguration.ReaderViewConfig readerViewConfig = new CPDFConfiguration.ReaderViewConfig();
+        readerViewConfig.linkHighlight = SettingDatas.isHighlightLink(fragment.getContext());
+        readerViewConfig.formFieldHighlight = SettingDatas.isHighlightForm(fragment.getContext());
+        builder.setReaderViewConfig(readerViewConfig);
+
+        CPDFConfiguration.ToolbarConfig toolbarConfig = new CPDFConfiguration.ToolbarConfig();
+        toolbarConfig.androidAvailableActions = Arrays.asList(
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Thumbnail,
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Search,
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Bota,
+                CPDFConfiguration.ToolbarConfig.ToolbarAction.Menu
+        );
+        toolbarConfig.availableMenus = Arrays.asList(
+                CPDFConfiguration.ToolbarConfig.MenuAction.ViewSettings,
+                CPDFConfiguration.ToolbarConfig.MenuAction.DocumentEditor,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Security,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Watermark,
+                CPDFConfiguration.ToolbarConfig.MenuAction.DocumentInfo,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Save,
+                CPDFConfiguration.ToolbarConfig.MenuAction.Share,
+                CPDFConfiguration.ToolbarConfig.MenuAction.OpenDocument
+        );
+        builder.setToolbarConfig(toolbarConfig);
+        return builder.create();
+
     }
 
-    protected CPreviewMode getPreviewMode(){
-        switch (funType){
+    protected CPreviewMode getPreviewMode() {
+        switch (funType) {
             case Viewer:
                 return CPreviewMode.Viewer;
             case Annotations:
@@ -80,7 +110,8 @@ public class OpenPDFSamplesImpl extends BasicFeaturesSamples {
                 return CPreviewMode.PageEdit;
             case ContentEditor:
                 return CPreviewMode.Edit;
-            default:return CPreviewMode.Viewer;
+            default:
+                return CPreviewMode.Viewer;
         }
     }
 }

+ 1 - 1
PDFViewer/src/main/res/values-zh-rCN/strings.xml

@@ -59,7 +59,7 @@
     <string name="tools_compdfkit_sample_file_signatures">签名_ComPDFKit_示例文档.pdf</string>
     <string name="tools_compdfkit_sample_file_document_editor">文档编辑器_ComPDFKit_示例文档.pdf</string>
     <string name="tools_compdfkit_sample_file_content_editor">内容编辑器_ComPDFKit_示例文档.pdf</string>
-    <string name="tools_compdfkit_sample_file_security">文档密码:compdfkit_ComPDFKit_PDF安全_示例文档.pdf</string>
+    <string name="tools_compdfkit_sample_file_security">文档密码_compdfkit_ComPDFKit_PDF安全_示例文档.pdf</string>
     <string name="tools_compdfkit_sample_file_watermark">水印_ComPDFKit_示例文档.pdf</string>
 
 </resources>

+ 1 - 1
PDFViewer/src/main/res/values/strings.xml

@@ -62,7 +62,7 @@
     <string name="tools_compdfkit_sample_file_signatures">ComPDFKit_Signatures_Sample_File.pdf</string>
     <string name="tools_compdfkit_sample_file_document_editor">ComPDFKit_Document_Editor_Sample_File.pdf</string>
     <string name="tools_compdfkit_sample_file_content_editor">ComPDFKit_Content_Editor_Sample_File.pdf</string>
-    <string name="tools_compdfkit_sample_file_security">Password:compdfkit_ComPDFKit_Security_Sample_File.pdf</string>
+    <string name="tools_compdfkit_sample_file_security">Password_compdfkit_ComPDFKit_Security_Sample_File.pdf</string>
     <string name="tools_compdfkit_sample_file_watermark">ComPDFKit_Watermark_Sample_File.pdf</string>
 
 </resources>

Файловите разлики са ограничени, защото са твърде много
+ 1 - 4
Samples/src/main/AndroidManifest.xml


+ 15 - 10
Samples/src/main/java/com/compdfkit/samples/samples/ImageExtractTest.java

@@ -16,6 +16,8 @@ import com.compdfkit.samples.util.FileUtils;
 import com.compdfkit.samples.util.OutputListener;
 
 import java.io.File;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 
 public class ImageExtractTest extends PDFSamples {
@@ -34,16 +36,19 @@ public class ImageExtractTest extends PDFSamples {
         outputListener.println("Opening the Samples PDF File");
         CPDFDocument document = new CPDFDocument(context);
         document.open(FileUtils.getAssetsTempFile(context, "ImageExtractTest.pdf"));
-        for (int i = 0; i < document.getPageCount(); i++) {
-            File extractDir = new File(outputDir(), "imageExtract/ImageExtractTest_"+i+"/");
-            extractDir.delete();
-            document.pageAtIndex(i).extractImages(extractDir.getAbsolutePath());
-            File[] images = extractDir.listFiles();
-            if (images != null && images.length>0) {
-                for (File image : images) {
-                    getOutputFileList().add(image.getAbsolutePath());
-                    outputListener.println(image.getName());
-                }
+
+        File extractDir = new File(outputDir(), "imageExtract/ImageExtractTest");
+        extractDir.delete();
+        extractDir.mkdirs();
+        document.extractImage(extractDir.getAbsolutePath(), (pageIndex, imageIndex, index) -> {
+            //Customize the returned file name
+            return document.getFileName() + "_" + pageIndex +"_" + imageIndex;
+        });
+        File[] images = extractDir.listFiles();
+        if (images != null && images.length>0) {
+            for (File image : images) {
+                getOutputFileList().add(image.getAbsolutePath());
+                outputListener.println(image.getName());
             }
         }
         document.close();

+ 3 - 10
Samples/src/main/java/com/compdfkit/samples/samples/TextSearchTest.java

@@ -28,7 +28,6 @@ import com.compdfkit.samples.PDFSamples;
 import com.compdfkit.samples.R;
 import com.compdfkit.samples.util.FileUtils;
 import com.compdfkit.samples.util.OutputListener;
-import com.compdfkit.ui.reader.CPDFReaderView;
 import com.compdfkit.ui.textsearch.ITextSearcher;
 
 import java.io.File;
@@ -47,17 +46,13 @@ public class TextSearchTest extends PDFSamples {
     @Override
     protected void run(OutputListener outputListener) {
         super.run(outputListener);
-        handler.post(() -> {
             printHead();
             outputListener.println();
             CPDFDocument document = new CPDFDocument(context);
             document.open(FileUtils.getAssetsTempFile(context, "text.pdf"));
-            CPDFReaderView readerView = new CPDFReaderView(context);
-            readerView.setPDFDocument(document);
-            readerView.reloadPages();
             String keywords = "PDF";
             // Search for all relevant text in a document based on a keyword
-            List<CPDFTextRange> list = startSearch(readerView, keywords);
+            List<CPDFTextRange> list = startSearch(document, keywords);
             if (list != null && list.size() > 0) {
                 CPDFTextRange textRange = list.get(0);
                 CPDFPage pdfPage = document.pageAtIndex(0);
@@ -98,15 +93,13 @@ public class TextSearchTest extends PDFSamples {
             saveSamplePDF(document, file, false);
             outputListener.println("Done. Results saved in TextSearchResults.pdf");
             printFooter();
-        });
     }
 
-    public static List<CPDFTextRange> startSearch(CPDFReaderView readerView, String keywords) {
-        ITextSearcher textSearcher = readerView.getTextSearcher();
+    public static List<CPDFTextRange> startSearch(CPDFDocument document, String keywords) {
+        ITextSearcher textSearcher = new com.compdfkit.ui.textsearch.CPDFTextSearcher(document.getContext(), document);
         if (null == textSearcher) {
             return null;
         }
-        CPDFDocument document = readerView.getPDFDocument();
         if (null == document) {
             return null;
         }

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

@@ -27,7 +27,7 @@ public class FileUtils {
 
     public static void shareFile(Context context, String title, String type, File file) {
         try {
-            Intent intent = new Intent(Intent.ACTION_SEND);
+            Intent intent = new Intent(Intent.ACTION_VIEW);
             intent.putExtra(Intent.EXTRA_SUBJECT, title);
             Uri uri = getUriBySystem(context, file);
             intent.putExtra(Intent.EXTRA_STREAM, uri);

Файловите разлики са ограничени, защото са твърде много
+ 1 - 4
Samples_kotlin/src/main/AndroidManifest.xml


+ 1 - 3
Samples_kotlin/src/main/java/com/compdfkit/samples/SampleDetailActivity.kt

@@ -50,9 +50,7 @@ open class SampleDetailActivity : AppCompatActivity() {
             pdfSamples?.outputFileList?.clear()
         }
         btnRun.setOnClickListener {
-            lifecycleScope.launch(Dispatchers.IO) {
-                pdfSamples?.run(outputListener)
-            }
+            pdfSamples?.run(outputListener)
         }
         btnOpenFiles.setOnClickListener {
             pdfSamples?.let { pdfSamples ->

+ 1 - 1
Samples_kotlin/src/main/java/com/compdfkit/samples/samples/DigitalSignaturesTest.kt

@@ -110,7 +110,7 @@ class DigitalSignaturesTest : PDFSamples() {
     private fun createSignature() {
         outputListener?.println("Create digital signature.")
         val document = CPDFDocument(context())
-        document.open(getAssetsTempFile(context(), "CommonFivePage.pdf"))
+        var error = document.open(getAssetsTempFile(context(), "CommonFivePage.pdf"))
         //Insert a Form Signature Widget (unsigned)
         val cpdfPage = document.pageAtIndex(0)
         val pageSize = cpdfPage.size

+ 13 - 10
Samples_kotlin/src/main/java/com/compdfkit/samples/samples/ImageExtractTest.kt

@@ -29,16 +29,19 @@ class ImageExtractTest : PDFSamples() {
         outputListener?.println("Opening the Samples PDF File")
         val document = CPDFDocument(context())
         document.open(getAssetsTempFile(context(), "ImageExtractTest.pdf"))
-        for (i in 0 until document.pageCount) {
-            val extractDir = File(outputDir(), "imageExtract/ImageExtractTest_$i/")
-            extractDir.delete()
-            document.pageAtIndex(i).extractImages(extractDir.absolutePath)
-            val images = extractDir.listFiles()
-            if (images != null && images.isNotEmpty()) {
-                for (image in images) {
-                    getOutputFileList().add(image.absolutePath)
-                    outputListener?.println(image.name)
-                }
+
+        val extractDir = File(outputDir(), "imageExtract/ImageExtractTest")
+        extractDir.delete()
+        extractDir.mkdirs()
+        document.extractImage(extractDir.absolutePath) { pageIndex, imageIndex, index ->
+            //Customize the returned file name
+            return@extractImage document.fileName + "_" + pageIndex + "_" + imageIndex
+        }
+        val images = extractDir.listFiles()
+        if (images != null && images.isNotEmpty()) {
+            for (image in images) {
+                getOutputFileList().add(image.absolutePath)
+                outputListener?.println(image.name)
             }
         }
         document.close()

+ 3 - 9
Samples_kotlin/src/main/java/com/compdfkit/samples/samples/TextSearchTest.kt

@@ -36,17 +36,13 @@ class TextSearchTest : PDFSamples() {
 
     override fun run(outputListener: OutputListener?) {
         super.run(outputListener)
-        handler.post {
             printHead()
             outputListener?.println()
             val document = CPDFDocument(context())
             document.open(getAssetsTempFile(context(), "text.pdf"))
-            val readerView = CPDFReaderView(context())
-            readerView.pdfDocument = document
-            readerView.reloadPages()
             val keywords = "PDF"
             // Search for all relevant text in a document based on a keyword
-            val list = startSearch(readerView, keywords)
+            val list = startSearch(document, keywords)
             if (list != null && list.isNotEmpty()) {
                 val textRange = list[0]
                 val pdfPage = document.pageAtIndex(0)
@@ -84,13 +80,11 @@ class TextSearchTest : PDFSamples() {
             saveSamplePDF(document, file, false)
             outputListener?.println("Done. Results saved in TextSearchResults.pdf")
             printFooter()
-        }
     }
 
     companion object {
-        fun startSearch(readerView: CPDFReaderView, keywords: String?): List<CPDFTextRange>? {
-            val textSearcher = readerView.textSearcher ?: return null
-            val document = readerView.pdfDocument ?: return null
+        fun startSearch(document: CPDFDocument, keywords: String?): List<CPDFTextRange> {
+            val textSearcher = com.compdfkit.ui.textsearch.CPDFTextSearcher(document.context, document);
             textSearcher.setSearchConfig(keywords, CPDFTextSearcher.PDFSearchOptions.PDFSearchCaseInsensitive)
             val searchTextInfoList: MutableList<CPDFTextRange> = ArrayList()
             for (i in 0 until document.pageCount) {

Файловите разлики са ограничени, защото са твърде много
+ 1 - 5
Viewer/src/main/AndroidManifest.xml


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

@@ -75,13 +75,26 @@ public class PDFViewerSampleActivity extends CBasicPDFActivity {
 
     private void initToolbarListener() {
         binding.pdfToolBar.addMode(CPreviewMode.Viewer);
-        binding.pdfToolBar.setSearchBtnClickListener(v -> {
+
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_thumbnail, v -> {
+            CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
+            boTaDialogFragment.initWithPDFView(binding.pdfView);
+            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
+            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
+            tabs.add(thumbnailTabs);
+            boTaDialogFragment.setBotaDialogTabs(tabs);
+            boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
+        });
+
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_search, v -> {
+
             binding.pdfToolBar.setVisibility(View.GONE);
             binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
             binding.pdfSearchToolBar.showKeyboard();
         });
 
-        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_bookmark, v -> {
+
             //Show a fragment of the PDF thumbnail and a dialog fragment of the PDF outline list.
             CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
             boTaDialogFragment.initWithPDFView(binding.pdfView);
@@ -93,18 +106,7 @@ public class PDFViewerSampleActivity extends CBasicPDFActivity {
             boTaDialogFragment.setBotaDialogTabs(tabs);
             boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
         });
-
-        binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
-            CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
-            boTaDialogFragment.initWithPDFView(binding.pdfView);
-            CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
-            ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
-            tabs.add(thumbnailTabs);
-            boTaDialogFragment.setBotaDialogTabs(tabs);
-            boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
-        });
-
-        binding.pdfToolBar.setMoreBtnClickListener(v -> {
+        binding.pdfToolBar.addAction(R.drawable.tools_ic_more, v -> {
             v.setSelected(true);
             //Show the PDF settings dialog fragment
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);

+ 1 - 1
gradle.properties

@@ -6,4 +6,4 @@ org.gradle.jvmargs=-Xmx1536m
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
 # org.gradle.parallel=true
 #proguard.config=proguard.cfg
-android.injected.testOnly=false
+android.injected.testOnly=false