123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- /**
- * 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.digitalsignature;
- import android.Manifest;
- import android.os.Build;
- import android.os.Bundle;
- import android.view.View;
- import androidx.activity.result.ActivityResultLauncher;
- import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
- import com.compdfkit.core.document.CPDFDocument;
- import com.compdfkit.digitalsignature.databinding.SignaturesPdfSampleActivityBinding;
- import com.compdfkit.tools.common.basic.activity.CBasicPDFActivity;
- import com.compdfkit.tools.common.utils.CFileUtils;
- import com.compdfkit.tools.common.utils.CPermissionUtil;
- import com.compdfkit.tools.common.utils.activitycontracts.CSelectPDFDocumentResultContract;
- import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
- import com.compdfkit.tools.common.utils.task.CExtractAssetFileTask;
- import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
- 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.pdfview.CPDFViewCtrl;
- import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
- import com.compdfkit.tools.signature.CertificateDigitalDatas;
- import com.compdfkit.tools.signature.bean.CPDFDocumentSignInfo;
- import com.compdfkit.tools.signature.info.signlist.CPDFCertDigitalSignListDialog;
- import com.compdfkit.tools.signature.pdfproperties.pdfsign.CDigitalSignatureWidgetImpl;
- import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
- import com.compdfkit.ui.reader.CPDFReaderView;
- import java.util.ArrayList;
- public class PDFSignaturesSampleActivity extends CBasicPDFActivity {
- /**
- * assets folder pdf file
- */
- public static final String QUICK_START_GUIDE = "4KDAN_adobe + chunghwa.pdf";
- private SignaturesPdfSampleActivityBinding binding;
- private CViewerScreenStatusManager screenStatusManager;
- private ActivityResultLauncher<Void> selectDocumentLauncher = registerForActivityResult(new CSelectPDFDocumentResultContract(), uri -> {
- if (uri != null) {
- CFileUtils.takeUriPermission(this, uri);
- binding.pdfView.setViewMode(CPDFReaderView.ViewMode.VIEW);
- screenStatusManager.constraintHide(binding.signStatusView);
- binding.signatureToolBar.reset();
- binding.pdfView.openPDF(uri);
- }
- });
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- binding = SignaturesPdfSampleActivityBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
- binding.pdfView.setViewMode(CPDFReaderView.ViewMode.VIEW);
- screenStatusManager = new CViewerScreenStatusManager(binding);
- binding.pdfView.getCPdfReaderView().setFormFieldHighlight(true);
- initToolbarListener();
- initSearchBar();
- initSignatureToolbar();
- //Extract PDF files from the Android assets folder
- CExtractAssetFileTask.extract(this, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> {
- binding.pdfView.openPDF(filePath);
- });
- resetContextMenu(binding.pdfView, CPreviewMode.Signature);
- binding.pdfView.setOnTapMainDocAreaCallback(() -> {
- screenStatusManager.fillScreenChange();
- });
- binding.pdfView.getCPdfReaderView().setMinScaleEnable(false);
- registerSignaturesHelper(binding.pdfView);
- initFormAttr(binding.pdfView);
- }
- private void initToolbarListener() {
- binding.pdfToolBar.addMode(CPreviewMode.Viewer);
- binding.pdfToolBar.addMode(CPreviewMode.Signature);
- binding.pdfToolBar.selectMode(CPreviewMode.Signature);
- binding.pdfToolBar.setPreviewModeChangeListener(mode -> {
- binding.pdfToolBar.selectMode(mode);
- screenStatusManager.changeWindowStatus(mode);
- binding.pdfView.setViewMode(CPDFReaderView.ViewMode.VIEW);
- binding.signatureToolBar.reset();
- resetContextMenu(binding.pdfView, mode);
- });
- binding.pdfToolBar.setSearchBtnClickListener(v -> {
- binding.pdfToolBar.setVisibility(View.GONE);
- binding.pdfSearchToolBar.setVisibility(View.VISIBLE);
- binding.pdfSearchToolBar.showKeyboard();
- binding.pdfView.setViewMode(CPDFReaderView.ViewMode.VIEW);
- binding.signatureToolBar.reset();
- });
- binding.pdfToolBar.setBoTaBtnClickListener(v -> {
- //Show a fragment of the PDF thumbnail and a dialog fragment of the PDF outline list.
- CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
- boTaDialogFragment.initWithPDFView(binding.pdfView);
- CPDFBotaFragmentTabs outlineTabs = new CPDFBotaFragmentTabs(CPDFBOTA.OUTLINE, getString(R.string.tools_outlines));
- CPDFBotaFragmentTabs bookmarks = new CPDFBotaFragmentTabs(CPDFBOTA.BOOKMARKS, getString(R.string.tools_bookmarks));
- ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
- tabs.add(outlineTabs);
- tabs.add(bookmarks);
- boTaDialogFragment.setBotaDialogTabs(tabs);
- boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
- });
- binding.pdfToolBar.setThumbnailBtnClickListener(v -> {
- CPDFBotaDialogFragment boTaDialogFragment = CPDFBotaDialogFragment.newInstance();
- boTaDialogFragment.initWithPDFView(binding.pdfView);
- CPDFBotaFragmentTabs thumbnailTabs = new CPDFBotaFragmentTabs(CPDFBOTA.THUMBNAIL, getString(R.string.tools_thumbnails));
- ArrayList<CPDFBotaFragmentTabs> tabs = new ArrayList<>();
- tabs.add(thumbnailTabs);
- boTaDialogFragment.setBotaDialogTabs(tabs);
- boTaDialogFragment.show(getSupportFragmentManager(), "boTaDialogFragment");
- });
- binding.pdfToolBar.setMoreBtnClickListener(v -> {
- 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_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 (CPermissionUtil.hasStoragePermissions(this)) {
- selectDocument();
- } else {
- requestStoragePermissions();
- }
- binding.pdfView.savePDF((filePath, pdfUri) -> {
- }, e -> {
- });
- });
- menuWindow.setOnDismissListener(() -> v.setSelected(false));
- menuWindow.showAsDropDown(v);
- });
- }
- private void requestStoragePermissions() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
- CPermissionUtil.openManageAllFileAppSettings(this);
- } else {
- multiplePermissionResultLauncher.launch(STORAGE_PERMISSIONS, result -> {
- if (CPermissionUtil.hasStoragePermissions(this)) {
- selectDocument();
- } else {
- if (!CPermissionUtil.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- showPermissionsRequiredDialog();
- }
- }
- });
- }
- }
- 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(() -> {
- binding.pdfToolBar.setVisibility(View.VISIBLE);
- binding.pdfSearchToolBar.setVisibility(View.GONE);
- binding.pdfSearchToolBar.hideKeyboard();
- });
- }
- private void initSignatureToolbar() {
- binding.signStatusView.initWithPDFView(binding.pdfView);
- binding.signStatusView.getBtnDetails().setOnClickListener(v -> {
- CPDFCertDigitalSignListDialog signListDialog = CPDFCertDigitalSignListDialog.newInstance();
- signListDialog.initWithPDFView(binding.pdfView);
- signListDialog.setDialogDismissListener(this::verifyDocumentSignStatus);
- signListDialog.show(getSupportFragmentManager(), "signListDialog");
- });
- binding.signatureToolBar.initWithPDFView(binding.pdfView);
- binding.signatureToolBar.getVerifySignButton().setOnClickListener(v -> {
- verifyDocumentSignStatus();
- });
- }
- /**
- *
- */
- private void verifyDocumentSignStatus() {
- CPDFDocument document = binding.pdfView.getCPdfReaderView().getPDFDocument();
- if (CertificateDigitalDatas.hasDigitalSignature(document)) {
- CThreadPoolUtils.getInstance().executeIO(() -> {
- CPDFDocumentSignInfo status = CertificateDigitalDatas.verifyDocumentSignStatus(document);
- runOnUiThread(() -> {
- if (status != null) {
- binding.signStatusView.setStatus(status);
- screenStatusManager.manager.bindTopToolView(binding.signStatusView);
- screenStatusManager.constraintShow(binding.signStatusView);
- }
- });
- });
- } else {
- if (binding.signStatusView.getVisibility() == View.VISIBLE) {
- screenStatusManager.manager.removeAndHideToolView(binding.signStatusView);
- screenStatusManager.constraintHide(binding.signStatusView);
- }
- }
- }
- private void registerSignaturesHelper(CPDFViewCtrl pdfView) {
- pdfView.getCPdfReaderView().getAnnotImplRegistry()
- .registImpl(CPDFSignatureWidget.class, CDigitalSignatureWidgetImpl.class);
- }
- private void selectDocument() {
- if (binding.pdfView.getCPdfReaderView().getPDFDocument() == null) {
- selectDocumentLauncher.launch(null);
- return;
- }
- if (!binding.pdfView.getCPdfReaderView().getPDFDocument().hasChanges()) {
- selectDocumentLauncher.launch(null);
- 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(null);
- }, e -> {
- alertDialog.dismiss();
- selectDocumentLauncher.launch(null);
- });
- });
- alertDialog.setCancelClickListener(v -> {
- alertDialog.dismiss();
- selectDocumentLauncher.launch(null);
- });
- alertDialog.show(getSupportFragmentManager(), "alertDialog");
- }
- }
|