@amafil/react-native-pdf-toolkit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DoubleTapView.js +125 -0
- package/LICENSE +21 -0
- package/PdfManager.js +26 -0
- package/PdfPageView.js +53 -0
- package/PdfView.js +421 -0
- package/PdfViewFlatList.js +30 -0
- package/PinchZoomView.js +125 -0
- package/README.md +450 -0
- package/android/.gradle/8.5/checksums/checksums.lock +0 -0
- package/android/.gradle/8.5/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/8.5/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.5/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.5/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/8.5/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/8.5/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.5/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/8.5/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.5/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/8.5/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/config.properties +2 -0
- package/android/.gradle/file-system.probe +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/AndroidProjectSystem.xml +6 -0
- package/android/.idea/caches/deviceStreaming.xml +1414 -0
- package/android/.idea/compiler.xml +6 -0
- package/android/.idea/deviceManager.xml +13 -0
- package/android/.idea/gradle.xml +17 -0
- package/android/.idea/migrations.xml +10 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/runConfigurations.xml +17 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/results.bin +1 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/BuildConfig.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfManager.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$1.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$2.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$3.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/RNPDFPackage.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/events/TopChangeEvent.dex +0 -0
- package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
- package/android/build/.transforms/787b9137f14dcc9eebbb21ac62a7be22/results.bin +1 -0
- package/android/build/.transforms/787b9137f14dcc9eebbb21ac62a7be22/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/results.bin +1 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/BuildConfig.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfManager.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$1.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$2.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$3.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/RNPDFPackage.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/events/TopChangeEvent.dex +0 -0
- package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
- package/android/build/.transforms/c29f40a753b0ae1d85db8c8c5812fc85/results.bin +1 -0
- package/android/build/.transforms/c29f40a753b0ae1d85db8c8c5812fc85/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/generated/source/buildConfig/debug/org/wonday/pdf/BuildConfig.java +12 -0
- package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.java +99 -0
- package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.java +38 -0
- package/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ComponentDescriptors.cpp +22 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ComponentDescriptors.h +24 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/EventEmitters.cpp +24 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/EventEmitters.h +25 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/Props.cpp +132 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/Props.h +50 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ShadowNodes.cpp +17 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ShadowNodes.h +32 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/States.cpp +16 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/States.h +20 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/rnpdfJSI-generated.cpp +17 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/rnpdfJSI.h +19 -0
- package/android/build/generated/source/codegen/jni/rnpdf-generated.cpp +22 -0
- package/android/build/generated/source/codegen/jni/rnpdf.h +24 -0
- package/android/build/generated/source/codegen/schema.json +1 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +7 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +7 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
- package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
- package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
- package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
- package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
- package/android/build/intermediates/annotation_processor_list/debugAndroidTest/annotationProcessors.json +1 -0
- package/android/build/intermediates/annotation_processor_list/debugUnitTest/annotationProcessors.json +1 -0
- package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
- package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/BuildConfig.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfManager.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView$1.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView$2.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView$3.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/RNPDFPackage.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/events/TopChangeEvent.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +2 -0
- package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +2 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +8 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +7 -0
- package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-pdf.jar +0 -0
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +7 -0
- package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +7 -0
- package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
- package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
- package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
- package/android/build/intermediates/packaged_manifests/debug/output-metadata.json +18 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/BuildConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfManager.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView$3.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/RNPDFPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/events/TopChangeEvent.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -0
- package/android/build/outputs/aar/react-native-pdf-debug.aar +0 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +16 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfManager.class.uniqueId3 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfManager.class.uniqueId4 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$1.class.uniqueId0 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$2.class.uniqueId5 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$2.class.uniqueId6 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$3.class.uniqueId4 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$3.class.uniqueId5 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView.class.uniqueId2 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView.class.uniqueId3 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPackage.class.uniqueId1 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPackage.class.uniqueId2 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPdfViewManagerDelegate.class.uniqueId7 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPdfViewManagerInterface.class.uniqueId1 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +148 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/android/gradle.properties +2 -0
- package/android/gradlew +249 -0
- package/android/gradlew.bat +92 -0
- package/android/local.properties +8 -0
- package/android/project.properties +12 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/AndroidManifestNew.xml +4 -0
- package/android/src/main/java/org/wonday/pdf/PdfManager.java +196 -0
- package/android/src/main/java/org/wonday/pdf/PdfView.java +680 -0
- package/android/src/main/java/org/wonday/pdf/RNPDFPackage.java +39 -0
- package/android/src/main/java/org/wonday/pdf/events/TopChangeEvent.java +26 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.java +92 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.java +35 -0
- package/fabric/RNPDFPdfNativeComponent.js +56 -0
- package/index.d.ts +83 -0
- package/index.js +524 -0
- package/index.js.flow +67 -0
- package/ios/RNPDFPdf/PdfManager.h +23 -0
- package/ios/RNPDFPdf/PdfManager.mm +152 -0
- package/ios/RNPDFPdf/RNPDFPdfPageView.h +21 -0
- package/ios/RNPDFPdf/RNPDFPdfPageView.mm +185 -0
- package/ios/RNPDFPdf/RNPDFPdfPageViewManager.h +18 -0
- package/ios/RNPDFPdf/RNPDFPdfPageViewManager.mm +30 -0
- package/ios/RNPDFPdf/RNPDFPdfView.h +60 -0
- package/ios/RNPDFPdf/RNPDFPdfView.mm +1101 -0
- package/ios/RNPDFPdf/RNPDFPdfViewManager.h +18 -0
- package/ios/RNPDFPdf/RNPDFPdfViewManager.mm +96 -0
- package/ios/RNPDFPdf.xcodeproj/project.pbxproj +321 -0
- package/package.json +73 -0
- package/react-native-pdf.podspec +30 -0
- package/windows/RCTPdf/PropertySheet.props +16 -0
- package/windows/RCTPdf/RCTPdf.def +3 -0
- package/windows/RCTPdf/RCTPdf.vcxproj +180 -0
- package/windows/RCTPdf/RCTPdf.vcxproj.filters +38 -0
- package/windows/RCTPdf/RCTPdfControl.cpp +667 -0
- package/windows/RCTPdf/RCTPdfControl.h +119 -0
- package/windows/RCTPdf/RCTPdfControl.idl +10 -0
- package/windows/RCTPdf/RCTPdfControl.xaml +33 -0
- package/windows/RCTPdf/RCTPdfViewManager.cpp +69 -0
- package/windows/RCTPdf/RCTPdfViewManager.h +51 -0
- package/windows/RCTPdf/ReactPackageProvider.cpp +15 -0
- package/windows/RCTPdf/ReactPackageProvider.h +16 -0
- package/windows/RCTPdf/ReactPackageProvider.idl +9 -0
- package/windows/RCTPdf/packages.config +4 -0
- package/windows/RCTPdf/pch.cpp +1 -0
- package/windows/RCTPdf/pch.h +31 -0
- package/windows/README.md +21 -0
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2017-present, Wonday (@wonday.org)
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
package org.wonday.pdf;
|
|
10
|
+
|
|
11
|
+
import java.io.File;
|
|
12
|
+
import java.io.IOException;
|
|
13
|
+
|
|
14
|
+
import android.content.ContentResolver;
|
|
15
|
+
import android.content.Context;
|
|
16
|
+
import android.os.Handler;
|
|
17
|
+
import android.os.Looper;
|
|
18
|
+
import android.os.ParcelFileDescriptor;
|
|
19
|
+
import android.util.SizeF;
|
|
20
|
+
import android.view.Choreographer;
|
|
21
|
+
import android.view.View;
|
|
22
|
+
import android.view.ViewGroup;
|
|
23
|
+
import android.util.Log;
|
|
24
|
+
import android.net.Uri;
|
|
25
|
+
import android.util.AttributeSet;
|
|
26
|
+
import android.view.MotionEvent;
|
|
27
|
+
import android.graphics.Canvas;
|
|
28
|
+
import android.graphics.pdf.PdfRenderer;
|
|
29
|
+
|
|
30
|
+
import com.facebook.react.uimanager.ThemedReactContext;
|
|
31
|
+
import com.facebook.react.uimanager.UIManagerHelper;
|
|
32
|
+
import com.github.barteksc.pdfviewer.PDFView;
|
|
33
|
+
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
|
|
34
|
+
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
|
|
35
|
+
import com.github.barteksc.pdfviewer.listener.OnErrorListener;
|
|
36
|
+
import com.github.barteksc.pdfviewer.listener.OnTapListener;
|
|
37
|
+
import com.github.barteksc.pdfviewer.listener.OnDrawListener;
|
|
38
|
+
import com.github.barteksc.pdfviewer.listener.OnPageScrollListener;
|
|
39
|
+
import com.github.barteksc.pdfviewer.util.FitPolicy;
|
|
40
|
+
import com.github.barteksc.pdfviewer.util.Constants;
|
|
41
|
+
import com.github.barteksc.pdfviewer.link.LinkHandler;
|
|
42
|
+
import com.github.barteksc.pdfviewer.model.LinkTapEvent;
|
|
43
|
+
|
|
44
|
+
import com.facebook.react.bridge.ReactContext;
|
|
45
|
+
import com.facebook.react.bridge.Arguments;
|
|
46
|
+
import com.facebook.react.bridge.WritableMap;
|
|
47
|
+
import com.facebook.react.bridge.ReactContext;
|
|
48
|
+
import com.facebook.react.uimanager.UIManagerModule;
|
|
49
|
+
import com.facebook.react.uimanager.events.EventDispatcher;
|
|
50
|
+
import com.facebook.react.uimanager.events.Event;
|
|
51
|
+
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
import static java.lang.String.format;
|
|
55
|
+
|
|
56
|
+
import java.io.FileNotFoundException;
|
|
57
|
+
import java.io.InputStream;
|
|
58
|
+
|
|
59
|
+
import com.google.gson.Gson;
|
|
60
|
+
|
|
61
|
+
import org.wonday.pdf.events.TopChangeEvent;
|
|
62
|
+
|
|
63
|
+
public class PdfView extends PDFView implements OnPageChangeListener,OnLoadCompleteListener,OnErrorListener,OnTapListener,OnDrawListener,OnPageScrollListener, LinkHandler {
|
|
64
|
+
private int page = 1; // start from 1
|
|
65
|
+
private boolean horizontal = false;
|
|
66
|
+
private float scale = 1;
|
|
67
|
+
private float minScale = 1;
|
|
68
|
+
private float maxScale = 3;
|
|
69
|
+
private String path;
|
|
70
|
+
private int spacing = 10;
|
|
71
|
+
private String password = "";
|
|
72
|
+
private boolean enableAntialiasing = true;
|
|
73
|
+
private boolean enableAnnotationRendering = true;
|
|
74
|
+
private boolean enableDoubleTapZoom = true;
|
|
75
|
+
|
|
76
|
+
private boolean enablePaging = false;
|
|
77
|
+
private boolean autoSpacing = false;
|
|
78
|
+
private boolean pageFling = false;
|
|
79
|
+
private boolean pageSnap = false;
|
|
80
|
+
private FitPolicy fitPolicy = FitPolicy.WIDTH;
|
|
81
|
+
private boolean singlePage = false;
|
|
82
|
+
private boolean scrollEnabled = true;
|
|
83
|
+
private boolean enableRTL = false;
|
|
84
|
+
|
|
85
|
+
private float originalWidth = 0;
|
|
86
|
+
private float lastPageWidth = 0;
|
|
87
|
+
private float lastPageHeight = 0;
|
|
88
|
+
|
|
89
|
+
// used to store the parameters for `super.onSizeChanged`
|
|
90
|
+
private int oldW = 0;
|
|
91
|
+
private int oldH = 0;
|
|
92
|
+
|
|
93
|
+
// Autoscroll
|
|
94
|
+
private Choreographer.FrameCallback autoScrollFrameCallback;
|
|
95
|
+
private Runnable autoScrollResumeRunnable;
|
|
96
|
+
private Handler autoScrollResumeHandler;
|
|
97
|
+
private boolean isAutoScrolling = false;
|
|
98
|
+
private boolean isUserTouching = false;
|
|
99
|
+
private float autoScrollPixels = 15f; // pixels per second
|
|
100
|
+
private long autoScrollResumeDelay = 3000L;
|
|
101
|
+
private long lastFrameTimeNanos = 0;
|
|
102
|
+
|
|
103
|
+
public PdfView(Context context, AttributeSet set){
|
|
104
|
+
super(context, set);
|
|
105
|
+
autoScrollResumeHandler = new Handler(Looper.getMainLooper());
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@Override
|
|
109
|
+
public boolean dispatchTouchEvent(MotionEvent event) {
|
|
110
|
+
int action = event.getActionMasked();
|
|
111
|
+
if (action == MotionEvent.ACTION_DOWN) {
|
|
112
|
+
isUserTouching = true;
|
|
113
|
+
if (isAutoScrolling && autoScrollFrameCallback != null) {
|
|
114
|
+
Choreographer.getInstance().removeFrameCallback(autoScrollFrameCallback);
|
|
115
|
+
autoScrollResumeHandler.removeCallbacks(autoScrollResumeRunnable);
|
|
116
|
+
lastFrameTimeNanos = 0;
|
|
117
|
+
}
|
|
118
|
+
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
|
|
119
|
+
isUserTouching = false;
|
|
120
|
+
if (isAutoScrolling) {
|
|
121
|
+
scheduleAutoScrollResume();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return super.dispatchTouchEvent(event);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@Override
|
|
128
|
+
public void onPageChanged(int page, int numberOfPages) {
|
|
129
|
+
// pdf lib page start from 0, convert it to our page (start from 1)
|
|
130
|
+
page = page+1;
|
|
131
|
+
this.page = page;
|
|
132
|
+
showLog(format("%s %s / %s", path, page, numberOfPages));
|
|
133
|
+
|
|
134
|
+
WritableMap event = Arguments.createMap();
|
|
135
|
+
event.putString("message", "pageChanged|"+page+"|"+numberOfPages);
|
|
136
|
+
|
|
137
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
138
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
139
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
140
|
+
|
|
141
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
142
|
+
|
|
143
|
+
if (dispatcher != null) {
|
|
144
|
+
new Handler(Looper.getMainLooper()).postDelayed(() -> dispatcher.dispatchEvent(tce), 10);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ReactContext reactContext = (ReactContext)this.getContext();
|
|
148
|
+
// reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
|
|
149
|
+
// this.getId(),
|
|
150
|
+
// "topChange",
|
|
151
|
+
// event
|
|
152
|
+
// );
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// In some cases Yoga (I think) will measure the view only along one axis first, resulting in
|
|
156
|
+
// onSizeChanged being called with either w or h set to zero. This in turn starts the rendering
|
|
157
|
+
// of the pdf under the hood with one dimension being set to zero and the follow-up call to
|
|
158
|
+
// onSizeChanged with the correct dimensions doesn't have any effect on the already started process.
|
|
159
|
+
// The offending class is DecodingAsyncTask, which tries to get width and height of the pdfView
|
|
160
|
+
// in the constructor, and is created as soon as the measurement is complete, which in some cases
|
|
161
|
+
// may be incomplete as described above.
|
|
162
|
+
// By delaying calling super.onSizeChanged until the size in both dimensions is correct we are able
|
|
163
|
+
// to prevent this from happening.
|
|
164
|
+
//
|
|
165
|
+
// I'm not sure whether the second condition is necessary, but without it, it would be impossible
|
|
166
|
+
// to set the dimensions to zero after first measurement.
|
|
167
|
+
@Override
|
|
168
|
+
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
|
169
|
+
if ((w > 0 && h > 0) || this.oldW > 0 || this.oldH > 0) {
|
|
170
|
+
super.onSizeChanged(w, h, this.oldW, this.oldH);
|
|
171
|
+
this.oldW = w;
|
|
172
|
+
this.oldH = h;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
@Override
|
|
177
|
+
public void loadComplete(int numberOfPages) {
|
|
178
|
+
SizeF pageSize = getPageSize(0);
|
|
179
|
+
float width = pageSize.getWidth();
|
|
180
|
+
float height = pageSize.getHeight();
|
|
181
|
+
|
|
182
|
+
this.zoomTo(this.scale);
|
|
183
|
+
WritableMap event = Arguments.createMap();
|
|
184
|
+
|
|
185
|
+
//create a new json Object for the TableOfContents
|
|
186
|
+
Gson gson = new Gson();
|
|
187
|
+
event.putString("message", "loadComplete|"+numberOfPages+"|"+width+"|"+height+"|"+gson.toJson(this.getTableOfContents()));
|
|
188
|
+
|
|
189
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
190
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
191
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
192
|
+
|
|
193
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
194
|
+
|
|
195
|
+
if (dispatcher != null) {
|
|
196
|
+
dispatcher.dispatchEvent(tce);
|
|
197
|
+
}
|
|
198
|
+
// ReactContext reactContext = (ReactContext)this.getContext();
|
|
199
|
+
// reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
|
|
200
|
+
// this.getId(),
|
|
201
|
+
// "topChange",
|
|
202
|
+
// event
|
|
203
|
+
// );
|
|
204
|
+
|
|
205
|
+
//Log.e("ReactNative", gson.toJson(this.getTableOfContents()));
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
@Override
|
|
210
|
+
public void onError(Throwable t){
|
|
211
|
+
WritableMap event = Arguments.createMap();
|
|
212
|
+
if (t.getMessage().contains("Password required or incorrect password")) {
|
|
213
|
+
event.putString("message", "error|Password required or incorrect password.");
|
|
214
|
+
} else {
|
|
215
|
+
event.putString("message", "error|"+t.getMessage());
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
219
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
220
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
221
|
+
|
|
222
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
223
|
+
|
|
224
|
+
if (dispatcher != null) {
|
|
225
|
+
dispatcher.dispatchEvent(tce);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ReactContext reactContext = (ReactContext)this.getContext();
|
|
229
|
+
// reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
|
|
230
|
+
// this.getId(),
|
|
231
|
+
// "topChange",
|
|
232
|
+
// event
|
|
233
|
+
// );
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
@Override
|
|
237
|
+
public void onPageScrolled(int page, float positionOffset){
|
|
238
|
+
|
|
239
|
+
// maybe change by other instance, restore zoom setting
|
|
240
|
+
Constants.Pinch.MINIMUM_ZOOM = this.minScale;
|
|
241
|
+
Constants.Pinch.MAXIMUM_ZOOM = this.maxScale;
|
|
242
|
+
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
@Override
|
|
246
|
+
public boolean onTap(MotionEvent e){
|
|
247
|
+
|
|
248
|
+
// maybe change by other instance, restore zoom setting
|
|
249
|
+
//Constants.Pinch.MINIMUM_ZOOM = this.minScale;
|
|
250
|
+
//Constants.Pinch.MAXIMUM_ZOOM = this.maxScale;
|
|
251
|
+
|
|
252
|
+
WritableMap event = Arguments.createMap();
|
|
253
|
+
event.putString("message", "pageSingleTap|"+page+"|"+e.getX()+"|"+e.getY());
|
|
254
|
+
|
|
255
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
256
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
257
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
258
|
+
|
|
259
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
260
|
+
|
|
261
|
+
if (dispatcher != null) {
|
|
262
|
+
dispatcher.dispatchEvent(tce);
|
|
263
|
+
}
|
|
264
|
+
// ReactContext reactContext = (ReactContext)this.getContext();
|
|
265
|
+
// reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
|
|
266
|
+
// this.getId(),
|
|
267
|
+
// "topChange",
|
|
268
|
+
// event
|
|
269
|
+
// );
|
|
270
|
+
|
|
271
|
+
// process as tap
|
|
272
|
+
return true;
|
|
273
|
+
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
@Override
|
|
277
|
+
public void onLayerDrawn(Canvas canvas, float pageWidth, float pageHeight, int displayedPage){
|
|
278
|
+
if (originalWidth == 0) {
|
|
279
|
+
originalWidth = pageWidth;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (lastPageWidth>0 && lastPageHeight>0 && (pageWidth!=lastPageWidth || pageHeight!=lastPageHeight)) {
|
|
283
|
+
// maybe change by other instance, restore zoom setting
|
|
284
|
+
Constants.Pinch.MINIMUM_ZOOM = this.minScale;
|
|
285
|
+
Constants.Pinch.MAXIMUM_ZOOM = this.maxScale;
|
|
286
|
+
|
|
287
|
+
WritableMap event = Arguments.createMap();
|
|
288
|
+
event.putString("message", "scaleChanged|"+(pageWidth/originalWidth));
|
|
289
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
290
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
291
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
292
|
+
|
|
293
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
294
|
+
|
|
295
|
+
if (dispatcher != null) {
|
|
296
|
+
dispatcher.dispatchEvent(tce);
|
|
297
|
+
}
|
|
298
|
+
// ReactContext reactContext = (ReactContext)this.getContext();
|
|
299
|
+
// reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
|
|
300
|
+
// this.getId(),
|
|
301
|
+
// "topChange",
|
|
302
|
+
// event
|
|
303
|
+
// );
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
lastPageWidth = pageWidth;
|
|
307
|
+
lastPageHeight = pageHeight;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
@Override
|
|
311
|
+
protected void onAttachedToWindow() {
|
|
312
|
+
super.onAttachedToWindow();
|
|
313
|
+
if (this.isRecycled())
|
|
314
|
+
this.drawPdf();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
private int getPdfPageCount(File pdfFile) throws IOException {
|
|
318
|
+
ParcelFileDescriptor fileDescriptor =
|
|
319
|
+
ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY);
|
|
320
|
+
PdfRenderer renderer = new PdfRenderer(fileDescriptor);
|
|
321
|
+
int pageCount = renderer.getPageCount();
|
|
322
|
+
renderer.close();
|
|
323
|
+
fileDescriptor.close();
|
|
324
|
+
return pageCount;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
public void drawPdf() {
|
|
328
|
+
showLog(format("drawPdf path:%s %s", this.path, this.page));
|
|
329
|
+
|
|
330
|
+
if (this.path != null){
|
|
331
|
+
|
|
332
|
+
// set scale
|
|
333
|
+
this.setMinZoom(this.minScale);
|
|
334
|
+
this.setMaxZoom(this.maxScale);
|
|
335
|
+
this.setMidZoom((this.maxScale+this.minScale)/2);
|
|
336
|
+
Constants.Pinch.MINIMUM_ZOOM = this.minScale;
|
|
337
|
+
Constants.Pinch.MAXIMUM_ZOOM = this.maxScale;
|
|
338
|
+
|
|
339
|
+
Configurator configurator;
|
|
340
|
+
|
|
341
|
+
if (this.path.startsWith("content://")) {
|
|
342
|
+
ContentResolver contentResolver = getContext().getContentResolver();
|
|
343
|
+
InputStream inputStream = null;
|
|
344
|
+
Uri uri = Uri.parse(this.path);
|
|
345
|
+
try {
|
|
346
|
+
inputStream = contentResolver.openInputStream(uri);
|
|
347
|
+
} catch (FileNotFoundException e) {
|
|
348
|
+
throw new RuntimeException(e.getMessage());
|
|
349
|
+
}
|
|
350
|
+
configurator = this.fromStream(inputStream);
|
|
351
|
+
} else {
|
|
352
|
+
configurator = this.fromUri(getURI(this.path));
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
configurator.defaultPage(this.page-1)
|
|
356
|
+
.swipeHorizontal(this.horizontal)
|
|
357
|
+
.onPageChange(this)
|
|
358
|
+
.onLoad(this)
|
|
359
|
+
.onError(this)
|
|
360
|
+
.onDraw(this)
|
|
361
|
+
.onPageScroll(this)
|
|
362
|
+
.spacing(this.spacing)
|
|
363
|
+
.password(this.password)
|
|
364
|
+
.enableAntialiasing(this.enableAntialiasing)
|
|
365
|
+
.pageFitPolicy(this.fitPolicy)
|
|
366
|
+
.pageSnap(this.pageSnap)
|
|
367
|
+
.autoSpacing(this.autoSpacing)
|
|
368
|
+
.pageFling(this.pageFling)
|
|
369
|
+
.enableSwipe(!this.singlePage && this.scrollEnabled)
|
|
370
|
+
.enableDoubletap(!this.singlePage && this.enableDoubleTapZoom)
|
|
371
|
+
.enableAnnotationRendering(this.enableAnnotationRendering)
|
|
372
|
+
.linkHandler(this)
|
|
373
|
+
;
|
|
374
|
+
|
|
375
|
+
if (enableRTL) {
|
|
376
|
+
try {
|
|
377
|
+
int pageCount = getPdfPageCount(new File(this.path));
|
|
378
|
+
int[] reversedPages = new int[pageCount];
|
|
379
|
+
for (int i=0; i<pageCount; i++) {
|
|
380
|
+
reversedPages[i] = pageCount-1 - i;
|
|
381
|
+
}
|
|
382
|
+
configurator.pages(reversedPages);
|
|
383
|
+
if(this.page != 1){
|
|
384
|
+
this.page = pageCount;
|
|
385
|
+
}
|
|
386
|
+
} catch (IOException e) {
|
|
387
|
+
Log.e("error", "error while reading PDF", e);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (this.singlePage) {
|
|
392
|
+
configurator.pages(this.page-1);
|
|
393
|
+
setTouchesEnabled(false);
|
|
394
|
+
} else {
|
|
395
|
+
configurator.onTap(this);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
configurator.load();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
public void setEnableDoubleTapZoom(boolean enableDoubleTapZoom) {
|
|
403
|
+
this.enableDoubleTapZoom = enableDoubleTapZoom;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
public void setPath(String path) {
|
|
407
|
+
this.path = path;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// page start from 1
|
|
411
|
+
public void setPage(int page) {
|
|
412
|
+
this.page = Math.max(page, 1);
|
|
413
|
+
this.handlePage(this.page - 1);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
public void setEnableRTL(boolean enableRTL) {
|
|
417
|
+
this.enableRTL = enableRTL;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
public void setScale(float scale) {
|
|
421
|
+
this.scale = scale;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
public void setMinScale(float minScale) {
|
|
425
|
+
this.minScale = minScale;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
public void setMaxScale(float maxScale) {
|
|
429
|
+
this.maxScale = maxScale;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
public void setHorizontal(boolean horizontal) {
|
|
433
|
+
this.horizontal = horizontal;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
public void setScrollEnabled(boolean scrollEnabled) {
|
|
437
|
+
this.scrollEnabled = scrollEnabled;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
public void setSpacing(int spacing) {
|
|
441
|
+
this.spacing = spacing;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
public void setPassword(String password) {
|
|
445
|
+
this.password = password;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
public void setEnableAntialiasing(boolean enableAntialiasing) {
|
|
449
|
+
this.enableAntialiasing = enableAntialiasing;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
public void setEnableAnnotationRendering(boolean enableAnnotationRendering) {
|
|
453
|
+
this.enableAnnotationRendering = enableAnnotationRendering;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
public void setEnablePaging(boolean enablePaging) {
|
|
457
|
+
this.enablePaging = enablePaging;
|
|
458
|
+
if (this.enablePaging) {
|
|
459
|
+
this.autoSpacing = true;
|
|
460
|
+
this.pageFling = true;
|
|
461
|
+
this.pageSnap = true;
|
|
462
|
+
} else {
|
|
463
|
+
this.autoSpacing = false;
|
|
464
|
+
this.pageFling = false;
|
|
465
|
+
this.pageSnap = false;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
public void setFitPolicy(int fitPolicy) {
|
|
470
|
+
switch(fitPolicy){
|
|
471
|
+
case 0:
|
|
472
|
+
this.fitPolicy = FitPolicy.WIDTH;
|
|
473
|
+
break;
|
|
474
|
+
case 1:
|
|
475
|
+
this.fitPolicy = FitPolicy.HEIGHT;
|
|
476
|
+
break;
|
|
477
|
+
case 2:
|
|
478
|
+
default:
|
|
479
|
+
{
|
|
480
|
+
this.fitPolicy = FitPolicy.BOTH;
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
public void setSinglePage(boolean singlePage) {
|
|
488
|
+
this.singlePage = singlePage;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* @see https://github.com/barteksc/AndroidPdfViewer/blob/master/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/link/DefaultLinkHandler.java
|
|
493
|
+
*/
|
|
494
|
+
public void handleLinkEvent(LinkTapEvent event) {
|
|
495
|
+
String uri = event.getLink().getUri();
|
|
496
|
+
Integer page = event.getLink().getDestPageIdx();
|
|
497
|
+
if (uri != null && !uri.isEmpty()) {
|
|
498
|
+
handleUri(uri);
|
|
499
|
+
} else if (page != null) {
|
|
500
|
+
handlePage(page);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* @see https://github.com/barteksc/AndroidPdfViewer/blob/master/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/link/DefaultLinkHandler.java
|
|
506
|
+
*/
|
|
507
|
+
private void handleUri(String uri) {
|
|
508
|
+
WritableMap event = Arguments.createMap();
|
|
509
|
+
event.putString("message", "linkPressed|"+uri);
|
|
510
|
+
|
|
511
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
512
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
513
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
514
|
+
|
|
515
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
516
|
+
|
|
517
|
+
if (dispatcher != null) {
|
|
518
|
+
dispatcher.dispatchEvent(tce);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// ReactContext reactContext = (ReactContext)this.getContext();
|
|
522
|
+
// reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
|
|
523
|
+
// this.getId(),
|
|
524
|
+
// "topChange",
|
|
525
|
+
// event
|
|
526
|
+
// );
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* @see https://github.com/barteksc/AndroidPdfViewer/blob/master/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/link/DefaultLinkHandler.java
|
|
531
|
+
*/
|
|
532
|
+
private void handlePage(int page) {
|
|
533
|
+
this.jumpTo(page);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
private void showLog(final String str) {
|
|
537
|
+
Log.d("PdfView", str);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
private Uri getURI(final String uri) {
|
|
541
|
+
Uri parsed = Uri.parse(uri);
|
|
542
|
+
|
|
543
|
+
if (parsed.getScheme() == null || parsed.getScheme().isEmpty()) {
|
|
544
|
+
return Uri.fromFile(new File(uri));
|
|
545
|
+
}
|
|
546
|
+
return parsed;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
private void setTouchesEnabled(final boolean enabled) {
|
|
550
|
+
setTouchesEnabled(this, enabled);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
private static void setTouchesEnabled(View v, final boolean enabled) {
|
|
554
|
+
if (enabled) {
|
|
555
|
+
v.setOnTouchListener(null);
|
|
556
|
+
} else {
|
|
557
|
+
v.setOnTouchListener(new View.OnTouchListener() {
|
|
558
|
+
@Override
|
|
559
|
+
public boolean onTouch(View v, MotionEvent event) {
|
|
560
|
+
return true;
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
if (v instanceof ViewGroup) {
|
|
566
|
+
ViewGroup vg = (ViewGroup) v;
|
|
567
|
+
for (int i = 0; i < vg.getChildCount(); i++) {
|
|
568
|
+
View child = vg.getChildAt(i);
|
|
569
|
+
setTouchesEnabled(child, enabled);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Autoscroll methods
|
|
575
|
+
|
|
576
|
+
public void startAutoScroll(float pixels, long resumeDelayMs) {
|
|
577
|
+
this.autoScrollPixels = pixels; // pixels per second
|
|
578
|
+
this.autoScrollResumeDelay = resumeDelayMs;
|
|
579
|
+
this.isAutoScrolling = true;
|
|
580
|
+
this.lastFrameTimeNanos = 0;
|
|
581
|
+
|
|
582
|
+
if (autoScrollFrameCallback == null) {
|
|
583
|
+
autoScrollFrameCallback = new Choreographer.FrameCallback() {
|
|
584
|
+
@Override
|
|
585
|
+
public void doFrame(long frameTimeNanos) {
|
|
586
|
+
if (!isAutoScrolling || isUserTouching) {
|
|
587
|
+
lastFrameTimeNanos = 0;
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// Skip first frame to establish baseline timestamp
|
|
592
|
+
if (lastFrameTimeNanos == 0) {
|
|
593
|
+
lastFrameTimeNanos = frameTimeNanos;
|
|
594
|
+
Choreographer.getInstance().postFrameCallback(this);
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
float elapsedSeconds = (frameTimeNanos - lastFrameTimeNanos) / 1_000_000_000f;
|
|
599
|
+
lastFrameTimeNanos = frameTimeNanos;
|
|
600
|
+
float scrollAmount = autoScrollPixels * elapsedSeconds;
|
|
601
|
+
|
|
602
|
+
float currentY = getCurrentYOffset();
|
|
603
|
+
float totalHeight = 0;
|
|
604
|
+
int pageCount = getPageCount();
|
|
605
|
+
for (int i = 0; i < pageCount; i++) {
|
|
606
|
+
totalHeight += getPageSize(i).getHeight() * getZoom();
|
|
607
|
+
}
|
|
608
|
+
totalHeight += spacing * (pageCount - 1) * getZoom();
|
|
609
|
+
float maxScroll = totalHeight - getHeight();
|
|
610
|
+
|
|
611
|
+
if (maxScroll <= 0) {
|
|
612
|
+
stopAutoScroll();
|
|
613
|
+
dispatchAutoScrollEndEvent();
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// currentY is negative in barteksc (0 = top, more negative = further down)
|
|
618
|
+
float newY = currentY - scrollAmount;
|
|
619
|
+
float minY = -maxScroll;
|
|
620
|
+
|
|
621
|
+
if (newY <= minY) {
|
|
622
|
+
moveTo(0, minY);
|
|
623
|
+
stopAutoScroll();
|
|
624
|
+
dispatchAutoScrollEndEvent();
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
moveTo(0, newY);
|
|
629
|
+
Choreographer.getInstance().postFrameCallback(this);
|
|
630
|
+
}
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (autoScrollResumeRunnable == null) {
|
|
635
|
+
autoScrollResumeRunnable = new Runnable() {
|
|
636
|
+
@Override
|
|
637
|
+
public void run() {
|
|
638
|
+
if (isAutoScrolling && !isUserTouching) {
|
|
639
|
+
lastFrameTimeNanos = 0;
|
|
640
|
+
Choreographer.getInstance().postFrameCallback(autoScrollFrameCallback);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
Choreographer.getInstance().removeFrameCallback(autoScrollFrameCallback);
|
|
647
|
+
Choreographer.getInstance().postFrameCallback(autoScrollFrameCallback);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
public void stopAutoScroll() {
|
|
651
|
+
this.isAutoScrolling = false;
|
|
652
|
+
this.lastFrameTimeNanos = 0;
|
|
653
|
+
if (autoScrollFrameCallback != null) {
|
|
654
|
+
Choreographer.getInstance().removeFrameCallback(autoScrollFrameCallback);
|
|
655
|
+
}
|
|
656
|
+
if (autoScrollResumeHandler != null && autoScrollResumeRunnable != null) {
|
|
657
|
+
autoScrollResumeHandler.removeCallbacks(autoScrollResumeRunnable);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
private void scheduleAutoScrollResume() {
|
|
662
|
+
autoScrollResumeHandler.removeCallbacks(autoScrollResumeRunnable);
|
|
663
|
+
autoScrollResumeHandler.postDelayed(autoScrollResumeRunnable, autoScrollResumeDelay);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
private void dispatchAutoScrollEndEvent() {
|
|
667
|
+
WritableMap event = Arguments.createMap();
|
|
668
|
+
event.putString("message", "autoScrollEnd");
|
|
669
|
+
|
|
670
|
+
ThemedReactContext context = (ThemedReactContext) getContext();
|
|
671
|
+
EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, getId());
|
|
672
|
+
int surfaceId = UIManagerHelper.getSurfaceId(this);
|
|
673
|
+
|
|
674
|
+
TopChangeEvent tce = new TopChangeEvent(surfaceId, getId(), event);
|
|
675
|
+
|
|
676
|
+
if (dispatcher != null) {
|
|
677
|
+
dispatcher.dispatchEvent(tce);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|