Просмотр исходного кода

PDFTools(Android) - 1.合并代码内容

liuxiaolong 1 год назад
Родитель
Сommit
e90df72ab7
86 измененных файлов с 3711 добавлено и 60 удалено
  1. 8 0
      annotation-ctrl-demo/src/main/AndroidManifest.xml
  2. BIN
      annotation-ctrl-demo/src/main/assets/Quick Start Guide V2.4.0.pdf
  3. 49 1
      annotation-ctrl-demo/src/main/java/com/compdfkit/demo/annotation/MainActivity.java
  4. 30 7
      annotation-ctrl-demo/src/main/res/layout/activity_main.xml
  5. 26 11
      annotation-ctrl-demo/src/main/res/values-night/themes.xml
  6. 101 0
      annotation-ctrl-demo/src/main/res/values/colors.xml
  7. 2 0
      annotation-ctrl-demo/src/main/res/values/strings.xml
  8. 28 12
      annotation-ctrl-demo/src/main/res/values/themes.xml
  9. 3 2
      compdfkit-tools/src/main/AndroidManifest.xml
  10. 76 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/CPDFAnnotationListFragment.java
  11. 102 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/adapter/CPDFAnnotListAdapter.java
  12. 116 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/bean/CPDFAnnotListItem.java
  13. 137 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/data/CPDFAnnotDatas.java
  14. 83 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/CAnnotStyleDialogFragment.java
  15. 39 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfannotstyle/adapter/CAnnotPropertiesFragmentAdapter.java
  16. 55 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfannotstyle/data/CPropertiesFragmentFactory.java
  17. 144 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfattr/CAnnotAttr.java
  18. 337 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfattr/CAnnotStyle.java
  19. 43 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfmarkup/CLinkStyleFragment.java
  20. 45 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfmarkup/CMarkupStyleFragment.java
  21. 14 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfnote/CPDFtextAnnotAttachHelper.java
  22. 17 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfnote/CPDFtextAnnotImpl.java
  23. 207 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/adapter/CBaseQuickAdapter.java
  24. 120 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/adapter/CBaseQuickViewHolder.java
  25. 31 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/date/CDateUtil.java
  26. 127 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/CAnnotationToolbar.java
  27. 72 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/adapter/CPDFAnnotationToolListAdapter.java
  28. 54 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/bean/CAnnotToolBean.java
  29. 32 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/bean/CAnnotationType.java
  30. 34 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/data/CAnnotationToolDatas.java
  31. 10 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfbota/adapter/CBotaViewPagerAdapter.java
  32. 27 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/basic/CBasicPropertiesFragment.java
  33. 58 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/colorlist/CColorItemBean.java
  34. 81 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/colorlist/CColorListAdapter.java
  35. 141 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/colorlist/CColorListView.java
  36. 163 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/sliderbar/CSliderBar.java
  37. 19 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/CPDFViewCtrl.java
  38. 25 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/ContextMenuMarkupContentView.java
  39. 10 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/interfaces/CBaseContextMenuHelper.java
  40. 15 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/interfaces/ContextMenuHelperMarkup.java
  41. 5 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/window/CMenuWindowLayout.java
  42. 3 20
      compdfkit-tools/src/main/java/com/compdfkit/tools/viewer/pdfinfo/CPDFDocumentInfoDialogFragment.java
  43. 6 0
      compdfkit-tools/src/main/res/color/tools_annotation_fun_status_color.xml
  44. 5 0
      compdfkit-tools/src/main/res/drawable/tools_annot_style_dialog_window_bg.xml
  45. 18 0
      compdfkit-tools/src/main/res/drawable/tools_annotation_tool_list_item_bg.xml
  46. 5 0
      compdfkit-tools/src/main/res/drawable/tools_color_item_color.xml
  47. 12 0
      compdfkit-tools/src/main/res/drawable/tools_color_item_color_picker.xml
  48. 11 0
      compdfkit-tools/src/main/res/drawable/tools_common_btn_corner_ripple.xml
  49. 19 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_deleteline.xml
  50. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_freetext.xml
  51. 19 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_highlight.xml
  52. 19 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_ink.xml
  53. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_link.xml
  54. 27 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_note.xml
  55. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_pic.xml
  56. 14 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_redo.xml
  57. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_setting.xml
  58. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape.xml
  59. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_arrow.xml
  60. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_circular.xml
  61. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_line.xml
  62. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_rectangle.xml
  63. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_sign.xml
  64. 19 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_squiggly.xml
  65. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_stamp.xml
  66. 19 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_underline.xml
  67. 13 0
      compdfkit-tools/src/main/res/drawable/tools_ic_annotation_undo.xml
  68. 19 0
      compdfkit-tools/src/main/res/layout/tools_annot_list_item.xml
  69. 82 0
      compdfkit-tools/src/main/res/layout/tools_annot_list_item_content.xml
  70. 43 0
      compdfkit-tools/src/main/res/layout/tools_annot_list_item_header.xml
  71. 38 0
      compdfkit-tools/src/main/res/layout/tools_annot_style_dialog_fragment.xml
  72. 55 0
      compdfkit-tools/src/main/res/layout/tools_annot_tool_bar.xml
  73. 16 0
      compdfkit-tools/src/main/res/layout/tools_anotation_list_fragment.xml
  74. 36 0
      compdfkit-tools/src/main/res/layout/tools_color_list_item.xml
  75. 27 0
      compdfkit-tools/src/main/res/layout/tools_color_list_view_layout.xml
  76. 37 0
      compdfkit-tools/src/main/res/layout/tools_common_slider_bar.xml
  77. 32 0
      compdfkit-tools/src/main/res/layout/tools_properties_markup_style_fragment.xml
  78. 2 1
      compdfkit-tools/src/main/res/layout/tools_search_keywords_list_item.xml
  79. 1 1
      compdfkit-tools/src/main/res/layout/tools_search_keywords_list_item_header.xml
  80. 63 0
      compdfkit-tools/src/main/res/values-night/tools_themes.xml
  81. 18 0
      compdfkit-tools/src/main/res/values/tools_annot_properties_colors.xml
  82. 19 0
      compdfkit-tools/src/main/res/values/tools_attrs.xml
  83. 102 0
      compdfkit-tools/src/main/res/values/tools_colors.xml
  84. 7 0
      compdfkit-tools/src/main/res/values/tools_strings.xml
  85. 11 1
      compdfkit-tools/src/main/res/values/tools_styles.xml
  86. 65 0
      compdfkit-tools/src/main/res/values/tools_themes.xml

Разница между файлами не показана из-за своего большого размера
+ 8 - 0
annotation-ctrl-demo/src/main/AndroidManifest.xml


BIN
annotation-ctrl-demo/src/main/assets/Quick Start Guide V2.4.0.pdf


+ 49 - 1
annotation-ctrl-demo/src/main/java/com/compdfkit/demo/annotation/MainActivity.java

@@ -3,12 +3,60 @@ package com.compdfkit.demo.annotation;
 import android.os.Bundle;
 
 import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
+
+import com.compdfkit.demo.annotation.databinding.ActivityMainBinding;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotationType;
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotAttr;
+import com.compdfkit.tools.common.utils.task.CExtractAssetFileTask;
+import com.compdfkit.tools.common.views.pdfbota.CPDFBOTA;
+import com.compdfkit.tools.common.views.pdfbota.CPDFBotaDialogFragment;
+import com.compdfkit.tools.common.views.pdfbota.CPDFBotaFragmentTabs;
 
 public class MainActivity extends AppCompatActivity {
 
+    /**
+     * assets folder pdf file
+     */
+    public static final String QUICK_START_GUIDE = "Quick Start Guide V2.4.0.pdf";
+
+    private ActivityMainBinding binding;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
+        binding = ActivityMainBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+        //Extract PDF files from the Android assets folder
+        CExtractAssetFileTask.extract(this, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> binding.pdfView.openPDF(filePath));
+        binding.annotationToolBar.initWithPDFView(binding.pdfView);
+        binding.annotationToolBar.setFragmentManager(getSupportFragmentManager());
+        initAnnotationAttributes();
+        initListener();
+    }
+    private void initListener(){
+        binding.pdfToolBar.setBoTaBtnClickListener(v -> {
+            CPDFBotaDialogFragment dialogFragment = CPDFBotaDialogFragment.newInstance();
+            dialogFragment.initWithPDFView(binding.pdfView);
+            CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.ANNOTATION, "Annotations");
+            dialogFragment.setBotaDialogTab(annotationTab);
+            dialogFragment.show(getSupportFragmentManager(), "annotationList");
+        });
+    }
+
+
+    private void initAnnotationAttributes() {
+        int defaultColor = ContextCompat.getColor(this, R.color.tools_annotation_markup_default_color);
+
+        new CAnnotAttr.Builder(binding.pdfView)
+                .setMarkup(CAnnotationType.HIGHLIGHT, defaultColor, 255)
+                .setMarkup(CAnnotationType.UNDERLINE, defaultColor, 255)
+                .setMarkup(CAnnotationType.SQUIGGLY, defaultColor, 255)
+                .setMarkup(CAnnotationType.STRIKEOUT, defaultColor, 255)
+                .setShape(CAnnotationType.SQUARE, defaultColor, 255, defaultColor, 255, 5)
+                .setShape(CAnnotationType.CIRCLE, defaultColor, 255, defaultColor, 255, 5)
+                .setShape(CAnnotationType.LINE, defaultColor, 255, defaultColor, 255, 5)
+                .setInkAttribute(defaultColor, 255)
+                .init();
     }
 }

+ 30 - 7
annotation-ctrl-demo/src/main/res/layout/activity_main.xml

@@ -6,13 +6,36 @@
     android:layout_height="match_parent"
     tools:context=".MainActivity">
 
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Hello World!"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
+    <com.compdfkit.tools.common.views.CPDFToolBar
+        android:id="@+id/pdf_tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?android:attr/actionBarSize"
+        app:layout_constraintTop_toTopOf="parent"
+        android:elevation="4dp"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent"
+        app:tools_toolbar_title="@string/annotation_title"
+        />
+
+
+
+    <com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl
+        android:id="@+id/pdf_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:tools_enable_page_indicator="true"
+        app:tools_enable_slider_bar="true"
+        app:tools_slider_bar_position="right"
+        app:layout_constrainedHeight="true"
+        app:tools_slider_bar_icon="@drawable/tools_ic_pdf_slider_bar"
+        app:layout_constraintTop_toBottomOf="@id/pdf_tool_bar"
+        app:layout_constraintBottom_toTopOf="@id/annotation_tool_bar"/>
+
+
+    <com.compdfkit.tools.common.views.pdfannotationbar.CAnnotationToolbar
+        android:id="@+id/annotation_tool_bar"
+        android:layout_width="match_parent"
+        android:layout_height="?android:attr/actionBarSize"
+        app:layout_constraintBottom_toBottomOf="parent"/>
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 26 - 11
annotation-ctrl-demo/src/main/res/values-night/themes.xml

@@ -1,16 +1,31 @@
 <resources>
     <!-- Base application theme. -->
     <style name="Theme.Compdfkit_android_demo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
-        <!-- Primary brand color. -->
-        <item name="colorPrimary">@color/purple_200</item>
-        <item name="colorPrimaryVariant">@color/purple_700</item>
-        <item name="colorOnPrimary">@color/black</item>
-        <!-- Secondary brand color. -->
-        <item name="colorSecondary">@color/teal_200</item>
-        <item name="colorSecondaryVariant">@color/teal_200</item>
-        <item name="colorOnSecondary">@color/black</item>
-        <!-- Status bar color. -->
-        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
-        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/md_theme_dark_primary</item>
+        <item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/md_theme_dark_secondary</item>
+        <item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/md_theme_dark_tertiary</item>
+        <item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
+        <item name="colorError">@color/md_theme_dark_error</item>
+        <item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
+        <item name="colorOnError">@color/md_theme_dark_onError</item>
+        <item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
+        <item name="android:colorBackground">@color/md_theme_dark_background</item>
+        <item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
+        <item name="colorOutline">@color/md_theme_dark_outline</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
+        <item name="colorSurface">@color/md_theme_dark_surface</item>
+        <item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
+        <item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant</item>
+        <item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary</item>
     </style>
 </resources>

+ 101 - 0
annotation-ctrl-demo/src/main/res/values/colors.xml

@@ -7,4 +7,105 @@
     <color name="teal_700">#FF018786</color>
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
+
+
+
+    <color name="md_theme_light_primary">#006A62</color>
+    <color name="md_theme_light_onPrimary">#FFFFFF</color>
+    <color name="md_theme_light_primaryContainer">#73F8E8</color>
+    <color name="md_theme_light_onPrimaryContainer">#00201D</color>
+    <color name="md_theme_light_primaryFixed">#73F8E8</color>
+    <color name="md_theme_light_onPrimaryFixed">#00201D</color>
+    <color name="md_theme_light_primaryFixedDim">#52DBCC</color>
+    <color name="md_theme_light_onPrimaryFixedVariant">#005049</color>
+    <color name="md_theme_light_secondary">#4A635F</color>
+    <color name="md_theme_light_onSecondary">#FFFFFF</color>
+    <color name="md_theme_light_secondaryContainer">#CCE8E3</color>
+    <color name="md_theme_light_onSecondaryContainer">#051F1D</color>
+    <color name="md_theme_light_secondaryFixed">#CCE8E3</color>
+    <color name="md_theme_light_onSecondaryFixed">#051F1D</color>
+    <color name="md_theme_light_secondaryFixedDim">#B1CCC7</color>
+    <color name="md_theme_light_onSecondaryFixedVariant">#324B48</color>
+    <color name="md_theme_light_tertiary">#46617A</color>
+    <color name="md_theme_light_onTertiary">#FFFFFF</color>
+    <color name="md_theme_light_tertiaryContainer">#CDE5FF</color>
+    <color name="md_theme_light_onTertiaryContainer">#001D32</color>
+    <color name="md_theme_light_tertiaryFixed">#CDE5FF</color>
+    <color name="md_theme_light_onTertiaryFixed">#001D32</color>
+    <color name="md_theme_light_tertiaryFixedDim">#AEC9E6</color>
+    <color name="md_theme_light_onTertiaryFixedVariant">#2E4961</color>
+    <color name="md_theme_light_error">#BA1A1A</color>
+    <color name="md_theme_light_errorContainer">#FFDAD6</color>
+    <color name="md_theme_light_onError">#FFFFFF</color>
+    <color name="md_theme_light_onErrorContainer">#410002</color>
+    <color name="md_theme_light_background">#FAFDFB</color>
+    <color name="md_theme_light_onBackground">#191C1C</color>
+    <color name="md_theme_light_outline">#6F7977</color>
+    <color name="md_theme_light_inverseOnSurface">#EFF1EF</color>
+    <color name="md_theme_light_inverseSurface">#2D3130</color>
+    <color name="md_theme_light_inversePrimary">#52DBCC</color>
+    <color name="md_theme_light_shadow">#000000</color>
+    <color name="md_theme_light_surfaceTint">#006A62</color>
+    <color name="md_theme_light_outlineVariant">#BEC9C6</color>
+    <color name="md_theme_light_scrim">#000000</color>
+    <color name="md_theme_light_surface">#F7FAF8</color>
+    <color name="md_theme_light_onSurface">#191C1C</color>
+    <color name="md_theme_light_surfaceVariant">#DAE5E2</color>
+    <color name="md_theme_light_onSurfaceVariant">#3F4947</color>
+    <color name="md_theme_light_surfaceContainerHighest">#E0E3E1</color>
+    <color name="md_theme_light_surfaceContainerHigh">#E6E9E7</color>
+    <color name="md_theme_light_surfaceContainer">#ECEEED</color>
+    <color name="md_theme_light_surfaceContainerLow">#F2F4F2</color>
+    <color name="md_theme_light_surfaceContainerLowest">#FFFFFF</color>
+    <color name="md_theme_light_surfaceDim">#D8DBD9</color>
+    <color name="md_theme_light_surfaceBright">#F7FAF8</color>
+    <color name="md_theme_dark_primary">#52DBCC</color>
+    <color name="md_theme_dark_onPrimary">#003732</color>
+    <color name="md_theme_dark_primaryContainer">#005049</color>
+    <color name="md_theme_dark_onPrimaryContainer">#73F8E8</color>
+    <color name="md_theme_dark_primaryFixed">#73F8E8</color>
+    <color name="md_theme_dark_onPrimaryFixed">#00201D</color>
+    <color name="md_theme_dark_primaryFixedDim">#52DBCC</color>
+    <color name="md_theme_dark_onPrimaryFixedVariant">#005049</color>
+    <color name="md_theme_dark_secondary">#B1CCC7</color>
+    <color name="md_theme_dark_onSecondary">#1C3531</color>
+    <color name="md_theme_dark_secondaryContainer">#324B48</color>
+    <color name="md_theme_dark_onSecondaryContainer">#CCE8E3</color>
+    <color name="md_theme_dark_secondaryFixed">#CCE8E3</color>
+    <color name="md_theme_dark_onSecondaryFixed">#051F1D</color>
+    <color name="md_theme_dark_secondaryFixedDim">#B1CCC7</color>
+    <color name="md_theme_dark_onSecondaryFixedVariant">#324B48</color>
+    <color name="md_theme_dark_tertiary">#AEC9E6</color>
+    <color name="md_theme_dark_onTertiary">#163349</color>
+    <color name="md_theme_dark_tertiaryContainer">#2E4961</color>
+    <color name="md_theme_dark_onTertiaryContainer">#CDE5FF</color>
+    <color name="md_theme_dark_tertiaryFixed">#CDE5FF</color>
+    <color name="md_theme_dark_onTertiaryFixed">#001D32</color>
+    <color name="md_theme_dark_tertiaryFixedDim">#AEC9E6</color>
+    <color name="md_theme_dark_onTertiaryFixedVariant">#2E4961</color>
+    <color name="md_theme_dark_error">#FFB4AB</color>
+    <color name="md_theme_dark_errorContainer">#93000A</color>
+    <color name="md_theme_dark_onError">#690005</color>
+    <color name="md_theme_dark_onErrorContainer">#FFDAD6</color>
+    <color name="md_theme_dark_background">#191C1C</color>
+    <color name="md_theme_dark_onBackground">#E0E3E1</color>
+    <color name="md_theme_dark_outline">#899390</color>
+    <color name="md_theme_dark_inverseOnSurface">#191C1C</color>
+    <color name="md_theme_dark_inverseSurface">#E0E3E1</color>
+    <color name="md_theme_dark_inversePrimary">#006A62</color>
+    <color name="md_theme_dark_shadow">#000000</color>
+    <color name="md_theme_dark_surfaceTint">#52DBCC</color>
+    <color name="md_theme_dark_outlineVariant">#3F4947</color>
+    <color name="md_theme_dark_scrim">#000000</color>
+    <color name="md_theme_dark_surface">#101413</color>
+    <color name="md_theme_dark_onSurface">#C4C7C5</color>
+    <color name="md_theme_dark_surfaceVariant">#3F4947</color>
+    <color name="md_theme_dark_onSurfaceVariant">#BEC9C6</color>
+    <color name="md_theme_dark_surfaceContainerHighest">#323535</color>
+    <color name="md_theme_dark_surfaceContainerHigh">#272B2A</color>
+    <color name="md_theme_dark_surfaceContainer">#1D2020</color>
+    <color name="md_theme_dark_surfaceContainerLow">#191C1C</color>
+    <color name="md_theme_dark_surfaceContainerLowest">#0B0F0E</color>
+    <color name="md_theme_dark_surfaceDim">#101413</color>
+    <color name="md_theme_dark_surfaceBright">#363A39</color>
 </resources>

