Browse Source

PDFTool(Android) - 上下文菜单新增注释回复交互

liuxiaolong 8 months ago
parent
commit
62556168b0
15 changed files with 215 additions and 112 deletions
  1. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/CPDFAnnotationListFragment.java
  2. 102 98
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/data/CPDFAnnotDatas.java
  3. 5 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/dialog/CPDFEditReplyDialogFragment.java
  4. 14 11
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/dialog/CPDFReplyDetailsDialogFragment.java
  5. 7 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/CPDFContextMenuHelper.java
  6. 0 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CEditTextContextMenuView.java
  7. 9 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CFreeTextContextMenuView.java
  8. 8 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CInkContextMenuView.java
  9. 11 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CMarkupContextMenuView.java
  10. 8 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CShapeContextMenuView.java
  11. 9 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CSoundContextMenuView.java
  12. 8 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CStampContextMenuView.java
  13. 1 1
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/pdf/CPDFDocumentFragment.java
  14. 30 0
      ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/annotation/CPDFAnnotationManager.java
  15. 2 0
      ComPDFKit_Tools/src/main/res/values/tools_strings.xml

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/CPDFAnnotationListFragment.java

@@ -247,7 +247,7 @@ public class CPDFAnnotationListFragment extends Fragment {
         });
         moreMenu.addItem(R.string.tools_view_replies, v -> {
             CPDFReplyDetailsDialogFragment replyDetailsDialogFragment = CPDFReplyDetailsDialogFragment.newInstance();
-            replyDetailsDialogFragment.setItem(item);
+            replyDetailsDialogFragment.setCPDFAnnotation(item.getAttr());
             replyDetailsDialogFragment.setAnnotAuthor(pdfView.getCPDFConfiguration().globalConfig.annotationAuthor);
             replyDetailsDialogFragment.setUpdateAnnotationListListener(()->{
                 listAdapter.remove(position);

+ 102 - 98
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/data/CPDFAnnotDatas.java

@@ -70,109 +70,113 @@ public class CPDFAnnotDatas {
             if (cpdfAnnotation == null || !cpdfAnnotation.isValid()){
                 continue;
             }
-            CPDFAnnotation.Type type = cpdfAnnotation.getType();
-            boolean isArrowLine = true;
-            int attrColor = Color.TRANSPARENT;
-            String attrTime = "";
-            CPDFDate modifyDate = cpdfAnnotation.getRecentlyModifyDate();
-            if (null != modifyDate){
-                attrTime = CPDFDate.toStandardDate(modifyDate);
+            CPDFAnnotListItem item = convertToListItem(cpdfAnnotation);
+            if (item != null){
+                annotListItems.add(item);
             }
-            int attrAlpha = 0;
-            String attrContent = "";
-            if (!cpdfAnnotation.isValid()) {
-                return annotListItems;
-            }
-            switch (cpdfAnnotation.getType()){
-                case TEXT:
-                    CPDFTextAnnotation textAnnotation = (CPDFTextAnnotation) cpdfAnnotation;
-                    attrColor = textAnnotation.getColor();
-                    attrAlpha = textAnnotation.getAlpha();
-                    attrContent = textAnnotation.getContent();
-                    break;
-                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();
-                    attrContent = cpdfInkAnnotation.getContent();
-                    break;
-                case LINE:
-                    CPDFLineAnnotation lineAnnotation = (CPDFLineAnnotation) cpdfAnnotation;
-                    isArrowLine = lineAnnotation.getLineHeadType() == CPDFLineAnnotation.LineType.LINETYPE_ARROW;
-                    attrColor = lineAnnotation.getBorderColor();
-                    attrAlpha = lineAnnotation.getBorderAlpha();
-                    attrContent = lineAnnotation.getContent();
-                    break;
-                case FREETEXT:
-                    CPDFFreetextAnnotation annotation = (CPDFFreetextAnnotation) cpdfAnnotation;
-                    attrContent = annotation.getContent();
-                    break;
-                case STAMP:
-                    CPDFStampAnnotation stampAnnotation = (CPDFStampAnnotation) cpdfAnnotation;
-                    attrContent = stampAnnotation.getContent();
-                    if (stampAnnotation.isStampSignature()){
-                        continue;
-                    }
-                    break;
-                case SQUARE:
-                    CPDFSquareAnnotation squareAnnotation = (CPDFSquareAnnotation) cpdfAnnotation;
-                    attrColor = squareAnnotation.getBorderColor();
-                    attrAlpha = squareAnnotation.getBorderAlpha();
-                    attrContent = squareAnnotation.getContent();
-                    break;
-                case CIRCLE:
-                    CPDFCircleAnnotation circleAnnotation = (CPDFCircleAnnotation) cpdfAnnotation;
-                    attrColor = circleAnnotation.getBorderColor();
-                    attrAlpha = circleAnnotation.getBorderAlpha();
-                    attrContent = circleAnnotation.getContent();
-                    break;
-                case SOUND:
-                    CPDFSoundAnnotation soundAnnotation = (CPDFSoundAnnotation) cpdfAnnotation;
-                    attrContent = soundAnnotation.getContent();
-                    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;
     }
 
+    public static CPDFAnnotListItem convertToListItem(CPDFAnnotation cpdfAnnotation){
+        CPDFAnnotation.Type type = cpdfAnnotation.getType();
+        boolean isArrowLine = true;
+        int attrColor = Color.TRANSPARENT;
+        String attrTime = "";
+        CPDFDate modifyDate = cpdfAnnotation.getRecentlyModifyDate();
+        if (null != modifyDate){
+            attrTime = CPDFDate.toStandardDate(modifyDate);
+        }
+        int attrAlpha = 0;
+        String attrContent = "";
+        switch (cpdfAnnotation.getType()){
+            case TEXT:
+                CPDFTextAnnotation textAnnotation = (CPDFTextAnnotation) cpdfAnnotation;
+                attrColor = textAnnotation.getColor();
+                attrAlpha = textAnnotation.getAlpha();
+                attrContent = textAnnotation.getContent();
+                break;
+            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();
+                attrContent = cpdfInkAnnotation.getContent();
+                break;
+            case LINE:
+                CPDFLineAnnotation lineAnnotation = (CPDFLineAnnotation) cpdfAnnotation;
+                isArrowLine = lineAnnotation.getLineHeadType() == CPDFLineAnnotation.LineType.LINETYPE_ARROW;
+                attrColor = lineAnnotation.getBorderColor();
+                attrAlpha = lineAnnotation.getBorderAlpha();
+                attrContent = lineAnnotation.getContent();
+                break;
+            case FREETEXT:
+                CPDFFreetextAnnotation annotation = (CPDFFreetextAnnotation) cpdfAnnotation;
+                attrContent = annotation.getContent();
+                break;
+            case STAMP:
+                CPDFStampAnnotation stampAnnotation = (CPDFStampAnnotation) cpdfAnnotation;
+                attrContent = stampAnnotation.getContent();
+                if (stampAnnotation.isStampSignature()){
+                    return null;
+                }
+                break;
+            case SQUARE:
+                CPDFSquareAnnotation squareAnnotation = (CPDFSquareAnnotation) cpdfAnnotation;
+                attrColor = squareAnnotation.getBorderColor();
+                attrAlpha = squareAnnotation.getBorderAlpha();
+                attrContent = squareAnnotation.getContent();
+                break;
+            case CIRCLE:
+                CPDFCircleAnnotation circleAnnotation = (CPDFCircleAnnotation) cpdfAnnotation;
+                attrColor = circleAnnotation.getBorderColor();
+                attrAlpha = circleAnnotation.getBorderAlpha();
+                attrContent = circleAnnotation.getContent();
+                break;
+            case SOUND:
+                CPDFSoundAnnotation soundAnnotation = (CPDFSoundAnnotation) cpdfAnnotation;
+                attrContent = soundAnnotation.getContent();
+                break;
+            default:
+                return null;
+        }
+        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(cpdfAnnotation.pdfPage.getPageNum());
+        item.setAnnotationCount(0);
+        item.setAttr(cpdfAnnotation);
+        item.setHeader(false);
+        return item;
+    }
+
 
     /**
      * export annotations to xfdf file

+ 5 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/dialog/CPDFEditReplyDialogFragment.java

@@ -58,6 +58,11 @@ public class CPDFEditReplyDialogFragment extends CBasicBottomSheetDialogFragment
     return true;
   }
 
+  @Override
+  protected boolean draggable() {
+    return false;
+  }
+
   @Override
   protected float dimAmount() {
     return CViewUtils.isLandScape(getContext()) ? 0.2F : 0F;

+ 14 - 11
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/annotation/pdfannotationlist/dialog/CPDFReplyDetailsDialogFragment.java

@@ -16,11 +16,13 @@ import androidx.appcompat.widget.AppCompatTextView;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.compdfkit.core.annotation.CPDFReplyAnnotation;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.annotation.pdfannotationlist.adapter.CPDFAnnotListAdapter;
 import com.compdfkit.tools.annotation.pdfannotationlist.adapter.CPDFAnnotReplyListAdapter;
 import com.compdfkit.tools.annotation.pdfannotationlist.bean.CPDFAnnotListItem;
+import com.compdfkit.tools.annotation.pdfannotationlist.data.CPDFAnnotDatas;
 import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment;
 import com.compdfkit.tools.common.utils.viewutils.CDimensUtils;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
@@ -48,7 +50,7 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
 
   private CPDFAnnotReplyListAdapter annotReplyListAdapter;
 
-  private CPDFAnnotListItem item;
+  private CPDFAnnotation cpdfAnnotation;
 
   private String annotAuthor;
 
@@ -71,8 +73,8 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
     return fragment;
   }
 
-  public void setItem(CPDFAnnotListItem item) {
-    this.item = item;
+  public void setCPDFAnnotation(CPDFAnnotation cpdfAnnotation) {
+    this.cpdfAnnotation = cpdfAnnotation;
   }
 
   public void setAnnotAuthor(String annotAuthor) {
@@ -99,7 +101,7 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
     tvAddNewReply = rootView.findViewById(R.id.tv_add_reply);
     toolBar.setBackBtnClickListener(v -> dismiss());
     tvDeleteAnnotation.setOnClickListener(v -> {
-        boolean result = item.getAttr().removeFromPage();
+        boolean result = cpdfAnnotation.removeFromPage();
         if (result){
           if (updateAnnotationListListener != null) {
             updateAnnotationListListener.delete();
@@ -110,8 +112,8 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
     tvAddNewReply.setOnClickListener(v -> {
       CPDFEditReplyDialogFragment addReplyDialog = CPDFEditReplyDialogFragment.addReply();
       addReplyDialog.setReplyContentListener(content -> {
-        if (item != null) {
-          CPDFReplyAnnotation replyAnnotation = item.getAttr().createReplyAnnotation();
+        if (cpdfAnnotation != null) {
+          CPDFReplyAnnotation replyAnnotation = cpdfAnnotation.createReplyAnnotation();
           replyAnnotation.setContent(content);
           replyAnnotation.setTitle(annotAuthor);
         }
@@ -128,9 +130,10 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
   }
 
   private void initAnnotItem(){
-    if (item != null) {
+    if (cpdfAnnotation != null) {
       annotListAdapter = new CPDFAnnotListAdapter();
       annotListAdapter.setShowMoreMenu(false);
+      CPDFAnnotListItem item = CPDFAnnotDatas.convertToListItem(cpdfAnnotation);
       annotListAdapter.setList(Arrays.asList(item));
       rvAnnot.setLayoutManager(new LinearLayoutManager(getContext()));
       rvAnnot.setAdapter(annotListAdapter);
@@ -146,11 +149,11 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
   }
 
   private void initReplyList(){
-    if (item == null) {
+    if (cpdfAnnotation == null) {
       return;
     }
     updateTotalCount();
-    CPDFReplyAnnotation[] replyAnnotations = item.getAttr().getAllReplyAnnotations();
+    CPDFReplyAnnotation[] replyAnnotations = cpdfAnnotation.getAllReplyAnnotations();
     annotReplyListAdapter = new CPDFAnnotReplyListAdapter();
     annotReplyListAdapter.setList(new ArrayList<>(Arrays.asList(replyAnnotations)));
     rvReplyList.setLayoutManager(new LinearLayoutManager(getContext()));
@@ -194,13 +197,13 @@ public class CPDFReplyDetailsDialogFragment extends CBasicBottomSheetDialogFragm
   }
 
   private void updateReplyList(){
-    CPDFReplyAnnotation[] replyAnnotations = item.getAttr().getAllReplyAnnotations();
+    CPDFReplyAnnotation[] replyAnnotations = cpdfAnnotation.getAllReplyAnnotations();
     annotReplyListAdapter.setList(new ArrayList<>(Arrays.asList(replyAnnotations)));
     updateTotalCount();
   }
 
   private void updateTotalCount(){
-    CPDFReplyAnnotation[] replyAnnotations = item.getAttr().getAllReplyAnnotations();
+    CPDFReplyAnnotation[] replyAnnotations = cpdfAnnotation.getAllReplyAnnotations();
     tvTotal.setVisibility(replyAnnotations.length >0 ? View.VISIBLE : View.INVISIBLE);
     tvTotal.setText(getString(R.string.tools_total, replyAnnotations.length));
   }

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

@@ -85,8 +85,11 @@ public class CPDFContextMenuHelper extends CPDFContextMenuShowHelper {
 
     private PopupWindow.OnDismissListener dismissListener;
 
+    private String annotationAuthor;
+
     public CPDFContextMenuHelper(CPDFViewCtrl pdfView, ContextMenuProviderParams params) {
         super(pdfView.getCPdfReaderView());
+        annotationAuthor = pdfView.getCPDFConfiguration().globalConfig.annotationAuthor;
         this.helperParams = params;
     }
 
@@ -300,6 +303,10 @@ public class CPDFContextMenuHelper extends CPDFContextMenuShowHelper {
         super.dismissContextMenu();
     }
 
+    public String getAnnotationAuthor() {
+        return annotationAuthor;
+    }
+
     private int loadType = CPDFEditPage.LoadNone;
 
     public void showInputOwnerPasswordDialog(CInputOwnerPwdDialog.COwnerPasswordListener ownerPasswordListener){

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

@@ -68,7 +68,6 @@ public class CEditTextContextMenuView implements ContextMenuEditTextProvider {
             pageView.operateEditTextArea(CPDFPageView.EditTextAreaFuncType.CUT);
             helper.dismissContextMenu();
         });
-
         menuView.addItem(R.string.tools_copy, 0, v -> {
             if (helper.isAllowsCopying()) {
                 pageView.operateEditTextArea(CPDFPageView.EditTextAreaFuncType.COPY);

+ 9 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CFreeTextContextMenuView.java

@@ -18,6 +18,7 @@ import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuFreeTextProvider;
 import com.compdfkit.tools.common.contextmenu.provider.ContextMenuView;
+import com.compdfkit.tools.common.utils.annotation.CPDFAnnotationManager;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleDialogFragment;
 import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
@@ -47,6 +48,14 @@ public class CFreeTextContextMenuView implements ContextMenuFreeTextProvider {
                 pageView.createInputBox(freetextAnnotImpl, IContextMenuShowListener.ContextMenuType.FreeTextEdit);
                 helper.dismissContextMenu();
             });
+            menuView.addItem(R.string.tools_reply, v -> {
+                new CPDFAnnotationManager().showAddReplyDialog(freetextAnnotImpl, helper);
+                helper.dismissContextMenu();
+            });
+            menuView.addItem(R.string.tools_view_reply, v -> {
+                new CPDFAnnotationManager().showReplyDetailsDialog(pageView, freetextAnnotImpl, helper);
+                helper.dismissContextMenu();
+            });
             menuView.addItem(R.string.tools_delete, v -> {
                 pageView.deleteAnnotation(freetextAnnotImpl);
                 helper.dismissContextMenu();

+ 8 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CInkContextMenuView.java

@@ -47,6 +47,14 @@ public class CInkContextMenuView implements ContextMenuInkProvider {
             annotationManager.editNote(helper.getReaderView(), pageView, inkAnnotImpl.onGetAnnotation());
             helper.dismissContextMenu();
         });
+        menuView.addItem(R.string.tools_reply, v -> {
+            new CPDFAnnotationManager().showAddReplyDialog(inkAnnotImpl, helper);
+            helper.dismissContextMenu();
+        });
+        menuView.addItem(R.string.tools_view_reply, v -> {
+            new CPDFAnnotationManager().showReplyDetailsDialog(pageView, inkAnnotImpl, helper);
+            helper.dismissContextMenu();
+        });
         menuView.addItem(R.string.tools_delete, v -> {
             pageView.deleteAnnotation(inkAnnotImpl);
             helper.dismissContextMenu();

+ 11 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CMarkupContextMenuView.java

@@ -14,7 +14,10 @@ import android.view.View;
 
 import androidx.fragment.app.FragmentActivity;
 
+import com.compdfkit.core.annotation.CPDFReplyAnnotation;
 import com.compdfkit.tools.R;
+import com.compdfkit.tools.annotation.pdfannotationlist.dialog.CPDFEditReplyDialogFragment;
+import com.compdfkit.tools.annotation.pdfannotationlist.dialog.CPDFReplyDetailsDialogFragment;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuMarkupProvider;
 import com.compdfkit.tools.common.contextmenu.provider.ContextMenuView;
@@ -48,6 +51,14 @@ public class CMarkupContextMenuView implements ContextMenuMarkupProvider {
             annotationManager.editNote(helper.getReaderView(), pageView, markupAnnotImpl.onGetAnnotation());
             helper.dismissContextMenu();
         });
+        menuView.addItem(R.string.tools_reply, v -> {
+            new CPDFAnnotationManager().showAddReplyDialog(markupAnnotImpl, helper);
+            helper.dismissContextMenu();
+        });
+        menuView.addItem(R.string.tools_view_reply, v -> {
+            new CPDFAnnotationManager().showReplyDetailsDialog(pageView, markupAnnotImpl, helper);
+            helper.dismissContextMenu();
+        });
         menuView.addItem(R.string.tools_delete, v -> {
             pageView.deleteAnnotation(markupAnnotImpl);
             helper.dismissContextMenu();

+ 8 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CShapeContextMenuView.java

@@ -47,6 +47,14 @@ public class CShapeContextMenuView implements ContextMenuShapeProvider {
             annotationManager.editNote(helper.getReaderView(), pageView, annotImpl.onGetAnnotation());
             helper.dismissContextMenu();
         });
+        menuView.addItem(R.string.tools_reply, v -> {
+            new CPDFAnnotationManager().showAddReplyDialog(annotImpl, helper);
+            helper.dismissContextMenu();
+        });
+        menuView.addItem(R.string.tools_view_reply, v -> {
+            new CPDFAnnotationManager().showReplyDetailsDialog(pageView, annotImpl, helper);
+            helper.dismissContextMenu();
+        });
         menuView.addItem(R.string.tools_delete, v -> {
             pageView.deleteAnnotation(annotImpl);
             helper.dismissContextMenu();

+ 9 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CSoundContextMenuView.java

@@ -21,6 +21,7 @@ import com.compdfkit.tools.annotation.pdfproperties.pdfsound.CRecordVoicePopupWi
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuSoundContentProvider;
 import com.compdfkit.tools.common.contextmenu.provider.ContextMenuView;
+import com.compdfkit.tools.common.utils.annotation.CPDFAnnotationManager;
 import com.compdfkit.tools.common.utils.threadpools.SimpleBackgroundTask;
 import com.compdfkit.ui.proxy.CPDFSoundAnnotImpl;
 import com.compdfkit.ui.reader.CPDFPageView;
@@ -69,6 +70,14 @@ public class CSoundContextMenuView implements ContextMenuSoundContentProvider {
                 voicePopupWindow.show();
             });
         }
+        menuView.addItem(R.string.tools_reply, v -> {
+            new CPDFAnnotationManager().showAddReplyDialog(soundAnnotImpl, helper);
+            helper.dismissContextMenu();
+        });
+        menuView.addItem(R.string.tools_view_reply, v -> {
+            new CPDFAnnotationManager().showReplyDetailsDialog(pageView, soundAnnotImpl, helper);
+            helper.dismissContextMenu();
+        });
         menuView.addItem(R.string.tools_delete, v -> {
             pageView.deleteAnnotation(soundAnnotImpl);
             helper.dismissContextMenu();

+ 8 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/contextmenu/impl/CStampContextMenuView.java

@@ -42,6 +42,14 @@ public class CStampContextMenuView implements ContextMenuStampProvider {
                 annotationManager.editNote(helper.getReaderView(), pageView, stampAnnotImpl.onGetAnnotation());
                 helper.dismissContextMenu();
             });
+            menuView.addItem(R.string.tools_reply, v -> {
+                new CPDFAnnotationManager().showAddReplyDialog(stampAnnotImpl, helper);
+                helper.dismissContextMenu();
+            });
+            menuView.addItem(R.string.tools_view_reply, v -> {
+                new CPDFAnnotationManager().showReplyDetailsDialog(pageView, stampAnnotImpl, helper);
+                helper.dismissContextMenu();
+            });
         }
         menuView.addItem(R.string.tools_delete, v -> {
             pageView.deleteAnnotation(stampAnnotImpl);

+ 1 - 1
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/pdf/CPDFDocumentFragment.java

@@ -261,6 +261,7 @@ public class CPDFDocumentFragment extends CBasicPDFFragment {
     }
 
     private void initPDFView() {
+        pdfView.setCPDFConfiguration(cpdfConfiguration);
         pdfView.getCPdfReaderView().setMinScaleEnable(false);
         registerAnnotHelper(pdfView);
         registerFormHelper(pdfView);
@@ -797,7 +798,6 @@ public class CPDFDocumentFragment extends CBasicPDFFragment {
 
     private void applyConfiguration() {
         CPDFApplyConfigUtil.getInstance().applyConfiguration(this, cpdfConfiguration);
-        pdfView.setCPDFConfiguration(cpdfConfiguration);
     }
 
     @Override

+ 30 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/annotation/CPDFAnnotationManager.java

@@ -23,6 +23,7 @@ import androidx.fragment.app.FragmentManager;
 
 import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.compdfkit.core.annotation.CPDFFreetextAnnotation;
+import com.compdfkit.core.annotation.CPDFReplyAnnotation;
 import com.compdfkit.core.annotation.CPDFStampAnnotation;
 import com.compdfkit.core.annotation.CPDFTextAnnotation;
 import com.compdfkit.core.annotation.CPDFTextAttribute;
@@ -36,7 +37,10 @@ import com.compdfkit.core.document.action.CPDFUriAction;
 import com.compdfkit.core.page.CPDFPage;
 import com.compdfkit.core.utils.TMathUtils;
 import com.compdfkit.tools.R;
+import com.compdfkit.tools.annotation.pdfannotationlist.dialog.CPDFEditReplyDialogFragment;
+import com.compdfkit.tools.annotation.pdfannotationlist.dialog.CPDFReplyDetailsDialogFragment;
 import com.compdfkit.tools.annotation.pdfproperties.pdfnote.CNoteEditDialog;
+import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
 import com.compdfkit.tools.common.views.pdfproperties.action.CActionEditDialogFragment;
 import com.compdfkit.tools.forms.pdfproperties.option.edit.CFormOptionEditFragment;
 import com.compdfkit.ui.attribute.CPDFFreetextAttr;
@@ -47,6 +51,8 @@ import com.compdfkit.ui.reader.CPDFPageView;
 import com.compdfkit.ui.reader.CPDFReaderView;
 import com.compdfkit.ui.utils.CPDFTextUtils;
 
+import java.lang.annotation.Annotation;
+
 public class CPDFAnnotationManager {
 
     public void addFreeText(String content, CPDFReaderView readerView, CPDFPageView pageView, PointF pointF) {
@@ -341,4 +347,28 @@ public class CPDFAnnotationManager {
         });
         actionEditDialogFragment.show(fragmentManager, "actionEdit");
     }
+
+    public void showAddReplyDialog(CPDFBaseAnnotImpl annotImpl, CPDFContextMenuHelper helper){
+        CPDFEditReplyDialogFragment editReplyDialogFragment = CPDFEditReplyDialogFragment.addReply();
+        editReplyDialogFragment.setReplyContentListener(content -> {
+            CPDFReplyAnnotation replyAnnotation = annotImpl.onGetAnnotation()
+                    .createReplyAnnotation();
+            replyAnnotation.setTitle(helper.getAnnotationAuthor());
+            replyAnnotation.setContent(content);
+        });
+        editReplyDialogFragment.show(helper.getFragmentManager(), "addReplyDialogFragment");
+    }
+
+    public void showReplyDetailsDialog(CPDFPageView pageView, CPDFBaseAnnotImpl annotImpl, CPDFContextMenuHelper helper){
+        CPDFReplyDetailsDialogFragment dialogFragment = CPDFReplyDetailsDialogFragment.newInstance();
+        dialogFragment.setCPDFAnnotation(annotImpl.onGetAnnotation());
+        dialogFragment.setAnnotAuthor(helper.getAnnotationAuthor());
+        dialogFragment.setUpdateAnnotationListListener(()->{
+            pageView.deleteAnnotation(annotImpl);
+            helper.dismissContextMenu();
+        });
+        dialogFragment.show(helper.getFragmentManager(), "ReplyDetailsDialogFragment");
+    }
+
+
 }

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

@@ -519,6 +519,8 @@
     <string name="tools_reply_or_add_thoughts">Reply or add thoughts</string>
     <string name="tools_replies_of_annotation">Replies of Annotation</string>
     <string name="tools_total">Total: %d</string>
+    <string name="tools_reply">Reply</string>
+    <string name="tools_view_reply">View Reply</string>
 
 
 </resources>