@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.
Files changed (202) hide show
  1. package/DoubleTapView.js +125 -0
  2. package/LICENSE +21 -0
  3. package/PdfManager.js +26 -0
  4. package/PdfPageView.js +53 -0
  5. package/PdfView.js +421 -0
  6. package/PdfViewFlatList.js +30 -0
  7. package/PinchZoomView.js +125 -0
  8. package/README.md +450 -0
  9. package/android/.gradle/8.5/checksums/checksums.lock +0 -0
  10. package/android/.gradle/8.5/checksums/md5-checksums.bin +0 -0
  11. package/android/.gradle/8.5/checksums/sha1-checksums.bin +0 -0
  12. package/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  13. package/android/.gradle/8.5/dependencies-accessors/gc.properties +0 -0
  14. package/android/.gradle/8.5/executionHistory/executionHistory.bin +0 -0
  15. package/android/.gradle/8.5/executionHistory/executionHistory.lock +0 -0
  16. package/android/.gradle/8.5/fileChanges/last-build.bin +0 -0
  17. package/android/.gradle/8.5/fileHashes/fileHashes.bin +0 -0
  18. package/android/.gradle/8.5/fileHashes/fileHashes.lock +0 -0
  19. package/android/.gradle/8.5/fileHashes/resourceHashesCache.bin +0 -0
  20. package/android/.gradle/8.5/gc.properties +0 -0
  21. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  22. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  23. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  24. package/android/.gradle/config.properties +2 -0
  25. package/android/.gradle/file-system.probe +0 -0
  26. package/android/.gradle/vcs-1/gc.properties +0 -0
  27. package/android/.idea/AndroidProjectSystem.xml +6 -0
  28. package/android/.idea/caches/deviceStreaming.xml +1414 -0
  29. package/android/.idea/compiler.xml +6 -0
  30. package/android/.idea/deviceManager.xml +13 -0
  31. package/android/.idea/gradle.xml +17 -0
  32. package/android/.idea/migrations.xml +10 -0
  33. package/android/.idea/misc.xml +10 -0
  34. package/android/.idea/runConfigurations.xml +17 -0
  35. package/android/.idea/vcs.xml +6 -0
  36. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/results.bin +1 -0
  37. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.dex +0 -0
  38. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.dex +0 -0
  39. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/BuildConfig.dex +0 -0
  40. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfManager.dex +0 -0
  41. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$1.dex +0 -0
  42. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$2.dex +0 -0
  43. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$3.dex +0 -0
  44. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView.dex +0 -0
  45. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/RNPDFPackage.dex +0 -0
  46. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/events/TopChangeEvent.dex +0 -0
  47. package/android/build/.transforms/3337b950908a4f6985ba400cb8386b0b/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  48. package/android/build/.transforms/787b9137f14dcc9eebbb21ac62a7be22/results.bin +1 -0
  49. package/android/build/.transforms/787b9137f14dcc9eebbb21ac62a7be22/transformed/classes/classes_dex/classes.dex +0 -0
  50. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/results.bin +1 -0
  51. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.dex +0 -0
  52. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.dex +0 -0
  53. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/BuildConfig.dex +0 -0
  54. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfManager.dex +0 -0
  55. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$1.dex +0 -0
  56. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$2.dex +0 -0
  57. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView$3.dex +0 -0
  58. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/PdfView.dex +0 -0
  59. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/RNPDFPackage.dex +0 -0
  60. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/org/wonday/pdf/events/TopChangeEvent.dex +0 -0
  61. package/android/build/.transforms/79ca1220a602ed0c9c23366e0e92a6d1/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  62. package/android/build/.transforms/c29f40a753b0ae1d85db8c8c5812fc85/results.bin +1 -0
  63. package/android/build/.transforms/c29f40a753b0ae1d85db8c8c5812fc85/transformed/classes/classes_dex/classes.dex +0 -0
  64. package/android/build/generated/source/buildConfig/debug/org/wonday/pdf/BuildConfig.java +12 -0
  65. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.java +99 -0
  66. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.java +38 -0
  67. package/android/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  68. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ComponentDescriptors.cpp +22 -0
  69. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ComponentDescriptors.h +24 -0
  70. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/EventEmitters.cpp +24 -0
  71. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/EventEmitters.h +25 -0
  72. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/Props.cpp +132 -0
  73. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/Props.h +50 -0
  74. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ShadowNodes.cpp +17 -0
  75. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/ShadowNodes.h +32 -0
  76. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/States.cpp +16 -0
  77. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/States.h +20 -0
  78. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/rnpdfJSI-generated.cpp +17 -0
  79. package/android/build/generated/source/codegen/jni/react/renderer/components/rnpdf/rnpdfJSI.h +19 -0
  80. package/android/build/generated/source/codegen/jni/rnpdf-generated.cpp +22 -0
  81. package/android/build/generated/source/codegen/jni/rnpdf.h +24 -0
  82. package/android/build/generated/source/codegen/schema.json +1 -0
  83. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +7 -0
  84. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
  85. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +7 -0
  86. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  87. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  88. package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
  89. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  90. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
  91. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  92. package/android/build/intermediates/annotation_processor_list/debugAndroidTest/annotationProcessors.json +1 -0
  93. package/android/build/intermediates/annotation_processor_list/debugUnitTest/annotationProcessors.json +1 -0
  94. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  95. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  96. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  97. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  98. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  99. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  100. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  101. package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  102. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  103. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  104. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.class +0 -0
  105. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.class +0 -0
  106. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/BuildConfig.class +0 -0
  107. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfManager.class +0 -0
  108. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView$1.class +0 -0
  109. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView$2.class +0 -0
  110. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView$3.class +0 -0
  111. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/PdfView.class +0 -0
  112. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/RNPDFPackage.class +0 -0
  113. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/wonday/pdf/events/TopChangeEvent.class +0 -0
  114. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +2 -0
  115. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +2 -0
  116. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +8 -0
  117. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +7 -0
  118. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-pdf.jar +0 -0
  119. package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +7 -0
  120. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +7 -0
  121. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  122. package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
  123. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  124. package/android/build/intermediates/packaged_manifests/debug/output-metadata.json +18 -0
  125. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.class +0 -0
  126. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.class +0 -0
  127. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/BuildConfig.class +0 -0
  128. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfManager.class +0 -0
  129. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView$1.class +0 -0
  130. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView$2.class +0 -0
  131. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView$3.class +0 -0
  132. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/PdfView.class +0 -0
  133. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/RNPDFPackage.class +0 -0
  134. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/org/wonday/pdf/events/TopChangeEvent.class +0 -0
  135. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  136. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -0
  137. package/android/build/outputs/aar/react-native-pdf-debug.aar +0 -0
  138. package/android/build/outputs/logs/manifest-merger-debug-report.txt +16 -0
  139. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfManager.class.uniqueId3 +0 -0
  140. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfManager.class.uniqueId4 +0 -0
  141. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$1.class.uniqueId0 +0 -0
  142. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$2.class.uniqueId5 +0 -0
  143. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$2.class.uniqueId6 +0 -0
  144. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$3.class.uniqueId4 +0 -0
  145. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView$3.class.uniqueId5 +0 -0
  146. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView.class.uniqueId2 +0 -0
  147. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PdfView.class.uniqueId3 +0 -0
  148. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPackage.class.uniqueId1 +0 -0
  149. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPackage.class.uniqueId2 +0 -0
  150. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPdfViewManagerDelegate.class.uniqueId7 +0 -0
  151. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNPDFPdfViewManagerInterface.class.uniqueId1 +0 -0
  152. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  153. package/android/build.gradle +148 -0
  154. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  155. package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  156. package/android/gradle.properties +2 -0
  157. package/android/gradlew +249 -0
  158. package/android/gradlew.bat +92 -0
  159. package/android/local.properties +8 -0
  160. package/android/project.properties +12 -0
  161. package/android/src/main/AndroidManifest.xml +4 -0
  162. package/android/src/main/AndroidManifestNew.xml +4 -0
  163. package/android/src/main/java/org/wonday/pdf/PdfManager.java +196 -0
  164. package/android/src/main/java/org/wonday/pdf/PdfView.java +680 -0
  165. package/android/src/main/java/org/wonday/pdf/RNPDFPackage.java +39 -0
  166. package/android/src/main/java/org/wonday/pdf/events/TopChangeEvent.java +26 -0
  167. package/android/src/paper/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerDelegate.java +92 -0
  168. package/android/src/paper/java/com/facebook/react/viewmanagers/RNPDFPdfViewManagerInterface.java +35 -0
  169. package/fabric/RNPDFPdfNativeComponent.js +56 -0
  170. package/index.d.ts +83 -0
  171. package/index.js +524 -0
  172. package/index.js.flow +67 -0
  173. package/ios/RNPDFPdf/PdfManager.h +23 -0
  174. package/ios/RNPDFPdf/PdfManager.mm +152 -0
  175. package/ios/RNPDFPdf/RNPDFPdfPageView.h +21 -0
  176. package/ios/RNPDFPdf/RNPDFPdfPageView.mm +185 -0
  177. package/ios/RNPDFPdf/RNPDFPdfPageViewManager.h +18 -0
  178. package/ios/RNPDFPdf/RNPDFPdfPageViewManager.mm +30 -0
  179. package/ios/RNPDFPdf/RNPDFPdfView.h +60 -0
  180. package/ios/RNPDFPdf/RNPDFPdfView.mm +1101 -0
  181. package/ios/RNPDFPdf/RNPDFPdfViewManager.h +18 -0
  182. package/ios/RNPDFPdf/RNPDFPdfViewManager.mm +96 -0
  183. package/ios/RNPDFPdf.xcodeproj/project.pbxproj +321 -0
  184. package/package.json +73 -0
  185. package/react-native-pdf.podspec +30 -0
  186. package/windows/RCTPdf/PropertySheet.props +16 -0
  187. package/windows/RCTPdf/RCTPdf.def +3 -0
  188. package/windows/RCTPdf/RCTPdf.vcxproj +180 -0
  189. package/windows/RCTPdf/RCTPdf.vcxproj.filters +38 -0
  190. package/windows/RCTPdf/RCTPdfControl.cpp +667 -0
  191. package/windows/RCTPdf/RCTPdfControl.h +119 -0
  192. package/windows/RCTPdf/RCTPdfControl.idl +10 -0
  193. package/windows/RCTPdf/RCTPdfControl.xaml +33 -0
  194. package/windows/RCTPdf/RCTPdfViewManager.cpp +69 -0
  195. package/windows/RCTPdf/RCTPdfViewManager.h +51 -0
  196. package/windows/RCTPdf/ReactPackageProvider.cpp +15 -0
  197. package/windows/RCTPdf/ReactPackageProvider.h +16 -0
  198. package/windows/RCTPdf/ReactPackageProvider.idl +9 -0
  199. package/windows/RCTPdf/packages.config +4 -0
  200. package/windows/RCTPdf/pch.cpp +1 -0
  201. package/windows/RCTPdf/pch.h +31 -0
  202. 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
+ }