+ 2 - 0
annotation-ctrl-demo/src/main/res/values/strings.xml

@@ -1,3 +1,5 @@
 <resources>
     <string name="app_name">annotation-ctrl-demo</string>
+
+    <string name="annotation_title">Annotation</string>
 </resources>

+ 28 - 12
annotation-ctrl-demo/src/main/res/values/themes.xml

@@ -1,16 +1,32 @@
 <resources>
     <!-- Base application theme. -->
-    <style name="Theme.Compdfkit_android_demo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
-        <!-- Primary brand color. -->
-        <item name="colorPrimary">@color/purple_500</item>
-        <item name="colorPrimaryVariant">@color/purple_700</item>
-        <item name="colorOnPrimary">@color/white</item>
-        <!-- Secondary brand color. -->
-        <item name="colorSecondary">@color/teal_200</item>
-        <item name="colorSecondaryVariant">@color/teal_700</item>
-        <item name="colorOnSecondary">@color/black</item>
-        <!-- Status bar color. -->
-        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
-        <!-- Customize your theme here. -->
+    <style name="Theme.Compdfkit_android_demo" parent="Theme.MaterialComponents.DayNight.NoActionBar">
+        <item name="colorPrimary">@color/md_theme_light_primary</item>
+        <item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/md_theme_light_secondary</item>
+        <item name="colorOnSecondary">@color/md_theme_light_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/md_theme_light_tertiary</item>
+        <item name="colorOnTertiary">@color/md_theme_light_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer</item>
+        <item name="colorError">@color/md_theme_light_error</item>
+        <item name="colorErrorContainer">@color/md_theme_light_errorContainer</item>
+        <item name="colorOnError">@color/md_theme_light_onError</item>
+        <item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
+        <item name="android:colorBackground">@color/md_theme_light_background</item>
+        <item name="colorOnBackground">@color/md_theme_light_onBackground</item>
+        <item name="colorOutline">@color/md_theme_light_outline</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item>
+        <item name="colorSurface">@color/md_theme_light_surface</item>
+        <item name="colorOnSurface">@color/md_theme_light_onSurface</item>
+        <item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant</item>
+        <item name="colorPrimaryInverse">@color/md_theme_light_inversePrimary</item>
+        <item name="android:statusBarColor">@color/md_theme_light_primary</item>
     </style>
 </resources>

+ 3 - 2
compdfkit-tools/src/main/AndroidManifest.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest package="com.compdfkit.tools">
-
+<manifest package="com.compdfkit.tools"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <application android:supportsRtl="true"/>
 
 </manifest>

+ 76 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/CPDFAnnotationListFragment.java

@@ -0,0 +1,76 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.annotation.pdfannotationlist;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.annotation.pdfannotationlist.adapter.CPDFAnnotListAdapter;
+import com.compdfkit.tools.annotation.pdfannotationlist.bean.CPDFAnnotListItem;
+import com.compdfkit.tools.annotation.pdfannotationlist.data.CPDFAnnotDatas;
+import com.compdfkit.tools.common.interfaces.OnSetPDFDisplayPageIndexListener;
+import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
+
+
+public class CPDFAnnotationListFragment  extends Fragment {
+
+    private RecyclerView rvAnnotation;
+
+    private CPDFViewCtrl pdfView;
+
+    private OnSetPDFDisplayPageIndexListener displayPageIndexListener;
+
+    public static CPDFAnnotationListFragment newInstance() {
+        return new CPDFAnnotationListFragment();
+    }
+
+    public void initWithPDFView(CPDFViewCtrl pdfView){
+        this.pdfView = pdfView;
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.tools_anotation_list_fragment, container, false);
+        rvAnnotation = rootView.findViewById(R.id.rv_annotation);
+        return rootView;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        CPDFAnnotListAdapter listAdapter = new CPDFAnnotListAdapter();
+        listAdapter.setList(CPDFAnnotDatas.getAnnotationList(pdfView));
+        listAdapter.addOnItemChildClickListener(R.id.card_view,(adapter, view1, position) -> {
+            CPDFAnnotListItem item = adapter.list.get(position);
+            if (!item.isHeader()){
+                if (displayPageIndexListener != null) {
+                    displayPageIndexListener.displayPage(item.getPage());
+                }
+            }
+        });
+        rvAnnotation.setLayoutManager(new LinearLayoutManager(getContext()));
+        rvAnnotation.setAdapter(listAdapter);
+    }
+
+    public void setPDFDisplayPageIndexListener(OnSetPDFDisplayPageIndexListener displayPageIndexListener) {
+        this.displayPageIndexListener = displayPageIndexListener;
+    }
+
+}

+ 102 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/adapter/CPDFAnnotListAdapter.java

