123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472 |
- /**
- * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
- * <p>
- * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
- * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
- * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
- * This notice may not be removed from this file.
- */
- package com.compdfkit.pdfviewer;
- import static com.compdfkit.tools.contenteditor.CEditToolbar.SELECT_AREA_IMAGE;
- import static com.compdfkit.tools.contenteditor.CEditToolbar.SELECT_AREA_TEXT;
- import static com.compdfkit.ui.contextmenu.CPDFContextMenuShowHelper.AddEditImageArea;
- import static com.compdfkit.ui.contextmenu.CPDFContextMenuShowHelper.ReplaceEditImageArea;
- import android.Manifest;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Toast;
- import androidx.activity.result.ActivityResultLauncher;
- import androidx.activity.result.contract.ActivityResultContracts;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import com.compdfkit.core.annotation.CPDFAnnotation;
- import com.compdfkit.core.annotation.form.CPDFWidget;
- import com.compdfkit.core.edit.CPDFEditManager;
- import com.compdfkit.pdfviewer.databinding.PdfSampleActivityBinding;
- import com.compdfkit.tools.common.activity.CBasicActivity;
- import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
- import com.compdfkit.tools.common.utils.CFileUtils;
- import com.compdfkit.tools.common.utils.CUriUtil;
- import com.compdfkit.tools.common.utils.annotation.CPDFAnnotationManager;
- import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
- import com.compdfkit.tools.common.utils.task.CExtractAssetFileTask;
- import com.compdfkit.tools.common.utils.window.CPopupMenuWindow;
- import com.compdfkit.tools.common.views.pdfbota.CPDFBOTA;
- import com.compdfkit.tools.common.views.pdfbota.CPDFBotaDialogFragment;
- import com.compdfkit.tools.common.views.pdfbota.CPDFBotaFragmentTabs;
- import com.compdfkit.tools.common.views.pdfproperties.CAnnotationType;
- import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CAnnotStyle;
- import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleDialogFragment;
- import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.CStyleType;
- import com.compdfkit.tools.common.views.pdfproperties.pdfstyle.manager.CStyleManager;
- import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
- import com.compdfkit.tools.contenteditor.CPDFEditType;
- import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
- import com.compdfkit.ui.contextmenu.IContextMenuShowListener;
- import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
- import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
- import com.compdfkit.ui.proxy.form.CPDFPushbuttonWidgetImpl;
- import com.compdfkit.ui.reader.CPDFPageView;
- import com.compdfkit.ui.reader.CPDFReaderView;
- import java.util.ArrayList;
- import java.util.Arrays;
- import pub.devrel.easypermissions.AfterPermissionGranted;
- import pub.devrel.easypermissions.AppSettingsDialog;
- import pub.devrel.easypermissions.EasyPermissions;
- public class MainActivity extends CBasicActivity {
- /**
- * assets folder pdf file
- */
- public static final String QUICK_START_GUIDE = "Quick Start Guide V2.4.0.pdf";
- private PdfSampleActivityBinding binding;
- CSampleScreenManager screenManager = new CSampleScreenManager();
- private ActivityResultLauncher<Intent> selectDocumentLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
- if (result.getData() != null && result.getData().getData() != null) {
- CPDFReaderView readerView = binding.pdfView.getCPdfReaderView();
- if (readerView != null && readerView.getEditManager() != null) {
- readerView.getEditManager().endEdit();
- }
- if (readerView.getContextMenuShowListener() != null) {
- readerView.getContextMenuShowListener().dismissContextMenu();
- }
- Uri uri = result.getData().getData();
- CFileUtils.takeUriPermission(this, uri);
- resetContextMenu(binding.pdfView, CPreviewMode.Viewer);
- binding.pdfView.resetAnnotationType();
- binding.formToolBar.reset();
- binding.editToolBar.resetStatus();
- binding.pdfToolBar.selectMode(CPreviewMode.Viewer);
- screenManager.changeWindowStatus(CPreviewMode.Viewer);
- binding.pdfView.openPDF(uri, () -> {
- binding.editToolBar.setEditMode(false);
- });
- }
- });
- private final static int RC_PERMISSION_PERM = 111;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- binding = PdfSampleActivityBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
- screenManager.bind(binding);
- //Extract PDF files from the Android assets folder
- initPDFView();
- initToolBarView();
- initSearchBar();
- initAnnotToolbar();
- initFormToolbar();
- initEditBar();
- setPreviewMode(CPreviewMode.Viewer);
- onDoNext();
- }
- private void initPDFView() {
- CExtractAssetFileTask.extract(this, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> {
- binding.pdfView.openPDF(filePath);
- binding.editToolBar.setEditMode(false);
- }
- );
- binding.pdfView.setAllowAddAndEditAnnot(false);
- binding.pdfView.getCPdfReaderView().setMinScaleEnable(false);
- resetContextMenu(binding.pdfView, CPreviewMode.Viewer);
- initAnnotationAttr(binding.pdfView);
- initFormAttr(binding.pdfView);
- registerAnnotHelper(binding.pdfView);
- registerFormHelper(binding.pdfView);
- binding.pdfView.addOnPDFFocusedTypeChangeListener(type -> {
- if (type != CPDFAnnotation.Type.INK) {
- if (binding.inkCtrlView.getVisibility() == View.VISIBLE) {
- screenManager.changeWindowStatus(type);
- }
- }
- });
- binding.pdfView.setOnTapMainDocAreaCallback(() -> {
- //Use the CFillScreenManager.class to manage fullscreen switching.
- screenManager.fillScreenChange();
- });
- binding.pdfView.getCPdfReaderView().setPdfAddAnnotCallback((cpdfPageView, cpdfBaseAnnot) -> {
- // Annotation creation completed listener, you can use cpdfBaseAnnot.getAnnotType() to determine the type of the added annotation
- if (cpdfBaseAnnot instanceof CPDFListboxWidgetImpl) {
- // When the ListBox form is created, display an editing dialog for adding list data
- CPDFAnnotationManager annotationManager = new CPDFAnnotationManager();
- annotationManager.showFormListEditFragment(getSupportFragmentManager(), cpdfBaseAnnot, cpdfPageView, false);
- } else if (cpdfBaseAnnot instanceof CPDFComboboxWidgetImpl) {
- // When the ComboBox form is created, display an editing dialog for adding list data
- CPDFAnnotationManager annotationManager = new CPDFAnnotationManager();
- annotationManager.showFormComboBoxEditFragment(getSupportFragmentManager(), cpdfBaseAnnot, cpdfPageView,true);
- } else if (cpdfBaseAnnot instanceof CPDFPushbuttonWidgetImpl) {
- // When the PushButton form is created, display a dialog for editing the action method
- CPDFAnnotationManager annotationManager = new CPDFAnnotationManager();
- annotationManager.showPushButtonActionDialog(getSupportFragmentManager(), binding.pdfView.getCPdfReaderView(),
- cpdfBaseAnnot, cpdfPageView);
- }
- });
- }
- private void setPreviewMode(CPreviewMode mode) {
- if (binding.pdfView.getCPdfReaderView() == null) {
- return;
- }
- binding.pdfView.getCPdfReaderView().removeAllAnnotFocus();
- IContextMenuShowListener contextMenuShowListener = binding.pdfView.getCPdfReaderView().getContextMenuShowListener();
- if (contextMenuShowListener != null) {
- contextMenuShowListener.dismissContextMenu();
- }
- screenManager.changeWindowStatus(mode);
- binding.pdfToolBar.selectMode(mode);
- binding.formToolBar.reset();
- resetContextMenu(binding.pdfView, mode);
- CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
- if (mode == CPreviewMode.Edit) {
- if (editManager != null && !editManager.isEditMode()) {
- editManager.beginEdit(CPDFEditType.EDIT_TEXT_IMAGE);
- }
- if (!hasPermissions(STORAGE_PERMISSIONS)){
- EasyPermissions.requestPermissions(this, "request permission", 1234, STORAGE_PERMISSIONS);
- }
- } else {
- if (editManager != null && editManager.isEditMode()) {
- editManager.endEdit();
- }
- switch (mode) {
- case Viewer:
- binding.pdfView.getCPdfReaderView().setCurrentFocusedFormType(CPDFWidget.WidgetType.Widget_Unknown);
- binding.pdfView.getCPdfReaderView().setCurrentFocusedType(CPDFAnnotation.Type.UNKNOWN);
- binding.pdfView.getCPdfReaderView().setTouchMode(CPDFReaderView.TouchMode.BROWSE);
- binding.pdfView.setAllowAddAndEditAnnot(true);
- break;
- case Annotation:
- binding.pdfView.setAllowAddAndEditAnnot(true);
- binding.pdfView.resetAnnotationType();
- break;
- case Form:
- binding.pdfView.getCPdfReaderView().setCurrentFocusedFormType(CPDFWidget.WidgetType.Widget_Unknown);
- binding.pdfView.getCPdfReaderView().setCurrentFocusedType(CPDFAnnotation.Type.WIDGET);
- binding.pdfView.getCPdfReaderView().setTouchMode(CPDFReaderView.TouchMode.BROWSE);
- binding.pdfView.setAllowAddAndEditAnnot(true);
- break;
- default:
- break;
- }
- }
- }
- private void initToolBarView() {
- binding.pdfToolBar.addMode(CPreviewMode.Annotation);
- binding.pdfToolBar.addMode(CPreviewMode.Edit);
- binding.pdfToolBar.addMode(CPreviewMode.Form);
- binding.pdfToolBar.setPreviewModeChangeListener(this::setPreviewMode);
- binding.pdfToolBar.setSearchBtnClickListener(v -> {
- binding.pdfView.exitEditMode();
- curEditMode = binding.pdfView.getCPdfReaderView().getLoadType();
- binding.pdfToolBar.setVisibility(View.GONE);
- binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
- binding.pdfSearchToolBar.showKeyboard();
- });
- binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
- showPageEdit(binding.pdfView, false,()->{
- if (curEditMode > 0 && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
- CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
- if (!editManager.isEditMode()) {
- editManager.beginEdit(curEditMode);
- }
- }
- });
- });
- binding.pdfToolBar.setBoTaBtnClickListener(v -> {
- binding.pdfView.getCPdfReaderView().removeAllAnnotFocus();
- binding.pdfView.exitEditMode();
- ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
- CPDFBotaFragmentTabs annotationTab = new CPDFBotaFragmentTabs(CPDFBOTA.ANNOTATION, getString(R.string.tools_annotations));
- CPDFBotaFragmentTabs outlineTab = new CPDFBotaFragmentTabs(CPDFBOTA.OUTLINE, getString(R.string.tools_outlines));
- CPDFBotaFragmentTabs bookmarkTab = new CPDFBotaFragmentTabs(CPDFBOTA.BOOKMARKS, getString(R.string.tools_bookmarks));
- if (binding.pdfToolBar.getMode() == CPreviewMode.Viewer) {
- tabs.add(outlineTab);
- tabs.add(bookmarkTab);
- } else {
- tabs.add(outlineTab);
- tabs.add(bookmarkTab);
- tabs.add(annotationTab);
- }
- CPDFBotaDialogFragment dialogFragment = CPDFBotaDialogFragment.newInstance();
- dialogFragment.initWithPDFView(binding.pdfView);
- dialogFragment.setBotaDialogTabs(tabs);
- dialogFragment.show(getSupportFragmentManager(), "annotationList");
- });
- binding.pdfToolBar.setMoreBtnClickListener(v -> {
- v.setSelected(true);
- //Show the PDF settings dialog fragment
- CPopupMenuWindow menuWindow = new CPopupMenuWindow(this);
- menuWindow.addItem(R.drawable.tools_ic_preview_settings, R.string.tools_view_setting, v1 -> {
- showDisplaySettings(binding.pdfView);
- });
- menuWindow.addItem(R.drawable.tools_page_edit, R.string.tools_page_edit_toolbar_title, v1 -> {
- showPageEdit(binding.pdfView, true,()->{
- if (curEditMode > 0 && binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
- CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
- if (!editManager.isEditMode()) {
- editManager.beginEdit(curEditMode);
- }
- }
- });
- });
- menuWindow.addItem(R.drawable.tools_ic_document_info, R.string.tools_document_info, v1 -> {
- showDocumentInfo(binding.pdfView);
- });
- menuWindow.addItem(R.drawable.tools_ic_share, R.string.tools_share, v1 -> {
- sharePDF(binding.pdfView);
- });
- menuWindow.addItem(R.drawable.tools_ic_new_file, R.string.tools_open_document, v1 -> {
- if (hasPermissions(STORAGE_PERMISSIONS)) {
- selectDocument();
- } else {
- EasyPermissions.requestPermissions(this, "request permission", REQUEST_EXTERNAL_PERMISSION, STORAGE_PERMISSIONS);
- }
- });
- menuWindow.setOnDismissListener(() -> v.setSelected(false));
- menuWindow.showAsDropDown(v);
- });
- }
- private void initAnnotToolbar() {
- binding.annotationToolBar.initWithPDFView(binding.pdfView);
- binding.annotationToolBar.setFragmentManager(getSupportFragmentManager());
- binding.annotationToolBar.setAnnotationChangeListener(type -> {
- screenManager.changeWindowStatus(type);
- //You are required to grant recording permission when selecting voice notes
- if (type == CAnnotationType.SOUND) {
- if (!EasyPermissions.hasPermissions(this, Manifest.permission.RECORD_AUDIO)) {
- EasyPermissions.requestPermissions(this, getString(R.string.tools_use_sound_annot), 112, Manifest.permission.RECORD_AUDIO);
- }
- }
- });
- binding.inkCtrlView.initWithPDFView(binding.pdfView);
- binding.inkCtrlView.setFragmentManager(getSupportFragmentManager());
- }
- private void initFormToolbar() {
- binding.formToolBar.initWithPDFView(binding.pdfView);
- binding.formToolBar.setFragmentManager(getSupportFragmentManager());
- }
- private void initSearchBar() {
- binding.pdfSearchToolBar.initWithPDFView(binding.pdfView);
- binding.pdfSearchToolBar.onSearchQueryResults(list -> {
- CSearchResultDialogFragment searchResultDialog = new CSearchResultDialogFragment();
- searchResultDialog.show(getSupportFragmentManager(), "searchResultDialogFragment");
- searchResultDialog.setSearchTextInfos(list);
- searchResultDialog.setOnClickSearchItemListener(clickItem -> {
- binding.pdfView.getCPdfReaderView().setDisplayPageIndex(clickItem.page);
- binding.pdfView.getCPdfReaderView().getTextSearcher().searchBegin(clickItem.page, clickItem.textRangeIndex);
- searchResultDialog.dismiss();
- });
- });
- binding.pdfSearchToolBar.setExitSearchListener(() -> {
- if (curEditMode > 0) {
- CPDFEditManager editManager = binding.pdfView.getCPdfReaderView().getEditManager();
- if (!editManager.isEditMode()) {
- editManager.beginEdit(curEditMode);
- }
- }
- binding.pdfToolBar.setVisibility(View.VISIBLE);
- binding.pdfSearchToolBar.setVisibility(View.GONE);
- });
- }
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == REQUEST_EXTERNAL_PERMISSION) {
- if (EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- selectDocument();
- }
- } else if (requestCode == 112) {
- if (!EasyPermissions.hasPermissions(this, permissions)) {
- if (EasyPermissions.somePermissionPermanentlyDenied(this, Arrays.asList(permissions))) {
- new AppSettingsDialog.Builder(this)
- .build().show();
- }else {
- binding.pdfView.resetAnnotationType();
- }
- }
- } else if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
- if (!EasyPermissions.hasPermissions(this, permissions)) {
- binding.pdfView.resetAnnotationType();
- }
- }
- }
- private void initEditBar() {
- if (binding.pdfView == null || binding.pdfView.getCPdfReaderView() == null) {
- return;
- }
- binding.editToolBar.initWithPDFView(binding.pdfView);
- binding.editToolBar.setEditPropertyBtnClickListener((view) -> {
- int type = binding.pdfView.getCPdfReaderView().getSelectAreaType();
- CStyleType styleType = CStyleType.UNKNOWN;
- if (type == SELECT_AREA_TEXT) {
- styleType = CStyleType.EDIT_TEXT;
- } else if (type == SELECT_AREA_IMAGE) {
- styleType = CStyleType.EDIT_IMAGE;
- }
- if (styleType != CStyleType.UNKNOWN) {
- CPDFReaderView readerView = binding.pdfView.getCPdfReaderView();
- CPDFContextMenuHelper menuHelper = (CPDFContextMenuHelper) readerView.getContextMenuShowListener();
- if (menuHelper == null || menuHelper.getReaderView() == null) {
- return;
- }
- CStyleManager styleManager = new CStyleManager(menuHelper.getEditSelection(), menuHelper.getPageView());
- CAnnotStyle annotStyle = styleManager.getStyle(styleType);
- CStyleDialogFragment styleDialogFragment = CStyleDialogFragment.newInstance(annotStyle);
- styleManager.setAnnotStyleFragmentListener(styleDialogFragment);
- styleManager.setDialogHeightCallback(styleDialogFragment, binding.pdfView.getCPdfReaderView());
- styleDialogFragment.show(getSupportFragmentManager(), "textPropertyDialogFragment");
- menuHelper.dismissContextMenu();
- }
- });
- binding.pdfView.setEndScrollCallback(() -> {
- binding.editToolBar.updateUndoRedo();
- });
- }
- private void selectDocument() {
- if (binding.pdfToolBar.getMode() == CPreviewMode.Edit) {
- binding.pdfView.exitEditMode();
- }
- if (!binding.pdfView.getCPdfReaderView().getPDFDocument().hasChanges()) {
- selectDocumentLauncher.launch(CFileUtils.getContentIntent());
- return;
- }
- CAlertDialog alertDialog = CAlertDialog.newInstance(getString(com.compdfkit.tools.R.string.tools_save_title), getString(com.compdfkit.tools.R.string.tools_save_message));
- alertDialog.setConfirmClickListener(v -> {
- //save pdf document
- binding.pdfView.savePDF((filePath, pdfUri) -> {
- alertDialog.dismiss();
- selectDocumentLauncher.launch(CFileUtils.getContentIntent());
- });
- });
- alertDialog.setCancelClickListener(v -> {
- alertDialog.dismiss();
- selectDocumentLauncher.launch(CFileUtils.getContentIntent());
- });
- alertDialog.show(getSupportFragmentManager(), "alertDialog");
- }
- @AfterPermissionGranted(RC_PERMISSION_PERM)
- private void onDoNext() {
- if (!hasPermissions()) {
- EasyPermissions.requestPermissions(this, getString(R.string.app_permission_storage), RC_PERMISSION_PERM, STORAGE_PERMISSIONS);
- }
- }
- @Override
- public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == ReplaceEditImageArea) {
- if (binding.pdfView == null || binding.pdfView.getCPdfReaderView() == null) {
- return;
- }
- for (int i = 0; i < binding.pdfView.getCPdfReaderView().getChildCount(); i++) {
- CPDFPageView pageView = (CPDFPageView) binding.pdfView.getCPdfReaderView().getChildAt(i);
- if (pageView == null) {
- continue;
- }
- if (data == null) {
- return;
- }
- if (pageView.getPageNum() == binding.pdfView.getCPdfReaderView().getPageNum()) {
- CUriUtil util = new CUriUtil();
- boolean ret = pageView.operateEditImageArea(CPDFPageView.EditImageFuncType.REPLACE, util.getPath(this, data.getData()));
- if (ret == false) {
- Toast.makeText(getApplicationContext(), "replace fail", Toast.LENGTH_LONG).show();
- }
- break;
- }
- }
- } else if (requestCode == AddEditImageArea) {
- if (binding.pdfView == null || binding.pdfView.getCPdfReaderView() == null) {
- return;
- }
- if (data == null) {
- return;
- }
- for (int i = 0; i < binding.pdfView.getCPdfReaderView().getChildCount(); i++) {
- CPDFPageView pageView = (CPDFPageView) binding.pdfView.getCPdfReaderView().getChildAt(i);
- if (pageView == null) {
- continue;
- }
- if (pageView.getPageNum() == binding.pdfView.getCPdfReaderView().getAddImagePage()) {
- CUriUtil util = new CUriUtil();
- boolean ret = pageView.addEditImageArea(binding.pdfView.getCPdfReaderView().getAddImagePoint(), util.getPath(this, data.getData()));
- if (ret == false) {
- Toast.makeText(getApplicationContext(), "add fail", Toast.LENGTH_LONG).show();
- }
- break;
- }
- }
- }
- }
- @Override
- public void onBackPressed() {
- if (binding.pdfView != null) {
- binding.pdfView.savePDF((filePath, pdfUri) -> super.onBackPressed());
- }
- }
- }
|