@@ -0,0 +1,102 @@
+/**
+ * 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.annotation.pdfannotationlist.adapter;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.annotation.pdfannotationlist.bean.CPDFAnnotListItem;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickAdapter;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickViewHolder;
+
+import java.util.HashMap;
+
+
+public class CPDFAnnotListAdapter  extends CBaseQuickAdapter<CPDFAnnotListItem, CBaseQuickViewHolder> {
+
+    private static final int ITEM_HEADER = 1;
+
+    private static final int ITEM_CONTENT = 2;
+
+    private static final HashMap<CPDFAnnotation.Type, Integer> ICON_RES_IDS = new HashMap<>();
+
+    static {
+        ICON_RES_IDS.put(CPDFAnnotation.Type.TEXT, R.drawable.tools_ic_annotation_note);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.HIGHLIGHT, R.drawable.tools_ic_annotation_highlight);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.UNDERLINE, R.drawable.tools_ic_annotation_underline);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.SQUIGGLY, R.drawable.tools_ic_annotation_squiggly);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.STRIKEOUT, R.drawable.tools_ic_annotation_deleteline);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.FREETEXT, R.drawable.tools_ic_annotation_freetext);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.INK, R.drawable.tools_ic_annotation_ink);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.LINE, R.drawable.tools_ic_annotation_shape_line);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.SQUARE, R.drawable.tools_ic_annotation_shape_rectangle);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.CIRCLE, R.drawable.tools_ic_annotation_shape_circular);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.STAMP, R.drawable.tools_ic_annotation_stamp);
+        ICON_RES_IDS.put(CPDFAnnotation.Type.LINK, R.drawable.tools_ic_annotation_link);
+    }
+
+
+    @Override
+    protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
+        if (viewType == ITEM_HEADER){
+            return new CBaseQuickViewHolder(R.layout.tools_annot_list_item_header, parent);
+        }else {
+            return new CBaseQuickViewHolder(R.layout.tools_annot_list_item_content, parent);
+        }
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CPDFAnnotListItem item) {
+        if (item.isHeader()){
+            holder.setText(R.id.id_item_annot_head_page, String.valueOf(item.getPage() + 1));
+            holder.setText(R.id.id_item_annot_count, String.valueOf(item.getAnnotationCount()));
+        }else {
+            Integer annotIcon = ICON_RES_IDS.get(item.getAnnotType());
+            if (annotIcon != null) {
+                if (item.getAnnotType() == CPDFAnnotation.Type.LINE){
+                    if (item.isArrowLine()){
+                        holder.setImageResource(R.id.iv_annot_icon, R.drawable.tools_ic_annotation_shape_arrow);
+                    }else {
+                        holder.setImageResource(R.id.iv_annot_icon, annotIcon);
+                    }
+                }else {
+                    holder.setImageResource(R.id.iv_annot_icon, annotIcon);
+                }
+            }
+            switch (item.getAnnotType()){
+                case HIGHLIGHT:
+                case UNDERLINE:
+                case SQUIGGLY:
+                case STRIKEOUT:
+                case INK:
+                    holder.setBackgroundColor(R.id.view_icon_bg, item.getColor());
+                    break;
+                default:
+                    holder.setBackgroundColor(R.id.view_icon_bg, 0);
+                    break;
+            }
+            holder.setVisible(R.id.tv_annot_content, !TextUtils.isEmpty(item.getContent()));
+            holder.setText(R.id.tv_annot_content, item.getContent());
+            holder.setText(R.id.tv_annot_date, item.getModifyDate());
+        }
+
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+       return list.get(position).isHeader() ? ITEM_HEADER : ITEM_CONTENT;
+    }
+
+}

+ 116 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/bean/CPDFAnnotListItem.java

@@ -0,0 +1,116 @@
+/**
+ * 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.annotation.pdfannotationlist.bean;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+
+public class CPDFAnnotListItem {
+
+    private CPDFAnnotation.Type annotType;
+
+    private boolean isArrowLine = false;
+
+    private String modifyDate;
+
+    private int color;
+
+    private int colorAlpha;
+
+    private String content;
+
+    private boolean isHeader;
+
+    private int annotationCount;
+
+    private int page;
+
+    private CPDFAnnotation attr;
+
+    public CPDFAnnotation.Type getAnnotType() {
+        return annotType;
+    }
+
+    public void setAnnotType(CPDFAnnotation.Type annotType) {
+        this.annotType = annotType;
+    }
+
+    public boolean isArrowLine() {
+        return isArrowLine;
+    }
+
+    public void setArrowLine(boolean arrowLine) {
+        isArrowLine = arrowLine;
+    }
+
+    public String getModifyDate() {
+        return modifyDate;
+    }
+
+    public void setModifyDate(String modifyDate) {
+        this.modifyDate = modifyDate;
+    }
+
+    public int getColor() {
+        return color;
+    }
+
+    public void setColor(int color) {
+        this.color = color;
+    }
+
+    public int getColorAlpha() {
+        return colorAlpha;
+    }
+
+    public void setColorAlpha(int colorAlpha) {
+        this.colorAlpha = colorAlpha;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public boolean isHeader() {
+        return isHeader;
+    }
+
+    public void setHeader(boolean header) {
+        isHeader = header;
+    }
+
+    public int getAnnotationCount() {
+        return annotationCount;
+    }
+
+    public void setAnnotationCount(int annotationCount) {
+        this.annotationCount = annotationCount;
+    }
+
+    public int getPage() {
+        return page;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public CPDFAnnotation getAttr() {
+        return attr;
+    }
+
+    public void setAttr(CPDFAnnotation attr) {
+        this.attr = attr;
+    }
+}

+ 137 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/data/CPDFAnnotDatas.java

@@ -0,0 +1,137 @@
+package com.compdfkit.tools.annotation.pdfannotationlist.data;
+
+
+import android.graphics.Color;
+
+import androidx.annotation.Nullable;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.CPDFFreetextAnnotation;
+import com.compdfkit.core.annotation.CPDFHighlightAnnotation;
+import com.compdfkit.core.annotation.CPDFInkAnnotation;
+import com.compdfkit.core.annotation.CPDFLineAnnotation;
+import com.compdfkit.core.annotation.CPDFSquigglyAnnotation;
+import com.compdfkit.core.annotation.CPDFStampAnnotation;
+import com.compdfkit.core.annotation.CPDFStrikeoutAnnotation;
+import com.compdfkit.core.annotation.CPDFTextAnnotation;
+import com.compdfkit.core.annotation.CPDFUnderlineAnnotation;
+import com.compdfkit.core.common.CPDFDate;
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.tools.annotation.pdfannotationlist.bean.CPDFAnnotListItem;
+import com.compdfkit.tools.common.utils.date.CDateUtil;
+import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CPDFAnnotDatas {
+
+    public static List<CPDFAnnotListItem> getAnnotationList(@Nullable CPDFViewCtrl pdfView) {
+        if (pdfView == null){
+            return new ArrayList<>();
+        }
+        List<CPDFAnnotListItem> list = new ArrayList<>();
+        CPDFDocument document = pdfView.getCPdfReaderView().getPDFDocument();
+        int count = document.getPageCount();
+
+        for (int i = 0; i <= count - 1; i++) {
+            List<CPDFAnnotation> pageAnnotations = document.pageAtIndex(i).getAnnotations();
+            List<CPDFAnnotListItem> annotListItems = convertPageAnnotations(pageAnnotations, i);
+            if (annotListItems.size() > 0){
+                CPDFAnnotListItem headerItem = new CPDFAnnotListItem();
+                headerItem.setHeader(true);
+                headerItem.setAnnotationCount(annotListItems.size());
+                headerItem.setPage(i);
+                list.add(headerItem);
+                list.addAll(annotListItems);
+            }
+        }
+        return list;
+    }
+
+    private static List<CPDFAnnotListItem> convertPageAnnotations(List<CPDFAnnotation> list, int page){
+        List<CPDFAnnotListItem> annotListItems = new ArrayList<>();
+        for (CPDFAnnotation cpdfAnnotation : list) {
+            CPDFAnnotation.Type type = cpdfAnnotation.getType();
+            boolean isArrowLine = true;
+            int attrColor = Color.TRANSPARENT;
+            String attrTime = "";
+            if (null != cpdfAnnotation.getCreationDate()){
+                attrTime = CPDFDate.toStandardDate(cpdfAnnotation.getCreationDate());
+            }
+            int attrAlpha = 0;
+            String attrContent = "";
+            if (!cpdfAnnotation.isValid()) {
+                return annotListItems;
+            }
+            switch (cpdfAnnotation.getType()){
+                case HIGHLIGHT:
+                    CPDFHighlightAnnotation highlightAnnotation = (CPDFHighlightAnnotation) cpdfAnnotation;
+                    attrColor = highlightAnnotation.getColor();
+                    attrAlpha = highlightAnnotation.getAlpha();
+                    attrContent = highlightAnnotation.getMarkedText();
+                    break;
+                case UNDERLINE:
+                    CPDFUnderlineAnnotation underlineAnnotation = (CPDFUnderlineAnnotation) cpdfAnnotation;
+                    attrColor = underlineAnnotation.getColor();
+                    attrAlpha = underlineAnnotation.getAlpha();
+                    attrContent = underlineAnnotation.getMarkedText();
+                    break;
+                case STRIKEOUT:
+                    CPDFStrikeoutAnnotation strikeoutAnnotation = (CPDFStrikeoutAnnotation) cpdfAnnotation;
+                    attrColor = strikeoutAnnotation.getColor();
+                    attrAlpha = strikeoutAnnotation.getAlpha();
+                    attrContent = strikeoutAnnotation.getMarkedText();
+                    break;
+                case SQUIGGLY:
+                    CPDFSquigglyAnnotation squigglyAnnotation = (CPDFSquigglyAnnotation) cpdfAnnotation;
+                    attrColor = squigglyAnnotation.getColor();
+                    attrAlpha = squigglyAnnotation.getAlpha();
+                    attrContent = squigglyAnnotation.getMarkedText();
+                    break;
+                case INK:
+                    CPDFInkAnnotation cpdfInkAnnotation = (CPDFInkAnnotation) cpdfAnnotation;
+                    attrColor = cpdfInkAnnotation.getColor();
+                    attrAlpha = cpdfInkAnnotation.getAlpha();
+                    break;
+                case LINE:
+                    CPDFLineAnnotation lineAnnotation = (CPDFLineAnnotation) cpdfAnnotation;
+                    isArrowLine = lineAnnotation.getLineHeadType() == CPDFLineAnnotation.LineType.LINETYPE_ARROW;
+                    break;
+                case FREETEXT:
+                    CPDFFreetextAnnotation annotation = (CPDFFreetextAnnotation) cpdfAnnotation;
+                    attrContent = annotation.getContent();
+                    break;
+                case STAMP:
+                    CPDFStampAnnotation stampAnnotation = (CPDFStampAnnotation) cpdfAnnotation;
+                    if (stampAnnotation.isStampSignature()){
+                        continue;
+                    }
+                    break;
+                case TEXT:
+                    CPDFTextAnnotation textAnnotation = (CPDFTextAnnotation) cpdfAnnotation;
+                    attrContent = textAnnotation.getContent();
+                    break;
+                case SQUARE:
+                case CIRCLE:
+                    break;
+                default:
+                    continue;
+            }
+            CPDFAnnotListItem item = new CPDFAnnotListItem();
+            item.setAnnotType(type);
+            item.setArrowLine(isArrowLine);
+            item.setModifyDate(CDateUtil.transformPDFDate(attrTime));
+            item.setColor(attrColor);
+            item.setColorAlpha(attrAlpha);
+            item.setContent(attrContent);
+            item.setPage(page);
+            item.setAnnotationCount(0);
+            item.setAttr(cpdfAnnotation);
+            item.setHeader(false);
+            annotListItems.add(item);
+        }
+        return annotListItems;
+    }
+
+}

+ 83 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/CAnnotStyleDialogFragment.java

@@ -0,0 +1,83 @@
+package com.compdfkit.tools.annotation.pdfproperties;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager2.widget.ViewPager2;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.annotation.pdfproperties.pdfannotstyle.adapter.CAnnotPropertiesFragmentAdapter;
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+import com.compdfkit.tools.common.views.CToolBar;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CAnnotStyleDialogFragment extends BottomSheetDialogFragment {
+
+
+    private CToolBar toolBar;
+
+    private ViewPager2 viewPager;
+
+    private CAnnotStyle style;
+
+    public static CAnnotStyleDialogFragment newInstance(CAnnotStyle style){
+        CAnnotStyleDialogFragment dialogFragment = new CAnnotStyleDialogFragment();
+        dialogFragment.setStyle(style);
+        return dialogFragment;
+    }
+
+    public void setStyle(CAnnotStyle style){
+        this.style = style;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BottomSheetDialogStyle);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.tools_annot_style_dialog_fragment, container, false);
+        toolBar = rootView.findViewById(R.id.tool_bar);
+        viewPager = rootView.findViewById(R.id.view_pager);
+        return rootView;
+    }
+
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        if (style != null) {
+            toolBar.setTitle(style.getAnnotTypeTitle(getContext()));
+        }
+        toolBar.setOnClickListener(v -> {
+            dismiss();
+        });
+        initViewPager();
+    }
+
+    private void initViewPager(){
+        if (style != null){
+            CAnnotPropertiesFragmentAdapter adapter = new CAnnotPropertiesFragmentAdapter(style, getChildFragmentManager(), getLifecycle());
+            viewPager.setAdapter(adapter);
+            viewPager.setUserInputEnabled(false);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        outState.putParcelable("extra_annot_style", style);
+        super.onSaveInstanceState(outState);
+    }
+
+}

+ 39 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfannotstyle/adapter/CAnnotPropertiesFragmentAdapter.java

@@ -0,0 +1,39 @@
+package com.compdfkit.tools.annotation.pdfproperties.pdfannotstyle.adapter;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import com.compdfkit.tools.annotation.pdfproperties.pdfannotstyle.data.CPropertiesFragmentFactory;
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CAnnotPropertiesFragmentAdapter  extends FragmentStateAdapter {
+
+    private CAnnotStyle style;
+
+    private List<Class<? extends CBasicPropertiesFragment>> propertiesClass = new ArrayList<>();
+
+    public CAnnotPropertiesFragmentAdapter(CAnnotStyle style, @NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
+        super(fragmentManager, lifecycle);
+        this.style = style;
+        propertiesClass = CPropertiesFragmentFactory.getPropertiesFragmentClass(style);
+    }
+
+    @NonNull
+    @Override
+    public Fragment createFragment(int position) {
+        return CPropertiesFragmentFactory.createPropertiesFragment(propertiesClass.get(position), style);
+    }
+
+    @Override
+    public int getItemCount() {
+        return propertiesClass.size();
+    }
+}

+ 55 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfannotstyle/data/CPropertiesFragmentFactory.java

@@ -0,0 +1,55 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.annotation.pdfproperties.pdfannotstyle.data;
+
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+import com.compdfkit.tools.annotation.pdfproperties.pdfmarkup.CMarkupStyleFragment;
+import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CPropertiesFragmentFactory {
+
+
+    public static List<Class<? extends CBasicPropertiesFragment>> getPropertiesFragmentClass(CAnnotStyle style) {
+        List<Class<? extends CBasicPropertiesFragment>> list = new ArrayList<>();
+        switch (style.getType()) {
+            case STRIKEOUT:
+            case HIGHLIGHT:
+            case UNDERLINE:
+            case SQUIGGLY:
+                list.addAll(markupFragments());
+                break;
+            default:
+               break;
+        }
+        return list;
+    }
+
+    public static <T extends CBasicPropertiesFragment> CBasicPropertiesFragment createPropertiesFragment(Class<T> tClass, CAnnotStyle style){
+        try{
+            CBasicPropertiesFragment fragment = tClass.getDeclaredConstructor().newInstance();
+            fragment.setStyle(style);
+            return fragment;
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+
+    private static List<Class<? extends CBasicPropertiesFragment>> markupFragments() {
+        List<Class<? extends CBasicPropertiesFragment>> list = new ArrayList<>();
+        list.add(CMarkupStyleFragment.class);
+        return list;
+    }
+
+}

+ 144 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfattr/CAnnotAttr.java

@@ -0,0 +1,144 @@
+package com.compdfkit.tools.annotation.pdfproperties.pdfattr;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.IntRange;
+
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotationType;
+import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
+import com.compdfkit.ui.attribute.CPDFAnnotAttribute;
+import com.compdfkit.ui.attribute.CPDFHighlightAttr;
+import com.compdfkit.ui.attribute.CPDFSquigglyAttr;
+import com.compdfkit.ui.attribute.CPDFStrikeoutAttr;
+import com.compdfkit.ui.attribute.CPDFUnderlineAttr;
+import com.compdfkit.ui.attribute.IAttributeCallback;
+
+import java.util.HashMap;
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2023/4/21
+ * description:
+ */
+public class CAnnotAttr {
+
+    private HashMap<CAnnotationType, CAnnotStyle> attrMaps = new HashMap<>();
+
+    private CPDFViewCtrl pdfView;
+
+    private boolean store;
+
+    public void apply(){
+        CPDFAnnotAttribute attribute = pdfView.getCPdfReaderView().getReaderAttribute().getAnnotAttribute();
+        for (CAnnotationType type : attrMaps.keySet()) {
+            CAnnotStyle params = attrMaps.get(type);
+            if (params == null){
+                continue;
+            }
+            IAttributeCallback callback = null;
+            switch (params.getType()) {
+                case HIGHLIGHT:
+                    CPDFHighlightAttr highlightAttr = attribute.getHighlightAttr();
+                    highlightAttr.setColor(params.getColor());
+                    highlightAttr.setAlpha(params.getColorAlpha());
+                    callback = highlightAttr;
+                    break;
+
+                case UNDERLINE:
+                    CPDFUnderlineAttr underlineAttr = attribute.getUnderlineAttr();
+                    underlineAttr.setColor(params.getColor());
+                    underlineAttr.setAlpha(params.getColorAlpha());
+                    callback = underlineAttr;
+                    break;
+
+                case SQUIGGLY:
+                    CPDFSquigglyAttr squigglyAttr = attribute.getSquigglyAttr();
+                    squigglyAttr.setColor(params.getColor());
+                    squigglyAttr.setAlpha(params.getColorAlpha());
+                    callback = squigglyAttr;
+                    break;
+
+                case STRIKEOUT:
+                    CPDFStrikeoutAttr strikeoutAttr= attribute.getStrikeoutAttr();
+                    strikeoutAttr.setColor(params.getColor());
+                    strikeoutAttr.setAlpha(params.getColorAlpha());
+                    callback = strikeoutAttr;
+                    break;
+                default:
+                    break;
+            }
+            if (store){
+                if (callback != null) {
+                    callback.onstore();
+                }
+            }
+        }
+    }
+
+
+
+    public static class Builder {
+        private HashMap<CAnnotationType, CAnnotStyle> attrMaps = new HashMap<>();
+
+        private CPDFViewCtrl pdfView;
+
+        public Builder(CPDFViewCtrl pdfView) {
+            this.pdfView = pdfView;
+        }
+
+        public Builder setMarkup(CAnnotationType type, @ColorInt int color, @IntRange(from = 0, to = 255) int colorAlpha) {
+            CAnnotStyle params = new CAnnotStyle(type);
+            params.setColor(color);
+            params.setColorAlpha(colorAlpha);
+            attrMaps.put(type, params);
+            return this;
+        }
+
+
+        public Builder setInkAttribute(@ColorInt int color, @IntRange(from = 0, to = 255) int colorAlpha) {
+            CAnnotStyle style = new CAnnotStyle(CAnnotationType.INK);
+            style.setColor(color);
+            style.setColorAlpha(colorAlpha);
+            attrMaps.put(CAnnotationType.INK, style);
+            return this;
+        }
+
+        public Builder setShape(CAnnotationType type,
+                                @ColorInt int lineColor,
+                                @IntRange(from = 0, to = 255) int lineColorAlpha,
+                                @ColorInt int fillColor,
+                                @IntRange(from = 0, to = 255) int fillColorAlpha,
+                                float borderWidth) {
+            CAnnotStyle params = new CAnnotStyle(type);
+            params.setLineColor(lineColor);
+            params.setLineColorAlpha(lineColorAlpha);
+            params.setFillColor( fillColor);
+            params.setFillColor(fillColorAlpha);
+            params.setBorderWidth(borderWidth);
+            attrMaps.put(type, params);
+            return this;
+        }
+
+        private CAnnotAttr create(){
+            CAnnotAttr annotationAttr = new CAnnotAttr();
+            annotationAttr.attrMaps = attrMaps;
+            annotationAttr.pdfView = pdfView;
+            return annotationAttr;
+        }
+
+        public void apply(){
+            create().apply();
+        }
+
+        public void onStore(){
+            CAnnotAttr annotationAttr = create();
+            annotationAttr.store = true;
+            annotationAttr.apply();
+        }
+
+        public void init(){
+            onStore();
+        }
+    }
+
+}

+ 337 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfattr/CAnnotStyle.java

@@ -0,0 +1,337 @@
+/**
+ * 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.annotation.pdfproperties.pdfattr;
+
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.core.content.ContextCompat;
+
+import com.compdfkit.core.annotation.CPDFLineAnnotation;
+import com.compdfkit.core.annotation.CPDFStampAnnotation;
+import com.compdfkit.core.annotation.CPDFTextAttribute;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotationType;
+
+public class CAnnotStyle implements Parcelable {
+
+    private CAnnotationType type;
+
+    private int color;
+
+    private int colorAlpha;
+
+    private float borderWidth;
+
+    private int lineColor;
+
+    private int lineColorAlpha;
+
+    private int fillColor;
+
+    private int fillAlpha;
+
+    private CPDFLineAnnotation.LineType startLineType;
+
+    private CPDFLineAnnotation.LineType endLineType;
+
+    private boolean fontBold;
+
+    private boolean fontItalic;
+
+    private int textColor;
+
+    private int textColorAlpha;
+
+    private int fontSize;
+
+    private CPDFTextAttribute.FontNameHelper.FontType fontType;
+
+    private String imagePath;
+
+    private String textStampContent;
+
+    private String textStampDate;
+
+    private CPDFStampAnnotation.TextStampShape textStampShape;
+
+    private CPDFStampAnnotation.TextStampColor textStampColor;
+
+    public CAnnotStyle(CAnnotationType type) {
+        this.type = type;
+    }
+
+    protected CAnnotStyle(Parcel in) {
+        color = in.readInt();
+        colorAlpha = in.readInt();
+        borderWidth = in.readFloat();
+        lineColor = in.readInt();
+        lineColorAlpha = in.readInt();
+        fillColor = in.readInt();
+        fillAlpha = in.readInt();
+        fontBold = in.readByte() != 0;
+        fontItalic = in.readByte() != 0;
+        textColor = in.readInt();
+        textColorAlpha = in.readInt();
+        fontSize = in.readInt();
+        imagePath = in.readString();
+        textStampContent = in.readString();
+        textStampDate = in.readString();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(color);
+        dest.writeInt(colorAlpha);
+        dest.writeFloat(borderWidth);
+        dest.writeInt(lineColor);
+        dest.writeInt(lineColorAlpha);
+        dest.writeInt(fillColor);
+        dest.writeInt(fillAlpha);
+        dest.writeByte((byte) (fontBold ? 1 : 0));
+        dest.writeByte((byte) (fontItalic ? 1 : 0));
+        dest.writeInt(textColor);
+        dest.writeInt(textColorAlpha);
+        dest.writeInt(fontSize);
+        dest.writeString(imagePath);
+        dest.writeString(textStampContent);
+        dest.writeString(textStampDate);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<CAnnotStyle> CREATOR = new Creator<CAnnotStyle>() {
+        @Override
+        public CAnnotStyle createFromParcel(Parcel in) {
+            return new CAnnotStyle(in);
+        }
+
+        @Override
+        public CAnnotStyle[] newArray(int size) {
+            return new CAnnotStyle[size];
+        }
+    };
+
+    public CAnnotationType getType() {
+        return type;
+    }
+
+    public void setType(CAnnotationType type) {
+        this.type = type;
+    }
+
+    public int getColor() {
+        return color;
+    }
+
+    public void setColor(@ColorInt int color) {
+        this.color = color;
+    }
+
+    public void setColor(Context context, @ColorRes int colorRes) {
+        this.color = ContextCompat.getColor(context, colorRes);
+    }
+
+    public int getColorAlpha() {
+        return colorAlpha;
+    }
+
+    public void setColorAlpha(@IntRange(from = 0, to = 255) int colorAlpha) {
+        this.colorAlpha = colorAlpha;
+    }
+
+    public float getBorderWidth() {
+        return borderWidth;
+    }
+
+    public void setBorderWidth(@FloatRange(from = 0.0) float borderWidth) {
+        this.borderWidth = borderWidth;
+    }
+
+    public int getLineColor() {
+        return lineColor;
+    }
+
+    public void setLineColor(@ColorInt int lineColor) {
+        this.lineColor = lineColor;
+    }
+
+    public void setLineColor(Context context, @ColorRes int colorRes) {
+        this.lineColor = ContextCompat.getColor(context, colorRes);
+    }
+
+    public int getLineColorAlpha() {
+        return lineColorAlpha;
+    }
+
+    public void setLineColorAlpha(@IntRange(from = 0, to = 255) int lineColorAlpha) {
+        this.lineColorAlpha = lineColorAlpha;
+    }
+
+    public int getFillColor() {
+        return fillColor;
+    }
+
+    public void setFillColor(@ColorInt int fillColor) {
+        this.fillColor = fillColor;
+    }
+
+    public void setFillColor(Context context, @ColorRes int colorRes) {
+        this.fillColor = ContextCompat.getColor(context, colorRes);
+    }
+
+    public int getFillAlpha() {
+        return fillAlpha;
+    }
+
+    public void setFillAlpha(@IntRange(from = 0, to = 255) int fillAlpha) {
+        this.fillAlpha = fillAlpha;
+    }
+
+    public CPDFLineAnnotation.LineType getStartLineType() {
+        return startLineType;
+    }
+
+    public void setStartLineType(CPDFLineAnnotation.LineType startLineType) {
+        this.startLineType = startLineType;
+    }
+
+    public CPDFLineAnnotation.LineType getEndLineType() {
+        return endLineType;
+    }
+
+    public void setEndLineType(CPDFLineAnnotation.LineType endLineType) {
+        this.endLineType = endLineType;
+    }
+
+    public boolean isFontBold() {
+        return fontBold;
+    }
+
+    public void setFontBold(boolean fontBold) {
+        this.fontBold = fontBold;
+    }
+
+    public boolean isFontItalic() {
+        return fontItalic;
+    }
+
+    public void setFontItalic(boolean fontItalic) {
+        this.fontItalic = fontItalic;
+    }
+
+    public int getTextColor() {
+        return textColor;
+    }
+
+    public void setTextColor(@ColorInt int textColor) {
+        this.textColor = textColor;
+    }
+
+    public void setTextColor(Context context, @ColorRes int colorRes) {
+        this.textColor = ContextCompat.getColor(context, colorRes);
+    }
+
+    public int getTextColorAlpha() {
+        return textColorAlpha;
+    }
+
+    public void setTextColorAlpha(@IntRange(from = 0, to = 255) int textColorAlpha) {
+        this.textColorAlpha = textColorAlpha;
+    }
+
+    public int getFontSize() {
+        return fontSize;
+    }
+
+    public void setFontSize(@IntRange(from = 0) int fontSize) {
+        this.fontSize = fontSize;
+    }
+
+    public CPDFTextAttribute.FontNameHelper.FontType getFontType() {
+        return fontType;
+    }
+
+    public void setFontType(CPDFTextAttribute.FontNameHelper.FontType fontType) {
+        this.fontType = fontType;
+    }
+
+    public String getImagePath() {
+        return imagePath;
+    }
+
+    public void setImagePath(String imagePath) {
+        this.imagePath = imagePath;
+    }
+
+    public String getTextStampContent() {
+        return textStampContent;
+    }
+
+    public void setTextStampContent(String textStampContent) {
+        this.textStampContent = textStampContent;
+    }
+
+    public String getTextStampDate() {
+        return textStampDate;
+    }
+
+    public void setTextStampDate(String textStampDate) {
+        this.textStampDate = textStampDate;
+    }
+
+    public CPDFStampAnnotation.TextStampShape getTextStampShape() {
+        return textStampShape;
+    }
+
+    public void setTextStampShape(CPDFStampAnnotation.TextStampShape textStampShape) {
+        this.textStampShape = textStampShape;
+    }
+
+    public CPDFStampAnnotation.TextStampColor getTextStampColor() {
+        return textStampColor;
+    }
+
+    public void setTextStampColor(CPDFStampAnnotation.TextStampColor textStampColor) {
+        this.textStampColor = textStampColor;
+    }
+
+    public String getAnnotTypeTitle(Context context) {
+        String title = "";
+        switch (type) {
+            case HIGHLIGHT:
+                title = context.getString(R.string.tools_annot_highlight);
+                break;
+            case STRIKEOUT:
+                title = context.getString(R.string.tools_annot_strikeout);
+                break;
+
+            case UNDERLINE:
+                title = context.getString(R.string.tools_annot_underline);
+                break;
+            case SQUIGGLY:
+                title = context.getString(R.string.tools_annot_squiggly);
+                break;
+            default:
+                title = "Not impt...";
+                break;
+        }
+        return title;
+    }
+}

+ 43 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfmarkup/CLinkStyleFragment.java

@@ -0,0 +1,43 @@
+/**
+ * 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.annotation.pdfproperties.pdfmarkup;
+
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
+
+public class CLinkStyleFragment extends CBasicPropertiesFragment {
+
+
+    public static CLinkStyleFragment newInstance(CAnnotStyle style) {
+        CLinkStyleFragment fragment = new CLinkStyleFragment();
+        fragment.setStyle(style);
+        return fragment;
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+    }
+}

+ 45 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfmarkup/CMarkupStyleFragment.java

@@ -0,0 +1,45 @@
+/**
+ * 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.annotation.pdfproperties.pdfmarkup;
+
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
+
+public class CMarkupStyleFragment extends CBasicPropertiesFragment {
+
+
+    public static CMarkupStyleFragment newInstance(CAnnotStyle style) {
+        CMarkupStyleFragment fragment = new CMarkupStyleFragment();
+        fragment.setStyle(style);
+        return fragment;
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.tools_properties_markup_style_fragment, container, false);
+        return rootView;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+    }
+}

+ 14 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfnote/CPDFtextAnnotAttachHelper.java

@@ -0,0 +1,14 @@
+package com.compdfkit.tools.annotation.pdfproperties.pdfnote;
+
+import com.compdfkit.tools.common.utils.dialog.CGotoPageDialog;
+import com.compdfkit.ui.proxy.CPDFTextAnnotImpl;
+import com.compdfkit.ui.proxy.attach.CPDFTextAnnotAttachHelper;
+
+
+public class CPDFtextAnnotAttachHelper extends CPDFTextAnnotAttachHelper {
+    @Override
+    protected void onAddTextAnnot(CPDFTextAnnotImpl cpdfTextAnnot) {
+        CGotoPageDialog dialog = new CGotoPageDialog(readerView.getContext());
+        dialog.show();
+    }
+}

+ 17 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfnote/CPDFtextAnnotImpl.java

@@ -0,0 +1,17 @@
+package com.compdfkit.tools.annotation.pdfproperties.pdfnote;
+
+import com.compdfkit.core.annotation.CPDFTextAnnotation;
+import com.compdfkit.tools.common.utils.dialog.CGotoPageDialog;
+import com.compdfkit.ui.proxy.CPDFTextAnnotImpl;
+import com.compdfkit.ui.proxy.attach.CPDFTextAnnotAttachHelper;
+
+
+public class CPDFtextAnnotImpl extends CPDFTextAnnotImpl {
+
+    @Override
+    protected void onTouchTextAnnot(CPDFTextAnnotation cpdfTextAnnotation) {
+            CGotoPageDialog dialog = new CGotoPageDialog(readerView.getContext());
+            dialog.show();
+        }
+    }
+

+ 207 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/adapter/CBaseQuickAdapter.java

@@ -0,0 +1,207 @@
+package com.compdfkit.tools.common.utils.adapter;
+
+
+import android.content.Context;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.IdRes;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class CBaseQuickAdapter<T,VH extends CBaseQuickViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+    public List<T> list = new ArrayList<>();
+
+    private OnItemClickListener<T> onItemClickListener;
+
+    private OnItemLongClickListener<T> onItemLongClickListener;
+
+    private SparseArray<OnItemChildClickListener<T>> childClickArray = new SparseArray<OnItemChildClickListener<T>>(3);
+
+    private SparseArray<OnItemChildLongClickListener<T>> childLongClickArray = new SparseArray<OnItemChildLongClickListener<T>>(3);
+
+
+    public void setList(List<T> list){
+        this.list.clear();
+        this.list.addAll(list);
+        notifyDataSetChanged();
+    }
+
+    public void addList(List<T> list){
+        this.list.addAll(list);
+        notifyItemRangeInserted(this.list.size() - list.size(), list.size());
+    }
+
+    public void addItem(T item){
+        this.list.add(item);
+        notifyItemInserted(list.size() -1);
+    }
+
+    public void addItem(@IntRange(from = 0) int index, T item){
+        this.list.add(index, item);
+        notifyItemInserted(index);
+    }
+
+    protected abstract VH onCreateViewHolder(
+            Context context,  ViewGroup parent, int viewType
+    );
+
+    protected abstract void onBindViewHolder(VH holder, int position, T item);
+
+    protected void onBindViewHolder(VH holder,int position,  T item, List<Object> payloads) {
+        onBindViewHolder(holder, position, item);
+    }
+
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        VH viewHolder =  onCreateViewHolder(parent.getContext(), parent, viewType);
+        bindViewClickListener(viewHolder, viewType);
+        return viewHolder;
+    }
+
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+        onBindViewHolder((VH) holder, holder.getAdapterPosition(), list.get(holder.getAdapterPosition()));
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
+        onBindViewHolder((VH) holder, position, list.get(holder.getAdapterPosition()), payloads);
+    }
+
+    @Override
+    public int getItemCount() {
+        return list.size();
+    }
+
+    protected void bindViewClickListener(VH viewHolder, int viewType){
+        if (onItemClickListener != null) {
+            viewHolder.itemView.setOnClickListener(v -> {
+                int position = viewHolder.getAdapterPosition();
+                if (position == RecyclerView.NO_POSITION){
+                    return;
+                }
+                onItemClick(v, position);
+            });
+        }
+
+        if (onItemLongClickListener != null) {
+            viewHolder.itemView.setOnClickListener(v -> {
+                int position = viewHolder.getAdapterPosition();
+                if (position == RecyclerView.NO_POSITION){
+                    return;
+                }
+                onItemLongClick(v, position);
+            });
+        }
+
+        if (onItemLongClickListener != null){
+            viewHolder.itemView.setOnLongClickListener(v -> {
+                int position = viewHolder.getAdapterPosition();
+                if (position == RecyclerView.NO_POSITION){
+                    return false;
+                }
+                return onItemLongClickListener.onLongClick((CBaseQuickAdapter<T, CBaseQuickViewHolder>) this, v, position);
+            });
+        }
+
+        for (int i = 0; i < childClickArray.size(); i++) {
+            int id = childClickArray.keyAt(i);
+            View childView = viewHolder.itemView.findViewById(id);
+            if (childView != null) {
+                childView.setOnClickListener(v -> {
+                    int position = viewHolder.getAdapterPosition();
+                    if (position == RecyclerView.NO_POSITION){
+                        return;
+                    }
+                    onItemChildClick(v, position);
+                });
+            }
+        }
+
+        for (int i = 0; i < childLongClickArray.size(); i++) {
+            int id = childLongClickArray.keyAt(i);
+            View childView = viewHolder.itemView.findViewById(id);
+            if (childView != null) {
+                childView.setOnLongClickListener(v -> {
+                    int position = viewHolder.getAdapterPosition();
+                    if (position == RecyclerView.NO_POSITION){
+                        return false;
+                    }
+                    return onItemChildLongClick(v, position);
+                });
+            }
+        }
+    }
+
+    protected void onItemClick(View view, int position) {
+        if (onItemClickListener != null) {
+            onItemClickListener.onClick((CBaseQuickAdapter<T, CBaseQuickViewHolder>) this, view, position);
+        }
+    }
+
+    protected boolean onItemLongClick(View view, int position) {
+        if (onItemLongClickListener != null) {
+            return onItemLongClickListener.onLongClick((CBaseQuickAdapter<T, CBaseQuickViewHolder>) this, view, position);
+        }else {
+            return false;
+        }
+    }
+
+    protected void onItemChildClick(View view, int position){
+        OnItemChildClickListener<T> listener = childClickArray.get(view.getId());
+        if (listener != null){
+            listener.onItemClick((CBaseQuickAdapter<T, CBaseQuickViewHolder>) this, view, position);
+        }
+    }
+
+    protected boolean onItemChildLongClick(View view, int position){
+        OnItemChildLongClickListener<T> listener = childLongClickArray.get(view.getId());
+        if (listener != null){
+            return listener.onItemLongClick((CBaseQuickAdapter<T, CBaseQuickViewHolder>) this, view, position);
+        }else {
+            return false;
+        }
+    }
+
+    public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+
+    public void setOnItemLongClickListener(OnItemLongClickListener<T> onItemLongClickListener) {
+        this.onItemLongClickListener = onItemLongClickListener;
+    }
+
+    public void addOnItemChildClickListener(@IdRes int viewId, OnItemChildClickListener<T> listener){
+        childClickArray.put(viewId, listener);
+    }
+
+    public void addOnItemChildLongClickListener(@IdRes int viewId, OnItemChildLongClickListener<T> listener){
+        childLongClickArray.put(viewId, listener);
+    }
+
+    public interface OnItemClickListener<T> {
+        void onClick(CBaseQuickAdapter<T, CBaseQuickViewHolder> adapter, View view, int position);
+    }
+
+    public interface OnItemLongClickListener<T>{
+        boolean onLongClick(CBaseQuickAdapter<T, CBaseQuickViewHolder> adapter, View view, int position);
+    }
+
+    public interface OnItemChildClickListener<T>{
+        void onItemClick(CBaseQuickAdapter<T, CBaseQuickViewHolder> adapter, View view, int position);
+    }
+
+    public interface OnItemChildLongClickListener<T>{
+        boolean onItemLongClick(CBaseQuickAdapter<T, CBaseQuickViewHolder> adapter, View view, int position);
+    }
+}

+ 120 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/adapter/CBaseQuickViewHolder.java

@@ -0,0 +1,120 @@
+package com.compdfkit.tools.common.utils.adapter;
+
+import android.graphics.drawable.Drawable;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
+
+import java.util.List;
+
+
+public class CBaseQuickViewHolder extends RecyclerView.ViewHolder {
+
+    private SparseArray<View> views = new SparseArray<View>();
+
+    public CBaseQuickViewHolder(@LayoutRes int layoutResId, ViewGroup parent) {
+        super(LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false));
+    }
+
+
+    public <T extends View> T getView(@IdRes int viewId) {
+        if (views.get(viewId) != null) {
+            return (T) views.get(viewId);
+        } else {
+            return itemView.findViewById(viewId);
+        }
+    }
+
+    public void setText(@IdRes int viewId, String text) {
+        TextView textView = getView(viewId);
+        textView.setText(text);
+    }
+
+    public void setText(@IdRes int viewId, @StringRes int stringResId) {
+        TextView textView = getView(viewId);
+        textView.setText(stringResId);
+    }
+
+    public void setTextColorRes(@IdRes int viewId, @ColorRes int colorResId) {
+        TextView textView = getView(viewId);
+        textView.setTextColor(ContextCompat.getColor(textView.getContext(), colorResId));
+    }
+
+    public void setTextColor(@IdRes int viewId, @ColorInt int color) {
+        TextView textView = getView(viewId);
+        textView.setTextColor(color);
+    }
+
+    public void setImageResource(@IdRes int viewId, @DrawableRes int imageResId) {
+        ImageView imageView = getView(viewId);
+        imageView.setImageResource(imageResId);
+    }
+
+    public void setImageDrawable(@IdRes int viewId, Drawable drawable){
+        ImageView imageView = getView(viewId);
+        imageView.setImageDrawable(drawable);
+    }
+
+    public void setBackgroundResource(@IdRes int viewId, @DrawableRes int backgroundRes) {
+        getView(viewId).setBackgroundResource(backgroundRes);
+    }
+
+    public void setBackgroundColor(@IdRes int viewId, @ColorInt int color){
+        getView(viewId).setBackgroundColor(color);
+    }
+
+    public void setVisible(@IdRes int viewId, boolean visible){
+        getView(viewId).setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
+
+    public void setEnabled(@IdRes int viewId, boolean enable) {
+        getView(viewId).setEnabled(enable);
+    }
+
+    public void setSelected(@IdRes int viewId, boolean selected) {
+        getView(viewId).setSelected(selected);
+    }
+
+    public void setOnClickListener(@IdRes int viewId, View.OnClickListener onClickListener) {
+        getView(viewId).setOnClickListener(onClickListener);
+    }
+
+    public void setOnLongClickListener(@IdRes int viewId, View.OnLongClickListener longClickListener) {
+        getView(viewId).setOnLongClickListener(longClickListener);
+    }
+
+    public void setItemHorizontalMargin(List list, int startMarginDp, int normalMarginDp, int endMarginDp){
+        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) itemView.getLayoutParams();
+        int startMarginPx = CDimensUtils.dp2px(itemView.getContext(), startMarginDp);
+        int endMarginPx = CDimensUtils.dp2px(itemView.getContext(), endMarginDp);
+        int normalMarginPx = CDimensUtils.dp2px(itemView.getContext(), normalMarginDp);
+
+        if (getAdapterPosition() == 0){
+            //first item
+            layoutParams.setMargins(startMarginPx, layoutParams.topMargin, normalMarginPx, layoutParams.bottomMargin);
+        } else if (getAdapterPosition() == list.size() -1) {
+            //end item
+            layoutParams.setMargins(normalMarginPx, layoutParams.topMargin, endMarginPx, layoutParams.bottomMargin);
+        }else {
+            layoutParams.setMargins(normalMarginPx, layoutParams.topMargin, normalMarginPx, layoutParams.bottomMargin);
+        }
+    }
+
+
+}

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

@@ -0,0 +1,31 @@
+package com.compdfkit.tools.common.utils.date;
+
+
+import android.text.TextUtils;
+
+public class CDateUtil {
+
+    /**
+     * Transform a PDF date string in the format D:20230130060237+00'00' to a human-readable yyyy-MM-dd HH:mm:ss date string.
+     *
+     * @param inputDate the PDF date string to be transformed
+     * @return the transformed date string in yyyy-MM-dd HH:mm:ss format, or an empty string if the input string is null or too short
+     */
+    public static String transformPDFDate(String inputDate) {
+        try{
+            if (TextUtils.isEmpty(inputDate) || inputDate.length() < 16) {
+                return "";
+            }
+            String year = inputDate.substring(2, 6);
+            String month = inputDate.substring(6, 8);
+            String day = inputDate.substring(8, 10);
+            String hour = inputDate.substring(10, 12);
+            String minute = inputDate.substring(12, 14);
+            String second = inputDate.substring(14, 16);
+            return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
+        }catch (Exception e){
+            return inputDate;
+        }
+    }
+
+}

+ 127 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/CAnnotationToolbar.java

@@ -0,0 +1,127 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfannotationbar;
+
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.fragment.app.FragmentManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.views.pdfannotationbar.adapter.CPDFAnnotationToolListAdapter;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotToolBean;
+import com.compdfkit.tools.common.views.pdfannotationbar.data.CAnnotationToolDatas;
+import com.compdfkit.tools.annotation.pdfproperties.CAnnotStyleDialogFragment;
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
+
+public class CAnnotationToolbar extends FrameLayout {
+
+    private RecyclerView rvAnnotationList;
+
+    private AppCompatImageView ivSetting;
+
+    private AppCompatImageView ivUndo;
+
+    private AppCompatImageView ivRedo;
+
+    private CPDFAnnotationToolListAdapter toolListAdapter;
+
+    private CPDFViewCtrl pdfView;
+
+    private FragmentManager fragmentManager;
+
+    public CAnnotationToolbar(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public CAnnotationToolbar(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CAnnotationToolbar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initView(context);
+    }
+
+    private void initView(Context context){
+        inflate(context, R.layout.tools_annot_tool_bar, this);
+        rvAnnotationList = findViewById(R.id.rv_annotation);
+        ivSetting = findViewById(R.id.iv_annotation_attr_settings);
+        ivUndo = findViewById(R.id.iv_annotation_attr_undo);
+        ivRedo = findViewById(R.id.iv_annotation_attr_redo);
+        toolListAdapter = new CPDFAnnotationToolListAdapter();
+        toolListAdapter.setList(CAnnotationToolDatas.getAnnotationList());
+
+        rvAnnotationList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
+        rvAnnotationList.setAdapter(toolListAdapter);
+        initListener();
+    }
+
+    private void initListener(){
+        ivSetting.setOnClickListener(v -> {
+            CAnnotStyle style = new CAnnotStyle(toolListAdapter.getCurrentAnnotType());
+            CAnnotStyleDialogFragment dialogFragment = CAnnotStyleDialogFragment.newInstance(style);
+            dialogFragment.show(fragmentManager, "annotStyleDialogFragment");
+        });
+        ivUndo.setOnClickListener(v -> {
+
+        });
+        ivRedo.setOnClickListener(v -> {
+
+        });
+        toolListAdapter.setOnItemClickListener((adapter, view, position) -> {
+            CAnnotToolBean bean = adapter.list.get(position);
+            toolListAdapter.selectItem(position);
+            switchAnnotationType(bean);
+        });
+    }
+
+    public void initWithPDFView(CPDFViewCtrl pdfView){
+        this.pdfView = pdfView;
+    }
+
+    public void setFragmentManager(FragmentManager fragmentManager) {
+        this.fragmentManager = fragmentManager;
+    }
+
+    private void switchAnnotationType(CAnnotToolBean bean){
+        if (!bean.isSelect()){
+            pdfView.resetAnnotationType();
+            return;
+        }
+        switch (bean.getType()){
+            case NOTE:
+                pdfView.changeAnnotationType(CPDFAnnotation.Type.TEXT);
+                break;
+            case ARROW:
+                pdfView.changeAnnotationType(CPDFAnnotation.Type.LINE);
+                break;
+            case SIGNATURE:
+                pdfView.changeAnnotationType(CPDFAnnotation.Type.STAMP);
+                break;
+            case PIC:
+                break;
+            default:
+                pdfView.changeAnnotationType(CPDFAnnotation.Type.valueOf(bean.getType().name()));
+                break;
+        }
+    }
+
+
+}

+ 72 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/adapter/CPDFAnnotationToolListAdapter.java

@@ -0,0 +1,72 @@
+/**
+ * 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.common.views.pdfannotationbar.adapter;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotToolBean;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotationType;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickAdapter;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickViewHolder;
+
+import java.util.List;
+
+
+public class CPDFAnnotationToolListAdapter extends CBaseQuickAdapter<CAnnotToolBean, CBaseQuickViewHolder> {
+
+    public static final String REFRESH_SELECT = "refresh_select";
+
+    @Override
+    protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
+        return new CBaseQuickViewHolder(R.layout.tools_annot_list_item, parent);
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CAnnotToolBean item) {
+        holder.setImageResource(R.id.iv_annot_type, item.getIconResId());
+        holder.setSelected(R.id.iv_annot_type, item.isSelect());
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CAnnotToolBean item, List<Object> payloads) {
+        if (payloads.isEmpty()) {
+           super.onBindViewHolder(holder, position, item, payloads);
+        } else {
+            for (Object payload : payloads) {
+                if (payload == REFRESH_SELECT) {
+                    holder.setSelected(R.id.iv_annot_type, item.isSelect());
+                }
+            }
+        }
+    }
+
+    public void selectItem(int position) {
+        for (int i = 0; i < list.size(); i++) {
+            CAnnotToolBean item = list.get(i);
+            if (i == position) {
+                item.setSelect(!item.isSelect());
+            } else {
+                item.setSelect(false);
+            }
+            notifyItemChanged(i, REFRESH_SELECT);
+        }
+    }
+
+    public CAnnotationType getCurrentAnnotType() {
+        for (CAnnotToolBean cAnnotToolBean : list) {
+            if (cAnnotToolBean.isSelect()){
+                return cAnnotToolBean.getType();
+            }
+        }
+        return CAnnotationType.UNKNOWN;
+    }
+}

+ 54 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/bean/CAnnotToolBean.java

@@ -0,0 +1,54 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfannotationbar.bean;
+
+
+import androidx.annotation.DrawableRes;
+
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotationType;
+
+public class CAnnotToolBean {
+
+    private CAnnotationType type;
+
+    @DrawableRes
+    private int iconResId;
+
+    private boolean select;
+
+    public CAnnotToolBean(CAnnotationType type, @DrawableRes int iconResId){
+        this.type = type;
+        this.iconResId = iconResId;
+    }
+
+    public CAnnotationType getType() {
+        return type;
+    }
+
+    public void setType(CAnnotationType type) {
+        this.type = type;
+    }
+
+    public int getIconResId() {
+        return iconResId;
+    }
+
+    public void setIconResId(int iconResId) {
+        this.iconResId = iconResId;
+    }
+
+    public boolean isSelect() {
+        return select;
+    }
+
+    public void setSelect(boolean select) {
+        this.select = select;
+    }
+}

+ 32 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/bean/CAnnotationType.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfannotationbar.bean;
+
+
+public enum CAnnotationType {
+    UNKNOWN,
+    NOTE,
+    HIGHLIGHT,
+    UNDERLINE,
+    SQUIGGLY,
+    STRIKEOUT,
+    INK,
+    CIRCLE,
+    SQUARE,
+    ARROW,
+    LINE,
+    FREE_TEXT,
+    SIGNATURE,
+    STAMP,
+    PIC,
+    LINK,
+    SOUND,
+
+}

+ 34 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfannotationbar/data/CAnnotationToolDatas.java

@@ -0,0 +1,34 @@
+package com.compdfkit.tools.common.views.pdfannotationbar.data;
+
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotToolBean;
+import com.compdfkit.tools.common.views.pdfannotationbar.bean.CAnnotationType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CAnnotationToolDatas {
+
+    public static List<CAnnotToolBean> getAnnotationList() {
+        List<CAnnotToolBean> list = new ArrayList<>();
+        list.add(new CAnnotToolBean(CAnnotationType.NOTE, R.drawable.tools_ic_annotation_note));
+        list.add(new CAnnotToolBean(CAnnotationType.HIGHLIGHT, R.drawable.tools_ic_annotation_highlight));
+        list.add(new CAnnotToolBean(CAnnotationType.UNDERLINE, R.drawable.tools_ic_annotation_underline));
+        list.add(new CAnnotToolBean(CAnnotationType.STRIKEOUT, R.drawable.tools_ic_annotation_deleteline));
+        list.add(new CAnnotToolBean(CAnnotationType.SQUIGGLY, R.drawable.tools_ic_annotation_underline));
+        list.add(new CAnnotToolBean(CAnnotationType.INK, R.drawable.tools_ic_annotation_ink));
+        list.add(new CAnnotToolBean(CAnnotationType.SQUARE, R.drawable.tools_ic_annotation_shape_rectangle));
+        list.add(new CAnnotToolBean(CAnnotationType.CIRCLE, R.drawable.tools_ic_annotation_shape_circular));
+        list.add(new CAnnotToolBean(CAnnotationType.ARROW, R.drawable.tools_ic_annotation_shape_arrow));
+        list.add(new CAnnotToolBean(CAnnotationType.LINE, R.drawable.tools_ic_annotation_link));
+        list.add(new CAnnotToolBean(CAnnotationType.SIGNATURE, R.drawable.tools_ic_annotation_sign));
+        list.add(new CAnnotToolBean(CAnnotationType.STAMP, R.drawable.tools_ic_annotation_stamp));
+        list.add(new CAnnotToolBean(CAnnotationType.PIC, R.drawable.tools_ic_annotation_pic));
+        list.add(new CAnnotToolBean(CAnnotationType.LINK, R.drawable.tools_ic_annotation_link));
+        list.add(new CAnnotToolBean(CAnnotationType.SOUND, R.drawable.tools_ic_annotation_pic));
+        return list;
+    }
+
+
+}

+ 10 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfbota/adapter/CBotaViewPagerAdapter.java

@@ -16,6 +16,7 @@ import androidx.fragment.app.FragmentManager;
 import androidx.lifecycle.Lifecycle;
 import androidx.viewpager2.adapter.FragmentStateAdapter;
 
+import com.compdfkit.tools.annotation.pdfannotationlist.CPDFAnnotationListFragment;
 import com.compdfkit.tools.common.interfaces.OnSetPDFDisplayPageIndexListener;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBOTA;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBotaEmptyFragment;
@@ -64,8 +65,8 @@ public class CBotaViewPagerAdapter extends FragmentStateAdapter {
                 return thumbnailFragment();
             case CPDFBOTA.BOOKMARKS:
                 return bookmarkFragment();
-//            case CPDFBOTA.ANNOTATION:
-//                return new CPDFBotaEmptyFragment();
+            case CPDFBOTA.ANNOTATION:
+                return annotationListFragment();
             default:
                 return new CPDFBotaEmptyFragment();
         }
@@ -105,6 +106,13 @@ public class CBotaViewPagerAdapter extends FragmentStateAdapter {
         return bookmarkFragment;
     }
 
+    private CPDFAnnotationListFragment annotationListFragment(){
+        CPDFAnnotationListFragment listFragment = CPDFAnnotationListFragment.newInstance();
+        listFragment.initWithPDFView(pdfView);
+        listFragment.setPDFDisplayPageIndexListener(pdfDisplayPageIndexListener);
+        return listFragment;
+    }
+
     /**
      * Method that sets the PDF display page index listener
      * @param displayPageIndexListener

+ 27 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/basic/CBasicPropertiesFragment.java

@@ -0,0 +1,27 @@
+/**
+ * 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.common.views.pdfproperties.basic;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import com.compdfkit.tools.annotation.pdfproperties.pdfattr.CAnnotStyle;
+
+
+public abstract class CBasicPropertiesFragment extends Fragment {
+    private CAnnotStyle style;
+
+    public void setStyle(CAnnotStyle style) {
+        this.style = style;
+    }
+
+
+}

+ 58 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/colorlist/CColorItemBean.java

@@ -0,0 +1,58 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfproperties.colorlist;
+
+
+import android.graphics.Color;
+
+import androidx.annotation.ColorInt;
+
+class CColorItemBean {
+
+    private int color;
+
+    private boolean isSelect;
+
+    private boolean isColorPicker;
+
+    public CColorItemBean(@ColorInt int color){
+        this.color = color;
+    }
+
+    public static CColorItemBean colorPickerItem(){
+        CColorItemBean bean = new CColorItemBean(Color.WHITE);
+        bean.setColorPicker(true);
+        return bean;
+    }
+
+    public int getColor() {
+        return color;
+    }
+
+    public void setColor(@ColorInt int color) {
+        this.color = color;
+    }
+
+    public boolean isSelect() {
+        return isSelect;
+    }
+
+    public void setSelect(boolean select) {
+        isSelect = select;
+    }
+
+    public boolean isColorPicker() {
+        return isColorPicker;
+    }
+
+    public void setColorPicker(boolean colorPicker) {
+        isColorPicker = colorPicker;
+    }
+}

+ 81 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/colorlist/CColorListAdapter.java

@@ -0,0 +1,81 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfproperties.colorlist;
+
+
+import android.content.Context;
+import android.graphics.drawable.GradientDrawable;
+import android.util.Log;
+import android.view.ViewGroup;
+
+
+import androidx.annotation.ColorInt;
+import androidx.core.content.ContextCompat;
+
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickAdapter;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickViewHolder;
+import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
+
+import java.util.List;
+
+class CColorListAdapter extends CBaseQuickAdapter<CColorItemBean, CBaseQuickViewHolder> {
+
+    public static final String REFRESH_COLOR_SELECT = "refresh_color";
+
+    @Override
+    protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
+        return new CBaseQuickViewHolder(R.layout.tools_color_list_item, parent);
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CColorItemBean item) {
+        holder.setItemHorizontalMargin(list, 16, 4, 16);
+        holder.setVisible(R.id.iv_color, !item.isColorPicker());
+        holder.setVisible(R.id.iv_color_picker, item.isColorPicker());
+        if (!item.isColorPicker()) {
+            GradientDrawable drawable = (GradientDrawable) holder.getView(R.id.iv_color).getBackground();
+            drawable.setColor(item.getColor());
+            drawable.setStroke(CDimensUtils.dp2px(holder.itemView.getContext(), 2),
+                    ContextCompat.getColor(holder.itemView.getContext(), item.isSelect() ?
+                            R.color.tools_md_theme_light_primary : android.R.color.transparent));
+            holder.setImageDrawable(R.id.iv_color, drawable);
+        }
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CColorItemBean item, List<Object> payloads) {
+        this.onBindViewHolder(holder, position);
+    }
+
+    public void selectItem(int position) {
+        for (int i = 0; i < list.size(); i++) {
+            CColorItemBean bean = list.get(i);
+            if (i == position) {
+                bean.setSelect(true);
+            } else {
+                bean.setSelect(false);
+            }
+            notifyItemChanged(i, REFRESH_COLOR_SELECT);
+        }
+    }
+
+    public void selectByColor(@ColorInt int color){
+        for (int i = 0; i < list.size(); i++) {
+            CColorItemBean bean = list.get(i);
+            if (bean.getColor() == color) {
+                bean.setSelect(true);
+            } else {
+                bean.setSelect(false);
+            }
+            notifyItemChanged(i, REFRESH_COLOR_SELECT);
+        }
+    }
+}

+ 141 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/colorlist/CColorListView.java

@@ -0,0 +1,141 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.views.pdfproperties.colorlist;
+
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.compdfkit.tools.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CColorListView extends LinearLayout {
+
+    private boolean showColorPicker = true;
+
+    private boolean showTitle;
+
+    private String title;
+
+    private List<CColorItemBean> colorList = new ArrayList<>();
+
+    private int selectColor;
+
+    private OnColorChangeListener colorChangeListener;
+    private CColorListAdapter colorListAdapter;
+
+    private int colorListResId = R.array.tools_annot_markup_colors;
+
+    public CColorListView(Context context) {
+        this(context, null);
+    }
+
+    public CColorListView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CColorListView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initAttr(context, attrs);
+        init(context);
+    }
+
+    private void initAttr(Context context, AttributeSet attributeSet){
+        TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.CColorListView);
+        if (typedArray != null) {
+            showColorPicker = typedArray.getBoolean(R.styleable.CColorListView_tools_show_color_picker, true);
+            colorListResId = typedArray.getResourceId(R.styleable.CColorListView_tools_color_list,R.array.tools_annot_markup_colors);
+            colorList = getColorListByResId();
+            showTitle = typedArray.getBoolean(R.styleable.CColorListView_tools_show_title, true);
+            title = typedArray.getString(R.styleable.CColorListView_tools_title);
+            typedArray.recycle();
+        }
+    }
+
+    private void init(Context context){
+        inflate(context, R.layout.tools_color_list_view_layout, this);
+        RecyclerView rvColor = findViewById(R.id.rv_color);
+        AppCompatTextView tvTitle = findViewById(R.id.tv_color_title);
+        if (!showTitle){
+            tvTitle.setVisibility(GONE);
+        }
+        if (!TextUtils.isEmpty(title)){
+            tvTitle.setText(title);
+        }
+        colorListAdapter = new CColorListAdapter();
+        colorListAdapter.setList(colorList);
+        colorListAdapter.setOnItemClickListener((adapter, view, position) -> {
+            CColorItemBean bean = adapter.list.get(position);
+            if (bean.isColorPicker()){
+
+            }else {
+                colorListAdapter.selectItem(position);
+                if (colorChangeListener != null) {
+                    colorChangeListener.color(bean.getColor());
+                }
+            }
+        });
+        rvColor.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
+        rvColor.setAdapter(colorListAdapter);
+    }
+
+    private List<CColorItemBean> getColorListByResId(){
+        List<CColorItemBean> list = new ArrayList<>();
+        if (colorListResId != -1){
+            int[] colors = getResources().getIntArray(colorListResId);
+            if (colors != null && colors.length >0){
+                for (int color : colors) {
+                    list.add(new CColorItemBean(color));
+                }
+            }
+        }
+        if (showColorPicker){
+            list.add(CColorItemBean.colorPickerItem());
+        }
+        return list;
+    }
+
+    public void setSelectColor(@ColorInt int color){
+        this.selectColor = color;
+        if (colorListAdapter != null) {
+            colorListAdapter.selectByColor(color);
+        }
+        if (colorChangeListener != null) {
+            colorChangeListener.color(color);
+        }
+    }
+
+    public void showColorPicker(boolean show){
+        this.showColorPicker = show;
+        if (colorListAdapter != null) {
+            colorListAdapter.setList(getColorListByResId());
+            setSelectColor(selectColor);
+        }
+    }
+
+    public void setColorChangeListener(OnColorChangeListener colorChangeListener) {
+        this.colorChangeListener = colorChangeListener;
+    }
+
+    public interface OnColorChangeListener {
+        void color(@ColorInt int color);
+    }
+}

+ 163 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfproperties/sliderbar/CSliderBar.java

@@ -0,0 +1,163 @@
+/**
+ * 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.common.views.pdfproperties.sliderbar;
+
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.FrameLayout;
+import android.widget.SeekBar;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.appcompat.widget.AppCompatSeekBar;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import com.compdfkit.tools.R;
+
+public class CSliderBar extends FrameLayout implements SeekBar.OnSeekBarChangeListener {
+
+
+    enum ValueShowType {
+        Source,
+        Percentage
+    }
+
+    private AppCompatTextView tvTitle;
+
+    private AppCompatSeekBar seekBar;
+
+    private AppCompatTextView tvSeekBarValue;
+
+    private boolean showTitle;
+
+    private String title;
+
+    private int sliderBarMaxValue;
+
+    private ValueShowType showType = ValueShowType.Source;
+
+    private boolean showValueTips = true;
+
+    private OnProgressChangeListener changeListener;
+
+    public CSliderBar(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public CSliderBar(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CSliderBar(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initView();
+        initAttr(context, attrs);
+
+    }
+
+    private void initAttr(Context context, AttributeSet attrs) {
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CSliderBar);
+        if (typedArray != null) {
+            showTitle = typedArray.getBoolean(R.styleable.CSliderBar_tools_show_title, true);
+            title = typedArray.getString(R.styleable.CSliderBar_tools_title);
+            showValueTips = typedArray.getBoolean(R.styleable.CSliderBar_tools_slider_bar_show_value, true);
+            sliderBarMaxValue = typedArray.getInt(R.styleable.CSliderBar_android_max, 100);
+            int progress = typedArray.getInt(R.styleable.CSliderBar_android_progress, 0);
+            int showTypeEnum = typedArray.getInt(R.styleable.CSliderBar_tools_slider_bar_value_show_type, 0);
+            if (showTypeEnum == 0) {
+                showType = ValueShowType.Source;
+            } else {
+                showType = ValueShowType.Percentage;
+            }
+            tvTitle.setVisibility(showTitle ? VISIBLE : GONE);
+            if (!TextUtils.isEmpty(title)) {
+                tvTitle.setText(title);
+            }
+            tvSeekBarValue.setVisibility(showValueTips ? VISIBLE : GONE);
+            seekBar.setMax(sliderBarMaxValue);
+            seekBar.setProgress(Math.max(0, progress));
+            typedArray.recycle();
+        }
+    }
+
+    private void initView() {
+        inflate(getContext(), R.layout.tools_common_slider_bar, this);
+        tvTitle = findViewById(R.id.tv_title);
+        tvSeekBarValue = findViewById(R.id.tv_seek_bar_value);
+        seekBar = findViewById(R.id.seek_bar);
+        seekBar.setOnSeekBarChangeListener(this);
+    }
+
+    public void setProgress(int progress) {
+        this.seekBar.setProgress(progress);
+    }
+
+    public void setShowType(ValueShowType type){
+        this.showType = type;
+        updateSeekBarValue(seekBar.getProgress());
+    }
+
+    public void setShowTitle(boolean show){
+        this.showTitle = show;
+        tvTitle.setVisibility(showTitle ? VISIBLE : GONE);
+    }
+
+    public void setTitle(String title){
+        this.title = title;
+        tvTitle.setText(title);
+    }
+
+    public void setTitle(@StringRes int stringResId){
+        this.title = getContext().getString(stringResId);
+        tvTitle.setText(title);
+    }
+
+    private void updateSeekBarValue(int value) {
+        int currentPercentage = Math.round((float) value / (float) sliderBarMaxValue * 100F);
+
+        if (showType == ValueShowType.Source) {
+            tvSeekBarValue.setText(String.valueOf(value));
+        } else {
+            tvSeekBarValue.setText(currentPercentage + "%");
+        }
+        Log.e("CSliderBar", "value:" + value + "  , percentage:" + currentPercentage);
+        if (changeListener != null) {
+            changeListener.changed(value, currentPercentage);
+        }
+    }
+
+    public void setChangeListener(OnProgressChangeListener changeListener) {
+        this.changeListener = changeListener;
+    }
+
+    @Override
+    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+        updateSeekBarValue(progress);
+    }
+
+    @Override
+    public void onStartTrackingTouch(SeekBar seekBar) {
+
+    }
+
+    @Override
+    public void onStopTrackingTouch(SeekBar seekBar) {
+
+    }
+
+    public interface OnProgressChangeListener {
+        void changed(int progress, int percentageValue);
+    }
+}

+ 19 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/CPDFViewCtrl.java

@@ -17,20 +17,22 @@ import android.os.Handler;
 import android.os.Looper;
 import android.util.AttributeSet;
 import android.util.Log;
-import android.util.TypedValue;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appcompat.widget.ViewUtils;
 import androidx.interpolator.view.animation.FastOutLinearInInterpolator;
 
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.CPDFTextAnnotation;
 import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.contextmenu.CContextMenuHelper;
+import com.compdfkit.tools.annotation.pdfproperties.pdfnote.CPDFtextAnnotAttachHelper;
+import com.compdfkit.tools.annotation.pdfproperties.pdfnote.CPDFtextAnnotImpl;
 import com.compdfkit.tools.common.utils.dialog.CGotoPageDialog;
 import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
@@ -161,6 +163,10 @@ public class CPDFViewCtrl extends RelativeLayout implements IReaderViewCallback
         cPdfReaderView.setReaderViewCallback(this);
         cPdfReaderView.setContextMenuShowListener(new CContextMenuHelper(cPdfReaderView));
         setAllowAddAndEditAnnot(false);
+        //note注释创建、点击操作类
+        cPdfReaderView.getAnnotImplRegistry().registAttachHelper(CPDFTextAnnotation.class, CPDFtextAnnotAttachHelper.class);
+        cPdfReaderView.getAnnotImplRegistry().registImpl(CPDFTextAnnotation.class, CPDFtextAnnotImpl.class);
+        setAllowAddAndEditAnnot(true);
         addView(cPdfReaderView);
     }
 
@@ -211,6 +217,17 @@ public class CPDFViewCtrl extends RelativeLayout implements IReaderViewCallback
         return cPdfReaderView;
     }
 
+    public void changeAnnotationType(CPDFAnnotation.Type type) {
+        cPdfReaderView.setTouchMode(CPDFReaderView.TouchMode.ADD_ANNOT);
+        cPdfReaderView.setCurrentFocusedType(type);
+    }
+
+    public void resetAnnotationType(){
+        cPdfReaderView.setTouchMode(CPDFReaderView.TouchMode.BROWSE);
+        cPdfReaderView.setCurrentFocusedType(CPDFAnnotation.Type.UNKNOWN);
+    }
+
+
     @Override
     public void onTapMainDocArea() {
         if (onTapMainDocAreaCallback != null) {

+ 25 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/ContextMenuMarkupContentView.java

@@ -0,0 +1,25 @@
+package com.compdfkit.tools.common.views.pdfview.contextmenu;
+
+
+import android.view.LayoutInflater;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
+import com.compdfkit.tools.common.views.pdfview.contextmenu.interfaces.ContextMenuHelperMarkup;
+import com.compdfkit.ui.proxy.CPDFBaseAnnotImpl;
+import com.compdfkit.ui.reader.CPDFPageView;
+
+public class ContextMenuMarkupContentView implements ContextMenuHelperMarkup {
+
+    private CPDFViewCtrl pdfView;
+
+    @Override
+    public void initWithPDFView(CPDFViewCtrl pdfView) {
+        this.pdfView = pdfView;
+    }
+
+    @Override
+    public void getMarkupContentView(CPDFPageView pdfPageView, CPDFBaseAnnotImpl<CPDFAnnotation> annotImpl, LayoutInflater layoutInflater) {
+
+    }
+}

+ 10 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/interfaces/CBaseContextMenuHelper.java

@@ -0,0 +1,10 @@
+package com.compdfkit.tools.common.views.pdfview.contextmenu.interfaces;
+
+import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
+
+
+public interface CBaseContextMenuHelper {
+
+    void initWithPDFView(CPDFViewCtrl pdfView);
+
+}

+ 15 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/interfaces/ContextMenuHelperMarkup.java

@@ -0,0 +1,15 @@
+package com.compdfkit.tools.common.views.pdfview.contextmenu.interfaces;
+
+
+import android.view.LayoutInflater;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.ui.proxy.CPDFBaseAnnotImpl;
+import com.compdfkit.ui.reader.CPDFPageView;
+
+public interface ContextMenuHelperMarkup extends CBaseContextMenuHelper{
+
+    void getMarkupContentView(CPDFPageView pdfPageView, CPDFBaseAnnotImpl<CPDFAnnotation> annotImpl, LayoutInflater layoutInflater);
+
+
+}

+ 5 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfview/contextmenu/window/CMenuWindowLayout.java

@@ -0,0 +1,5 @@
+package com.compdfkit.tools.common.views.pdfview.contextmenu.window;
+
+
+public class CMenuWindowLayout {
+}

+ 3 - 20
compdfkit-tools/src/main/java/com/compdfkit/tools/viewer/pdfinfo/CPDFDocumentInfoDialogFragment.java

@@ -15,6 +15,7 @@ import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.core.document.CPDFDocumentPermissionInfo;
 import com.compdfkit.core.document.CPDFInfo;
 import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.date.CDateUtil;
 import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
 import com.compdfkit.tools.common.views.CToolBar;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
@@ -123,8 +124,8 @@ public class CPDFDocumentInfoDialogFragment extends BottomSheetDialogFragment {
             tvPDFVersion.setText(String.valueOf(document.getMajorVersion()));
             tvPDFPageNum.setText(String.valueOf(document.getPageCount()));
             tvPDFCreator.setText(cpdfInfo.getCreator());
-            tvPDFCreationDate.setText(transformPDFDate(cpdfInfo.getCreationDate()));
-            tvPDFModificationDate.setText(transformPDFDate(cpdfInfo.getModificationDate()));
+            tvPDFCreationDate.setText(CDateUtil.transformPDFDate(cpdfInfo.getCreationDate()));
+            tvPDFModificationDate.setText(CDateUtil.transformPDFDate(cpdfInfo.getModificationDate()));
 
             tvPDFAllowPrint.setText(allowStr(permissionInfo.isAllowsPrinting()));
             tvPDFAllowCopy.setText(allowStr(permissionInfo.isAllowsCopying()));
@@ -139,24 +140,6 @@ public class CPDFDocumentInfoDialogFragment extends BottomSheetDialogFragment {
         return getString(allow ? R.string.tools_yes : R.string.tools_no);
     }
 
-    /**
-     * Transform a PDF date string in the format D:20230130060237+00'00' to a human-readable yyyy-MM-dd HH:mm:ss date string.
-     *
-     * @param inputDate the PDF date string to be transformed
-     * @return the transformed date string in yyyy-MM-dd HH:mm:ss format, or an empty string if the input string is null or too short
-     */
-    private String transformPDFDate(String inputDate) {
-        if (TextUtils.isEmpty(inputDate) || inputDate.length() < 16) {
-            return "";
-        }
-        String year = inputDate.substring(2, 6);
-        String month = inputDate.substring(6, 8);
-        String day = inputDate.substring(8, 10);
-        String hour = inputDate.substring(10, 12);
-        String minute = inputDate.substring(12, 14);
-        String second = inputDate.substring(14, 16);
-        return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
-    }
 
     private String getDocumentSize(CPDFDocument document) {
         final long MB = 1024 * 1024;

+ 6 - 0
compdfkit-tools/src/main/res/color/tools_annotation_fun_status_color.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?android:attr/textColorSecondary" android:state_enabled="false"/>
+    <item android:color="#CC000000" android:state_enabled="true"/>
+    <item android:color="#CC000000"/>
+</selector>

+ 5 - 0
compdfkit-tools/src/main/res/drawable/tools_annot_style_dialog_window_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="?android:attr/colorBackground"/>
+    <corners android:topLeftRadius="16dp" android:topRightRadius="16dp"/>
+</shape>

+ 18 - 0
compdfkit-tools/src/main/res/drawable/tools_annotation_tool_list_item_bg.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_selected="true">
+        <shape>
+            <solid android:color="?android:attr/colorAccent" />
+            <corners android:radius="8dp" />
+        </shape>
+    </item>
+
+    <item>
+        <shape>
+            <solid android:color="?android:attr/colorBackground" />
+            <corners android:radius="8dp" />
+        </shape>
+    </item>
+
+</selector>

+ 5 - 0
compdfkit-tools/src/main/res/drawable/tools_color_item_color.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+    <solid android:color="?android:attr/colorAccent"/>
+    <stroke android:color="?android:attr/colorPrimary" android:width="2dp"/>
+</shape>

+ 12 - 0
compdfkit-tools/src/main/res/drawable/tools_color_item_color_picker.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+
+    <gradient
+        android:centerColor="@android:color/holo_blue_light"
+        android:endColor="@android:color/holo_red_light"
+        android:gradientRadius="45dp"
+        android:startColor="@android:color/holo_red_light"
+        android:type="sweep" />
+
+</shape>

+ 11 - 0
compdfkit-tools/src/main/res/drawable/tools_common_btn_corner_ripple.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?attr/colorOnSurfaceInverse" >
+
+    <item android:id="@android:id/mask">
+        <shape>
+            <corners android:radius="6dp"/>
+            <solid android:color="?attr/colorTertiaryContainer"/>
+        </shape>
+    </item>
+</ripple>

+ 19 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_deleteline.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:fillType="evenOdd"
+        android:pathData="M24,0L24,24L0,24L0,0L24,0ZM21.25,12L2.75,12C2.3358,12 2,12.3358 2,12.75C2,13.1642 2.3358,13.5 2.75,13.5L2.75,13.5L21.25,13.5C21.6642,13.5 22,13.1642 22,12.75C22,12.3358 21.6642,12 21.25,12L21.25,12Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M20,3C20.4142,3 20.75,3.3358 20.75,3.75L20.75,6.1071C20.75,6.5214 20.4142,6.8571 20,6.8571C19.5858,6.8571 19.25,6.5214 19.25,6.1071L19.25,4.5L12.75,4.5L12.75,21L11.25,21L11.25,4.5L4.75,4.5L4.75,6.1071C4.75,6.5214 4.4142,6.8571 4,6.8571C3.5858,6.8571 3.25,6.5214 3.25,6.1071L3.25,3.75C3.25,3.3358 3.5858,3 4,3L20,3L20,3Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_freetext.xml

@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M20,3C20.4142,3 20.75,3.3358 20.75,3.75L20.75,6.1071C20.75,6.5214 20.4142,6.8571 20,6.8571C19.5858,6.8571 19.25,6.5214 19.25,6.1071L19.25,4.5L12.75,4.5L12.75,20.25C12.75,20.6642 12.4142,21 12,21C11.5858,21 11.25,20.6642 11.25,20.25L11.25,4.5L4.75,4.5L4.75,6.1071C4.75,6.5214 4.4142,6.8571 4,6.8571C3.5858,6.8571 3.25,6.5214 3.25,6.1071L3.25,3.75C3.25,3.3358 3.5858,3 4,3L20,3L20,3Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

+ 19 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_highlight.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:fillType="evenOdd"
+        android:pathData="M24,0L24,24L0,24L0,0L24,0ZM20.25,10L3.25,10C2.5596,10 2,10.5596 2,11.25L2,11.25L2,13.8929C2,14.5832 2.5596,15.1429 3.25,15.1429L3.25,15.1429L20.25,15.1429C20.9404,15.1429 21.5,14.5832 21.5,13.8929L21.5,13.8929L21.5,11.25C21.5,10.5596 20.9404,10 20.25,10L20.25,10Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M20,3C20.4142,3 20.75,3.3358 20.75,3.75L20.75,6.1071C20.75,6.5214 20.4142,6.8571 20,6.8571C19.5858,6.8571 19.25,6.5214 19.25,6.1071L19.25,4.5L12.75,4.5L12.75,21L11.25,21L11.25,4.5L4.75,4.5L4.75,6.1071C4.75,6.5214 4.4142,6.8571 4,6.8571C3.5858,6.8571 3.25,6.5214 3.25,6.1071L3.25,3.75C3.25,3.3358 3.5858,3 4,3L20,3L20,3Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

+ 19 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_ink.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:fillType="evenOdd"
+        android:pathData="M24,0L24,24L0,24L0,0L24,0ZM19.25,19L3.75,19C3.3358,19 3,19.3358 3,19.75C3,20.1642 3.3358,20.5 3.75,20.5L19.25,20.5C19.6642,20.5 20,20.1642 20,19.75C20,19.3358 19.6642,19 19.25,19Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M16.1699,6.9333L7.4848,15.6183L4.2883,17.4599L6.0706,14.2041L14.7556,5.5191L16.1699,6.9333ZM17.9818,3.7071C18.3723,4.0976 18.3723,4.7308 17.9818,5.1213L17.0096,6.0936L15.5953,4.6794L16.5676,3.7071C16.9581,3.3166 17.5913,3.3166 17.9818,3.7071Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_link.xml


+ 27 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_note.xml

@@ -0,0 +1,27 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#00000000"
+        android:pathData="M4,3L20,3C20.5523,3 21,3.4477 21,4L21,16C21,16.5523 20.5523,17 20,17L7,17L7,17L3,21L3,4C3,3.4477 3.4477,3 4,3Z"
+        android:strokeWidth="1.5"
+        android:strokeColor="#CC000000"
+        android:strokeLineJoin="round" />
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:pathData="M7,8L17,8"
+        android:strokeWidth="1.5"
+        android:strokeColor="#CC000000"
+        android:strokeLineCap="round" />
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:pathData="M7,12L17,12"
+        android:strokeWidth="1.5"
+        android:strokeColor="#CC000000"
+        android:strokeLineCap="round" />
+</vector>

Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_pic.xml


Разница между файлами не показана из-за своего большого размера
+ 14 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_redo.xml


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_setting.xml


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape.xml


+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_arrow.xml

@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="50dp"
+    android:height="38dp"
+    android:viewportWidth="50"
+    android:viewportHeight="38">
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M34,11.0718C34.1755,11.0718 34.348,11.118 34.5,11.2058L46.5,18.134C46.9783,18.4101 47.1422,19.0217 46.866,19.5C46.7783,19.652 46.652,19.7783 46.5,19.866L34.5,26.7942C34.0217,27.0704 33.4101,26.9065 33.134,26.4282C33.0462,26.2762 33,26.1037 33,25.9282L33,20L33,20L4,20C3.4477,20 3,19.5523 3,19C3,18.4477 3.4477,18 4,18L33,18L33,12.0718C33,11.5195 33.4477,11.0718 34,11.0718Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_circular.xml

@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="50dp"
+    android:height="38dp"
+    android:viewportWidth="50"
+    android:viewportHeight="38">
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M25,6C32.732,6 39,12.268 39,20C39,27.732 32.732,34 25,34C17.268,34 11,27.732 11,20C11,12.268 17.268,6 25,6ZM25,8C18.3726,8 13,13.3726 13,20C13,26.6274 18.3726,32 25,32C31.6274,32 37,26.6274 37,20C37,13.3726 31.6274,8 25,8Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_line.xml

@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="50dp"
+    android:height="38dp"
+    android:viewportWidth="50"
+    android:viewportHeight="38">
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M6,18L44,18A1,1 0,0 1,45 19L45,19A1,1 0,0 1,44 20L6,20A1,1 0,0 1,5 19L5,19A1,1 0,0 1,6 18z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_shape_rectangle.xml

@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="50dp"
+    android:height="38dp"
+    android:viewportWidth="50"
+    android:viewportHeight="38">
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M40,8C41.1046,8 42,8.8954 42,10L42,29C42,30.1046 41.1046,31 40,31L10,31C8.8954,31 8,30.1046 8,29L8,10C8,8.8954 8.8954,8 10,8L40,8ZM40,10L10,10L10,29L40,29L40,10Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_sign.xml


Разница между файлами не показана из-за своего большого размера
+ 19 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_squiggly.xml


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_stamp.xml


+ 19 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_underline.xml

@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:fillType="evenOdd"
+        android:pathData="M24,0L24,24L0,24L0,0L24,0ZM20.25,19L3.75,19C3.3358,19 3,19.3358 3,19.75C3,20.1642 3.3358,20.5 3.75,20.5L3.75,20.5L20.25,20.5C20.6642,20.5 21,20.1642 21,19.75C21,19.3358 20.6642,19 20.25,19L20.25,19Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+    <path
+        android:fillAlpha="0.87"
+        android:fillColor="#CC000000"
+        android:fillType="nonZero"
+        android:pathData="M20,3C20.4142,3 20.75,3.3358 20.75,3.75L20.75,6.1071C20.75,6.5214 20.4142,6.8571 20,6.8571C19.5858,6.8571 19.25,6.5214 19.25,6.1071L19.25,4.5L12.75,4.5L12.75,17L11.25,17L11.25,4.5L4.75,4.5L4.75,6.1071C4.75,6.5214 4.4142,6.8571 4,6.8571C3.5858,6.8571 3.25,6.5214 3.25,6.1071L3.25,3.75C3.25,3.3358 3.5858,3 4,3L20,3L20,3Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

Разница между файлами не показана из-за своего большого размера
+ 13 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_annotation_undo.xml


+ 19 - 0
compdfkit-tools/src/main/res/layout/tools_annot_list_item.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:animateLayoutChanges="true">
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_annot_type"
+        style="@style/tools_annotation_tool_bar_item_iv_style"
+        android:layout_margin="4dp"
+        android:background="@drawable/tools_annotation_tool_list_item_bg"
+        android:src="@drawable/tools_ic_annotation_highlight"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 82 - 0
compdfkit-tools/src/main/res/layout/tools_annot_list_item_content.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView 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:id="@+id/card_view"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:foreground="?android:attr/selectableItemBackground"
+    app:cardCornerRadius="0dp"
+    app:cardElevation="0dp">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingHorizontal="16dp"
+        android:paddingTop="8dp">
+
+        <FrameLayout
+            android:id="@+id/fl_annot_icon"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <View
+                android:id="@+id/view_icon_bg"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@color/tools_md_theme_light_primary" />
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:id="@+id/iv_annot_icon"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:srcCompat="@drawable/tools_ic_annotation_highlight" />
+
+        </FrameLayout>
+
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_annot_date"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            app:layout_constraintBottom_toBottomOf="@id/fl_annot_icon"
+            app:layout_constraintStart_toEndOf="@id/fl_annot_icon"
+            app:layout_constraintTop_toTopOf="@id/fl_annot_icon"
+            tools:text="@tools:sample/date/ddmmyy" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_annot_content"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:layout_marginBottom="8dp"
+            android:maxLines="3"
+            android:textColor="?android:attr/textColorSecondary"
+            android:visibility="visible"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/fl_annot_icon"
+            tools:text="@tools:sample/lorem/random" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="0.5dp"
+            android:background="@color/tools_item_dividing_line_color"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_annot_content"
+            app:layout_constraintVertical_bias="1"
+            app:layout_goneMarginTop="4dp" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.cardview.widget.CardView>
+
+

+ 43 - 0
compdfkit-tools/src/main/res/layout/tools_annot_list_item_header.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:paddingVertical="6dp"
+    >
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/tools_search_header_page"
+        android:layout_marginStart="16dp"
+        android:textSize="12sp"
+        android:id="@+id/tv_page"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/id_item_annot_head_page"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="12sp"
+        app:layout_constraintStart_toEndOf="@id/tv_page"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_page"
+        android:layout_marginStart="8dp"
+        android:text="10"/>
+
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/id_item_annot_count"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="12sp"
+        android:layout_marginEnd="16dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_page"
+        android:text="5"/>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 38 - 0
compdfkit-tools/src/main/res/layout/tools_annot_style_dialog_fragment.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:background="@drawable/tools_annot_style_dialog_window_bg"
+    android:layout_height="match_parent">
+
+
+    <com.compdfkit.tools.common.views.CToolBar
+        android:id="@+id/tool_bar"
+        android:layout_width="match_parent"
+        android:background="@android:color/transparent"
+        android:layout_height="?android:attr/actionBarSize"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:tools_toolbar_title=" " />
+
+
+    <com.compdfkit.tools.common.utils.view.CNestedScrollableHost
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar"
+        app:layout_constraintVertical_bias="0">
+
+        <androidx.viewpager2.widget.ViewPager2
+            android:id="@+id/view_pager"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:layout_constraintTop_toBottomOf="@id/tool_bar"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+    </com.compdfkit.tools.common.utils.view.CNestedScrollableHost>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 55 - 0
compdfkit-tools/src/main/res/layout/tools_annot_tool_bar.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="?android:attr/actionBarSize"
+    android:background="?android:attr/colorBackground"
+    android:theme="@style/Tools_Base_Theme"
+    android:elevation="4dp">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_annotation"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/ll_annotation_attr"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:listitem="@layout/tools_annot_list_item" />
+
+    <LinearLayout
+        android:id="@+id/ll_annotation_attr"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:background="?attr/colorTertiaryContainer"
+        android:gravity="center_vertical"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="1"
+        app:layout_constraintStart_toEndOf="@id/rv_annotation"
+        app:layout_constraintTop_toTopOf="parent">
+
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_annotation_attr_settings"
+            style="@style/tools_annotation_tool_bar_item_iv_style"
+            app:srcCompat="@drawable/tools_ic_annotation_setting" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_annotation_attr_undo"
+            style="@style/tools_annotation_tool_bar_item_iv_style"
+            app:srcCompat="@drawable/tools_ic_annotation_undo"
+            />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_annotation_attr_redo"
+            style="@style/tools_annotation_tool_bar_item_iv_style"
+            android:background="@drawable/tools_common_btn_corner_ripple"
+            app:srcCompat="@drawable/tools_ic_annotation_redo" />
+
+    </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 16 - 0
compdfkit-tools/src/main/res/layout/tools_anotation_list_fragment.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_annotation"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        tools:listitem="@layout/tools_annot_list_item_content" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 36 - 0
compdfkit-tools/src/main/res/layout/tools_color_list_item.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    xmlns:tools="http://schemas.android.com/tools"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_color_picker"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_width="45dp"
+        android:layout_height="45dp"
+        android:layout_marginVertical="8dp"
+        android:visibility="gone"
+        android:background="@drawable/tools_color_item_color_picker"
+        />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_color"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_width="45dp"
+        android:layout_height="45dp"
+        android:layout_marginVertical="8dp"
+        android:background="@drawable/tools_color_item_color"
+        />
+
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 27 - 0
compdfkit-tools/src/main/res/layout/tools_color_list_view_layout.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_color_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:text="@string/tools_color"
+        android:textColor="?android:attr/textColorPrimary"
+        android:textSize="18sp" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_color"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        tools:listitem="@layout/tools_color_list_item" />
+
+</LinearLayout>

+ 37 - 0
compdfkit-tools/src/main/res/layout/tools_common_slider_bar.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:text="@string/tools_transparency"
+        android:textColor="?android:attr/textColorPrimary"
+        android:textSize="18sp" />
+
+    <androidx.appcompat.widget.AppCompatSeekBar
+        android:id="@+id/seek_bar"
+        android:layout_width="match_parent"
+        android:layout_height="30dp"
+        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
+        android:layout_marginHorizontal="8dp"
+        android:max="100"
+        android:progress="50"
+        />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_seek_bar_value"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="end"
+        android:layout_marginEnd="24dp"
+        android:layout_marginBottom="16dp"
+        tools:text="50%"/>
+
+</LinearLayout>

+ 32 - 0
compdfkit-tools/src/main/res/layout/tools_properties_markup_style_fragment.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_markup_sample"
+        android:layout_width="match_parent"
+        android:layout_height="80dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+    <com.compdfkit.tools.common.views.pdfproperties.colorlist.CColorListView
+        android:id="@+id/color_list_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/iv_markup_sample" />
+
+    <com.compdfkit.tools.common.views.pdfproperties.sliderbar.CSliderBar
+        android:layout_width="match_parent"
+        app:tools_slider_bar_value_show_type="percentage"
+        android:max="255"
+        app:layout_constraintTop_toBottomOf="@id/color_list_view"
+        android:layout_height="wrap_content"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 1
compdfkit-tools/src/main/res/layout/tools_search_keywords_list_item.xml

@@ -3,7 +3,8 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="wrap_content"
+    android:background="?android:attr/colorBackground">
 
     <TextView
         android:id="@+id/id_item_search_content_text"

+ 1 - 1
compdfkit-tools/src/main/res/layout/tools_search_keywords_list_item_header.xml

@@ -4,7 +4,7 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:paddingVertical="6dp"
-    android:background="?android:attr/colorBackground">
+    >
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"

+ 63 - 0
compdfkit-tools/src/main/res/values-night/tools_themes.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="Tools_Base_Theme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
+        <item name="colorPrimary">@color/tools_md_theme_dark_primary</item>
+        <item name="colorOnPrimary">@color/tools_md_theme_dark_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/tools_md_theme_dark_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/tools_md_theme_dark_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/tools_md_theme_dark_secondary</item>
+        <item name="colorOnSecondary">@color/tools_md_theme_dark_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/tools_md_theme_dark_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/tools_md_theme_dark_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/tools_md_theme_dark_tertiary</item>
+        <item name="colorOnTertiary">@color/tools_md_theme_dark_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/tools_md_theme_dark_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/tools_md_theme_dark_onTertiaryContainer</item>
+        <item name="colorError">@color/tools_md_theme_dark_error</item>
+        <item name="colorErrorContainer">@color/tools_md_theme_dark_errorContainer</item>
+        <item name="colorOnError">@color/tools_md_theme_dark_onError</item>
+        <item name="colorOnErrorContainer">@color/tools_md_theme_dark_onErrorContainer</item>
+        <item name="android:colorBackground">@color/tools_md_theme_dark_background</item>
+        <item name="colorOnBackground">@color/tools_md_theme_dark_onBackground</item>
+        <item name="colorOutline">@color/tools_md_theme_dark_outline</item>
+        <item name="colorOnSurfaceInverse">@color/tools_md_theme_dark_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/tools_md_theme_dark_inverseSurface</item>
+        <item name="colorSurface">@color/tools_md_theme_dark_surface</item>
+        <item name="colorOnSurface">@color/tools_md_theme_dark_onSurface</item>
+        <item name="colorSurfaceVariant">@color/tools_md_theme_dark_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/tools_md_theme_dark_onSurfaceVariant</item>
+        <item name="colorPrimaryInverse">@color/tools_md_theme_dark_inversePrimary</item>
+    </style>
+
+    <style name="Tools_Base_Theme.BottomSheetDialogStyle" parent="Theme.MaterialComponents.BottomSheetDialog">
+        <item name="colorPrimary">@color/tools_md_theme_dark_primary</item>
+        <item name="colorOnPrimary">@color/tools_md_theme_dark_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/tools_md_theme_dark_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/tools_md_theme_dark_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/tools_md_theme_dark_secondary</item>
+        <item name="colorOnSecondary">@color/tools_md_theme_dark_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/tools_md_theme_dark_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/tools_md_theme_dark_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/tools_md_theme_dark_tertiary</item>
+        <item name="colorOnTertiary">@color/tools_md_theme_dark_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/tools_md_theme_dark_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/tools_md_theme_dark_onTertiaryContainer</item>
+        <item name="colorError">@color/tools_md_theme_dark_error</item>
+        <item name="colorErrorContainer">@color/tools_md_theme_dark_errorContainer</item>
+        <item name="colorOnError">@color/tools_md_theme_dark_onError</item>
+        <item name="colorOnErrorContainer">@color/tools_md_theme_dark_onErrorContainer</item>
+        <item name="android:colorBackground">@color/tools_md_theme_dark_background</item>
+        <item name="colorOnBackground">@color/tools_md_theme_dark_onBackground</item>
+        <item name="colorOutline">@color/tools_md_theme_dark_outline</item>
+        <item name="colorOnSurfaceInverse">@color/tools_md_theme_dark_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/tools_md_theme_dark_inverseSurface</item>
+        <item name="colorSurface">@color/tools_md_theme_dark_surface</item>
+        <item name="colorOnSurface">@color/tools_md_theme_dark_onSurface</item>
+        <item name="colorSurfaceVariant">@color/tools_md_theme_dark_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/tools_md_theme_dark_onSurfaceVariant</item>
+        <item name="colorPrimaryInverse">@color/tools_md_theme_dark_inversePrimary</item>
+        <item name="bottomSheetStyle">@style/tools_bottom_sheet_style_wrapper</item>
+    </style>
+
+</resources>

+ 18 - 0
compdfkit-tools/src/main/res/values/tools_annot_properties_colors.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+
+    <array name="tools_annot_markup_colors">
+        <item>#F44336</item>
+        <item>#E91E63</item>
+        <item>#9C27B0</item>
+        <item>#3F51B5</item>
+        <item>#2196F3</item>
+        <item>#00BCD4</item>
+        <item>#009688</item>
+        <item>#CDDC39</item>
+        <item>#FF9800</item>
+    </array>
+
+
+</resources>

+ 19 - 0
compdfkit-tools/src/main/res/values/tools_attrs.xml

@@ -2,6 +2,8 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
 
     <attr name="tools_toolbar_title" format="string"/>
+    <attr name="tools_title" format="string"/>
+    <attr name="tools_show_title" format="boolean"/>
 
     <declare-styleable name="CPDFToolBar" tools:ignore="ResourceName">
         <attr name="tools_toolbar_title"/>
@@ -27,5 +29,22 @@
         <attr name="tools_enable_page_indicator" format="boolean"/>
     </declare-styleable>
 
+    <declare-styleable name="CColorListView" tools:ignore="ResourceName">
+        <attr name="tools_show_color_picker" format="boolean"/>
+        <attr name="tools_color_list" format="reference"/>
+        <attr name="tools_show_title"/>
+        <attr name="tools_title"/>
+    </declare-styleable>
 
+    <declare-styleable name="CSliderBar"  tools:ignore="ResourceName">
+        <attr name="tools_title"/>
+        <attr name="tools_show_title"/>
+        <attr name="android:max"/>
+        <attr name="android:progress"/>
+        <attr name="tools_slider_bar_value_show_type" format="enum">
+            <enum name="source" value="0"/>
+            <enum name="percentage" value="1"/>
+        </attr>
+        <attr name="tools_slider_bar_show_value" format="boolean"/>
+    </declare-styleable>
 </resources>

+ 102 - 0
compdfkit-tools/src/main/res/values/tools_colors.xml

@@ -15,4 +15,106 @@
     <color name="tools_custom_theme_color_3">#C5E1A5</color>
     <color name="tools_custom_theme_color_4">#90CAF9</color>
 
+
+    <color name="tools_md_theme_light_primary">#006A62</color>
+    <color name="tools_md_theme_light_onPrimary">#FFFFFF</color>
+    <color name="tools_md_theme_light_primaryContainer">#73F8E8</color>
+    <color name="tools_md_theme_light_onPrimaryContainer">#00201D</color>
+    <color name="tools_md_theme_light_primaryFixed">#73F8E8</color>
+    <color name="tools_md_theme_light_onPrimaryFixed">#00201D</color>
+    <color name="tools_md_theme_light_primaryFixedDim">#52DBCC</color>
+    <color name="tools_md_theme_light_onPrimaryFixedVariant">#005049</color>
+    <color name="tools_md_theme_light_secondary">#4A635F</color>
+    <color name="tools_md_theme_light_onSecondary">#FFFFFF</color>
+    <color name="tools_md_theme_light_secondaryContainer">#CCE8E3</color>
+    <color name="tools_md_theme_light_onSecondaryContainer">#051F1D</color>
+    <color name="tools_md_theme_light_secondaryFixed">#CCE8E3</color>
+    <color name="tools_md_theme_light_onSecondaryFixed">#051F1D</color>
+    <color name="tools_md_theme_light_secondaryFixedDim">#B1CCC7</color>
+    <color name="tools_md_theme_light_onSecondaryFixedVariant">#324B48</color>
+    <color name="tools_md_theme_light_tertiary">#46617A</color>
+    <color name="tools_md_theme_light_onTertiary">#FFFFFF</color>
+    <color name="tools_md_theme_light_tertiaryContainer">#CDE5FF</color>
+    <color name="tools_md_theme_light_onTertiaryContainer">#001D32</color>
+    <color name="tools_md_theme_light_tertiaryFixed">#CDE5FF</color>
+    <color name="tools_md_theme_light_onTertiaryFixed">#001D32</color>
+    <color name="tools_md_theme_light_tertiaryFixedDim">#AEC9E6</color>
+    <color name="tools_md_theme_light_onTertiaryFixedVariant">#2E4961</color>
+    <color name="tools_md_theme_light_error">#BA1A1A</color>
+    <color name="tools_md_theme_light_errorContainer">#FFDAD6</color>
+    <color name="tools_md_theme_light_onError">#FFFFFF</color>
+    <color name="tools_md_theme_light_onErrorContainer">#410002</color>
+    <color name="tools_md_theme_light_background">#FAFDFB</color>
+    <color name="tools_md_theme_light_onBackground">#191C1C</color>
+    <color name="tools_md_theme_light_outline">#6F7977</color>
+    <color name="tools_md_theme_light_inverseOnSurface">#EFF1EF</color>
+    <color name="tools_md_theme_light_inverseSurface">#2D3130</color>
+    <color name="tools_md_theme_light_inversePrimary">#52DBCC</color>
+    <color name="tools_md_theme_light_shadow">#000000</color>
+    <color name="tools_md_theme_light_surfaceTint">#006A62</color>
+    <color name="tools_md_theme_light_outlineVariant">#BEC9C6</color>
+    <color name="tools_md_theme_light_scrim">#000000</color>
+    <color name="tools_md_theme_light_surface">#F7FAF8</color>
+    <color name="tools_md_theme_light_onSurface">#191C1C</color>
+    <color name="tools_md_theme_light_surfaceVariant">#DAE5E2</color>
+    <color name="tools_md_theme_light_onSurfaceVariant">#3F4947</color>
+    <color name="tools_md_theme_light_surfaceContainerHighest">#E0E3E1</color>
+    <color name="tools_md_theme_light_surfaceContainerHigh">#E6E9E7</color>
+    <color name="tools_md_theme_light_surfaceContainer">#ECEEED</color>
+    <color name="tools_md_theme_light_surfaceContainerLow">#F2F4F2</color>
+    <color name="tools_md_theme_light_surfaceContainerLowest">#FFFFFF</color>
+    <color name="tools_md_theme_light_surfaceDim">#D8DBD9</color>
+    <color name="tools_md_theme_light_surfaceBright">#F7FAF8</color>
+    <color name="tools_md_theme_dark_primary">#52DBCC</color>
+    <color name="tools_md_theme_dark_onPrimary">#003732</color>
+    <color name="tools_md_theme_dark_primaryContainer">#005049</color>
+    <color name="tools_md_theme_dark_onPrimaryContainer">#73F8E8</color>
+    <color name="tools_md_theme_dark_primaryFixed">#73F8E8</color>
+    <color name="tools_md_theme_dark_onPrimaryFixed">#00201D</color>
+    <color name="tools_md_theme_dark_primaryFixedDim">#52DBCC</color>
+    <color name="tools_md_theme_dark_onPrimaryFixedVariant">#005049</color>
+    <color name="tools_md_theme_dark_secondary">#B1CCC7</color>
+    <color name="tools_md_theme_dark_onSecondary">#1C3531</color>
+    <color name="tools_md_theme_dark_secondaryContainer">#324B48</color>
+    <color name="tools_md_theme_dark_onSecondaryContainer">#CCE8E3</color>
+    <color name="tools_md_theme_dark_secondaryFixed">#CCE8E3</color>
+    <color name="tools_md_theme_dark_onSecondaryFixed">#051F1D</color>
+    <color name="tools_md_theme_dark_secondaryFixedDim">#B1CCC7</color>
+    <color name="tools_md_theme_dark_onSecondaryFixedVariant">#324B48</color>
+    <color name="tools_md_theme_dark_tertiary">#AEC9E6</color>
+    <color name="tools_md_theme_dark_onTertiary">#163349</color>
+    <color name="tools_md_theme_dark_tertiaryContainer">#2E4961</color>
+    <color name="tools_md_theme_dark_onTertiaryContainer">#CDE5FF</color>
+    <color name="tools_md_theme_dark_tertiaryFixed">#CDE5FF</color>
+    <color name="tools_md_theme_dark_onTertiaryFixed">#001D32</color>
+    <color name="tools_md_theme_dark_tertiaryFixedDim">#AEC9E6</color>
+    <color name="tools_md_theme_dark_onTertiaryFixedVariant">#2E4961</color>
+    <color name="tools_md_theme_dark_error">#FFB4AB</color>
+    <color name="tools_md_theme_dark_errorContainer">#93000A</color>
+    <color name="tools_md_theme_dark_onError">#690005</color>
+    <color name="tools_md_theme_dark_onErrorContainer">#FFDAD6</color>
+    <color name="tools_md_theme_dark_background">#191C1C</color>
+    <color name="tools_md_theme_dark_onBackground">#E0E3E1</color>
+    <color name="tools_md_theme_dark_outline">#899390</color>
+    <color name="tools_md_theme_dark_inverseOnSurface">#191C1C</color>
+    <color name="tools_md_theme_dark_inverseSurface">#E0E3E1</color>
+    <color name="tools_md_theme_dark_inversePrimary">#006A62</color>
+    <color name="tools_md_theme_dark_shadow">#000000</color>
+    <color name="tools_md_theme_dark_surfaceTint">#52DBCC</color>
+    <color name="tools_md_theme_dark_outlineVariant">#3F4947</color>
+    <color name="tools_md_theme_dark_scrim">#000000</color>
+    <color name="tools_md_theme_dark_surface">#101413</color>
+    <color name="tools_md_theme_dark_onSurface">#C4C7C5</color>
+    <color name="tools_md_theme_dark_surfaceVariant">#3F4947</color>
+    <color name="tools_md_theme_dark_onSurfaceVariant">#BEC9C6</color>
+    <color name="tools_md_theme_dark_surfaceContainerHighest">#323535</color>
+    <color name="tools_md_theme_dark_surfaceContainerHigh">#272B2A</color>
+    <color name="tools_md_theme_dark_surfaceContainer">#1D2020</color>
+    <color name="tools_md_theme_dark_surfaceContainerLow">#191C1C</color>
+    <color name="tools_md_theme_dark_surfaceContainerLowest">#0B0F0E</color>
+    <color name="tools_md_theme_dark_surfaceDim">#101413</color>
+    <color name="tools_md_theme_dark_surfaceBright">#363A39</color>
+
+    <color name="tools_annotation_markup_default_color">#A5D6A7</color>
+    
 </resources>

+ 7 - 0
compdfkit-tools/src/main/res/values/tools_strings.xml

@@ -62,6 +62,13 @@
     <string name="tools_bookmark_title">Bookmark Title</string>
     <string name="tools_custom_themes_color">Custom</string>
 
+    <string name="tools_color">Color:</string>
+    <string name="tools_transparency">Transparency:</string>
+    <string name="tools_annot_highlight">Highlight</string>
+    <string name="tools_annot_underline">Underline</string>
+    <string name="tools_annot_strikeout">StrikeOut</string>
+    <string name="tools_annot_squiggly">Squiggly</string>
+
     <string name="tools_menu_pdfview">PDFView</string>
     <string name="tools_menu_annotation">Annotation</string>
     <string name="tools_menu_edit">Edit</string>

+ 11 - 1
compdfkit-tools/src/main/res/values/tools_styles.xml

@@ -1,6 +1,5 @@
 <resources>
 
-
     <style name="tools_dialog_button_style">
         <item name="android:layout_width">wrap_content</item>
         <item name="android:layout_height">wrap_content</item>
@@ -71,7 +70,18 @@
 
     <style name="tools_dialog_fragment_style" parent="Theme.MaterialComponents.DayNight.Dialog">
         <item name="android:windowBackground">?android:attr/colorSecondary</item>
+    </style>
+
+    <style name="tools_annotation_tool_bar_item_iv_style">
+        <item name="android:layout_width">45dp</item>
+        <item name="android:layout_height">45dp</item>
+        <item name="android:padding">8dp</item>
+        <item name="android:background">@drawable/tools_common_btn_corner_ripple</item>
+    </style>
 
+    <style name="tools_bottom_sheet_style_wrapper" parent="Widget.Design.BottomSheet.Modal">
+        <item name="android:background">@android:color/transparent</item>
     </style>
 
+
 </resources>

+ 65 - 0
compdfkit-tools/src/main/res/values/tools_themes.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="Tools_Base_Theme.BottomSheetDialogStyle" parent="Theme.MaterialComponents.Light.BottomSheetDialog">
+        <item name="colorPrimary">@color/tools_md_theme_light_primary</item>
+        <item name="colorOnPrimary">@color/tools_md_theme_light_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/tools_md_theme_light_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/tools_md_theme_light_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/tools_md_theme_light_secondary</item>
+        <item name="colorOnSecondary">@color/tools_md_theme_light_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/tools_md_theme_light_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/tools_md_theme_light_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/tools_md_theme_light_tertiary</item>
+        <item name="colorOnTertiary">@color/tools_md_theme_light_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/tools_md_theme_light_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/tools_md_theme_light_onTertiaryContainer</item>
+        <item name="colorError">@color/tools_md_theme_light_error</item>
+        <item name="colorErrorContainer">@color/tools_md_theme_light_errorContainer</item>
+        <item name="colorOnError">@color/tools_md_theme_light_onError</item>
+        <item name="colorOnErrorContainer">@color/tools_md_theme_light_onErrorContainer</item>
+        <item name="android:colorBackground">@color/tools_md_theme_light_background</item>
+        <item name="colorOnBackground">@color/tools_md_theme_light_onBackground</item>
+        <item name="colorOutline">@color/tools_md_theme_light_outline</item>
+        <item name="colorOnSurfaceInverse">@color/tools_md_theme_light_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/tools_md_theme_light_inverseSurface</item>
+        <item name="colorSurface">@color/tools_md_theme_light_surface</item>
+        <item name="colorOnSurface">@color/tools_md_theme_light_onSurface</item>
+        <item name="colorSurfaceVariant">@color/tools_md_theme_light_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/tools_md_theme_light_onSurfaceVariant</item>
+        <item name="colorPrimaryInverse">@color/tools_md_theme_light_inversePrimary</item>
+        <item name="android:statusBarColor">@color/tools_md_theme_light_primary</item>
+        <item name="bottomSheetStyle">@style/tools_bottom_sheet_style_wrapper</item>
+    </style>
+
+    <style name="Tools_Base_Theme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
+        <item name="colorPrimary">@color/tools_md_theme_light_primary</item>
+        <item name="colorOnPrimary">@color/tools_md_theme_light_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/tools_md_theme_light_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/tools_md_theme_light_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/tools_md_theme_light_secondary</item>
+        <item name="colorOnSecondary">@color/tools_md_theme_light_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/tools_md_theme_light_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/tools_md_theme_light_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/tools_md_theme_light_tertiary</item>
+        <item name="colorOnTertiary">@color/tools_md_theme_light_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/tools_md_theme_light_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/tools_md_theme_light_onTertiaryContainer</item>
+        <item name="colorError">@color/tools_md_theme_light_error</item>
+        <item name="colorErrorContainer">@color/tools_md_theme_light_errorContainer</item>
+        <item name="colorOnError">@color/tools_md_theme_light_onError</item>
+        <item name="colorOnErrorContainer">@color/tools_md_theme_light_onErrorContainer</item>
+        <item name="android:colorBackground">@color/tools_md_theme_light_background</item>
+        <item name="colorOnBackground">@color/tools_md_theme_light_onBackground</item>
+        <item name="colorOutline">@color/tools_md_theme_light_outline</item>
+        <item name="colorOnSurfaceInverse">@color/tools_md_theme_light_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/tools_md_theme_light_inverseSurface</item>
+        <item name="colorSurface">@color/tools_md_theme_light_surface</item>
+        <item name="colorOnSurface">@color/tools_md_theme_light_onSurface</item>
+        <item name="colorSurfaceVariant">@color/tools_md_theme_light_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/tools_md_theme_light_onSurfaceVariant</item>
+        <item name="colorPrimaryInverse">@color/tools_md_theme_light_inversePrimary</item>
+        <item name="android:statusBarColor">@color/tools_md_theme_light_primary</item>
+    </style>
+
+</resources>