shakebug-react-native 1.0.14

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 (296) hide show
  1. package/DeviceInfo/index.js.flow +177 -0
  2. package/DeviceInfo/index.ts +1034 -0
  3. package/DeviceInfo/internal/asyncHookWrappers.ts +59 -0
  4. package/DeviceInfo/internal/devicesWithDynamicIsland.ts +30 -0
  5. package/DeviceInfo/internal/devicesWithNotch.ts +374 -0
  6. package/DeviceInfo/internal/nativeInterface.ts +28 -0
  7. package/DeviceInfo/internal/privateTypes.ts +231 -0
  8. package/DeviceInfo/internal/supported-platform-info.ts +97 -0
  9. package/DeviceInfo/internal/types.ts +19 -0
  10. package/DeviceInfo/web/index.js +223 -0
  11. package/GetLocals/src/NativeRNLocalize.ts +18 -0
  12. package/GetLocals/src/constants.ts +269 -0
  13. package/GetLocals/src/index.ts +56 -0
  14. package/GetLocals/src/module.ts +51 -0
  15. package/GetLocals/src/module.web.ts +148 -0
  16. package/GetLocals/src/types.ts +31 -0
  17. package/GetLocation/LocationError.ts +20 -0
  18. package/GetLocation/index.ts +46 -0
  19. package/GetLocation/utils.ts +89 -0
  20. package/ImageOrVedioPicker/src/index.ts +28 -0
  21. package/ImageOrVedioPicker/src/platforms/NativeImagePicker.ts +10 -0
  22. package/ImageOrVedioPicker/src/platforms/native.ts +61 -0
  23. package/ImageOrVedioPicker/src/platforms/web.ts +159 -0
  24. package/ImageOrVedioPicker/src/types.ts +74 -0
  25. package/NetInfo/src/__tests__/eventListenerCallbacks.spec.ts +332 -0
  26. package/NetInfo/src/__tests__/fetch.spec.ts +479 -0
  27. package/NetInfo/src/index.ts +186 -0
  28. package/NetInfo/src/internal/__mocks__/nativeModule.ts +13 -0
  29. package/NetInfo/src/internal/defaultConfiguration.ts +17 -0
  30. package/NetInfo/src/internal/defaultConfiguration.web.ts +17 -0
  31. package/NetInfo/src/internal/internetReachability.ts +180 -0
  32. package/NetInfo/src/internal/nativeInterface.ts +43 -0
  33. package/NetInfo/src/internal/nativeInterface.web.ts +27 -0
  34. package/NetInfo/src/internal/nativeModule.ts +15 -0
  35. package/NetInfo/src/internal/nativeModule.web.ts +306 -0
  36. package/NetInfo/src/internal/privateTypes.ts +41 -0
  37. package/NetInfo/src/internal/state.ts +137 -0
  38. package/NetInfo/src/internal/types.ts +128 -0
  39. package/README.md +246 -0
  40. package/RecordScreen/src/index.tsx +75 -0
  41. package/ScreenShot/src/RNViewShot.js +3 -0
  42. package/ScreenShot/src/RNViewShot.web.js +42 -0
  43. package/ScreenShot/src/index.js +308 -0
  44. package/Sensor/src/index.js +14 -0
  45. package/Sensor/src/rnsensors.js +57 -0
  46. package/Sensor/src/sensors.js +97 -0
  47. package/VideoPlayer/PlayVideo.tsx +51 -0
  48. package/VideoPlayer/index.js +69 -0
  49. package/android/README.md +14 -0
  50. package/android/build/generated/source/buildConfig/debug/com/shakebug/BuildConfig.java +10 -0
  51. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +42 -0
  52. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
  53. package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +6 -0
  54. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
  55. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  56. package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
  57. package/android/build/intermediates/compile_symbol_list/debug/R.txt +47 -0
  58. package/android/build/intermediates/compiled_local_resources/debug/out/xml_imagepicker_provider_paths.xml.flat +0 -0
  59. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +12 -0
  60. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  61. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  62. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  63. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  64. package/android/build/intermediates/javac/debug/classes/com/shakebug/BuildConfig.class +0 -0
  65. package/android/build/intermediates/javac/debug/classes/com/shakebug/CustomMediaMetadataRetriever.class +0 -0
  66. package/android/build/intermediates/javac/debug/classes/com/shakebug/ImageMetadata.class +0 -0
  67. package/android/build/intermediates/javac/debug/classes/com/shakebug/ImagePickerProvider.class +0 -0
  68. package/android/build/intermediates/javac/debug/classes/com/shakebug/Metadata.class +0 -0
  69. package/android/build/intermediates/javac/debug/classes/com/shakebug/Options.class +0 -0
  70. package/android/build/intermediates/javac/debug/classes/com/shakebug/RecordScreenModule$1.class +0 -0
  71. package/android/build/intermediates/javac/debug/classes/com/shakebug/RecordScreenModule.class +0 -0
  72. package/android/build/intermediates/javac/debug/classes/com/shakebug/Shakebug.class +0 -0
  73. package/android/build/intermediates/javac/debug/classes/com/shakebug/ShakebugPackage.class +0 -0
  74. package/android/build/intermediates/javac/debug/classes/com/shakebug/Utility.class +0 -0
  75. package/android/build/intermediates/javac/debug/classes/com/shakebug/Utils.class +0 -0
  76. package/android/build/intermediates/javac/debug/classes/com/shakebug/VideoMetadata.class +0 -0
  77. package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$1.class +0 -0
  78. package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$2.class +0 -0
  79. package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$Formats.class +0 -0
  80. package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$Results.class +0 -0
  81. package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$ReusableByteArrayOutputStream.class +0 -0
  82. package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot.class +0 -0
  83. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +49 -0
  84. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +82 -0
  85. package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +42 -0
  86. package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
  87. package/android/build/intermediates/packaged_res/debug/values/values.xml +25 -0
  88. package/android/build/intermediates/packaged_res/debug/xml/imagepicker_provider_paths.xml +4 -0
  89. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/BuildConfig.class +0 -0
  90. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/CustomMediaMetadataRetriever.class +0 -0
  91. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ImageMetadata.class +0 -0
  92. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ImagePickerProvider.class +0 -0
  93. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Metadata.class +0 -0
  94. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Options.class +0 -0
  95. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/RecordScreenModule$1.class +0 -0
  96. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/RecordScreenModule.class +0 -0
  97. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Shakebug.class +0 -0
  98. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ShakebugPackage.class +0 -0
  99. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Utility.class +0 -0
  100. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Utils.class +0 -0
  101. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/VideoMetadata.class +0 -0
  102. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$1.class +0 -0
  103. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$2.class +0 -0
  104. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$Formats.class +0 -0
  105. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$Results.class +0 -0
  106. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$ReusableByteArrayOutputStream.class +0 -0
  107. package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot.class +0 -0
  108. package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +48 -0
  109. package/android/build/outputs/logs/manifest-merger-debug-report.txt +97 -0
  110. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  111. package/android/build.gradle +235 -0
  112. package/android/src/main/AndroidManifest.xml +40 -0
  113. package/android/src/main/java/com/shakebug/AmazonFireDeviceConnectivityPoller.java +170 -0
  114. package/android/src/main/java/com/shakebug/BaseUtils.java +33 -0
  115. package/android/src/main/java/com/shakebug/BroadcastReceiverConnectivityReceiver.java +131 -0
  116. package/android/src/main/java/com/shakebug/ConnectivityReceiver.java +318 -0
  117. package/android/src/main/java/com/shakebug/CrashLoggerModule.java +48 -0
  118. package/android/src/main/java/com/shakebug/DateUtil.java +64 -0
  119. package/android/src/main/java/com/shakebug/DeviceType.java +18 -0
  120. package/android/src/main/java/com/shakebug/DeviceUtil.java +46 -0
  121. package/android/src/main/java/com/shakebug/DrawingView.java +90 -0
  122. package/android/src/main/java/com/shakebug/DrawingViewManager.java +38 -0
  123. package/android/src/main/java/com/shakebug/GetLocation.java +147 -0
  124. package/android/src/main/java/com/shakebug/ImageMetadata.java +42 -0
  125. package/android/src/main/java/com/shakebug/ImagePickerProvider.java +8 -0
  126. package/android/src/main/java/com/shakebug/Metadata.java +46 -0
  127. package/android/src/main/java/com/shakebug/NetInfoModule.java +79 -0
  128. package/android/src/main/java/com/shakebug/NetInfoUtils.java +50 -0
  129. package/android/src/main/java/com/shakebug/NetworkCallbackConnectivityReceiver.java +209 -0
  130. package/android/src/main/java/com/shakebug/Options.java +42 -0
  131. package/android/src/main/java/com/shakebug/RNDeviceModule.java +1036 -0
  132. package/android/src/main/java/com/shakebug/RNInstallReferrerClient.java +124 -0
  133. package/android/src/main/java/com/shakebug/RNLocalizeModule.java +79 -0
  134. package/android/src/main/java/com/shakebug/RNLocalizeModuleImpl.java +258 -0
  135. package/android/src/main/java/com/shakebug/ReactNativeGetLocationModule.java +95 -0
  136. package/android/src/main/java/com/shakebug/RecordScreenModule.java +202 -0
  137. package/android/src/main/java/com/shakebug/ScreenshotDetectorModule.java +63 -0
  138. package/android/src/main/java/com/shakebug/SettingsUtil.java +44 -0
  139. package/android/src/main/java/com/shakebug/Shakebug.java +181 -0
  140. package/android/src/main/java/com/shakebug/ShakebugPackage.java +75 -0
  141. package/android/src/main/java/com/shakebug/ShakebugSDKImagePickerModule.java +56 -0
  142. package/android/src/main/java/com/shakebug/ShakebugSDKImagePickerModuleImpl.java +230 -0
  143. package/android/src/main/java/com/shakebug/ShakebugSDKScreenShotModule.java +196 -0
  144. package/android/src/main/java/com/shakebug/SharedPreferencesModule.java +39 -0
  145. package/android/src/main/java/com/shakebug/UnitConverter.java +48 -0
  146. package/android/src/main/java/com/shakebug/Utility.java +29 -0
  147. package/android/src/main/java/com/shakebug/Utils.java +593 -0
  148. package/android/src/main/java/com/shakebug/VideoMetadata.java +91 -0
  149. package/android/src/main/java/com/shakebug/VideoPlayerModule.java +199 -0
  150. package/android/src/main/java/com/shakebug/VideoThumbnailModule.java +215 -0
  151. package/android/src/main/java/com/shakebug/VideoTrimModule.java +372 -0
  152. package/android/src/main/java/com/shakebug/ViewShot.java +627 -0
  153. package/android/src/main/java/com/shakebug/adapters/VideoTrimmerAdapter.java +54 -0
  154. package/android/src/main/java/com/shakebug/callback/SingleCallback.java +11 -0
  155. package/android/src/main/java/com/shakebug/interfaces/IVideoTrimmerView.java +5 -0
  156. package/android/src/main/java/com/shakebug/interfaces/VideoPlayerListner.java +5 -0
  157. package/android/src/main/java/com/shakebug/interfaces/VideoTrimListener.java +10 -0
  158. package/android/src/main/java/com/shakebug/resolver/DeviceIdResolver.java +87 -0
  159. package/android/src/main/java/com/shakebug/resolver/DeviceTypeResolver.java +94 -0
  160. package/android/src/main/java/com/shakebug/thread/BackgroundExecutor.java +246 -0
  161. package/android/src/main/java/com/shakebug/thread/UiThreadExecutor.java +120 -0
  162. package/android/src/main/java/com/shakebug/types/CellularGeneration.java +60 -0
  163. package/android/src/main/java/com/shakebug/types/ConnectionType.java +26 -0
  164. package/android/src/main/java/com/shakebug/utils/StorageUtil.java +139 -0
  165. package/android/src/main/java/com/shakebug/utils/VideoTrimmerUtil.java +89 -0
  166. package/android/src/main/java/com/shakebug/widgets/RangeSeekBarView.java +534 -0
  167. package/android/src/main/java/com/shakebug/widgets/SpacesItemDecoration2.java +32 -0
  168. package/android/src/main/java/com/shakebug/widgets/VideoPlayerView.java +429 -0
  169. package/android/src/main/java/com/shakebug/widgets/VideoTrimmerView.java +477 -0
  170. package/android/src/main/java/com/shakebug/widgets/ZVideoView.java +48 -0
  171. package/android/src/main/res/drawable/custom_progress.xml +16 -0
  172. package/android/src/main/res/drawable/custom_thumb.xml +4 -0
  173. package/android/src/main/res/drawable/ic_close_button.xml +10 -0
  174. package/android/src/main/res/drawable/ic_video_pause_black.png +0 -0
  175. package/android/src/main/res/drawable/ic_video_play_black.png +0 -0
  176. package/android/src/main/res/drawable/ic_video_thumb_handle.png +0 -0
  177. package/android/src/main/res/drawable/icon_seek_bar.png +0 -0
  178. package/android/src/main/res/layout/video_player_view.xml +121 -0
  179. package/android/src/main/res/layout/video_thumb_item_layout.xml +16 -0
  180. package/android/src/main/res/layout/video_trimmer_view.xml +148 -0
  181. package/android/src/main/res/values/colors.xml +17 -0
  182. package/android/src/main/res/values/strings.xml +14 -0
  183. package/android/src/main/res/xml/imagepicker_provider_paths.xml +4 -0
  184. package/ios/CammeraPermission/RNCameraPermission.h +16 -0
  185. package/ios/CammeraPermission/RNCameraPermission.m +46 -0
  186. package/ios/DeviceInfo/DeviceUID.h +14 -0
  187. package/ios/DeviceInfo/DeviceUID.m +202 -0
  188. package/ios/DeviceInfo/EnvironmentUtil.h +41 -0
  189. package/ios/DeviceInfo/EnvironmentUtil.m +56 -0
  190. package/ios/DeviceInfo/RNDeviceInfo.h +22 -0
  191. package/ios/DeviceInfo/RNDeviceInfo.m +918 -0
  192. package/ios/GetLocals/ShakebugSDKRNLocalize.h +21 -0
  193. package/ios/GetLocals/ShakebugSDKRNLocalize.m +296 -0
  194. package/ios/GetLocation/SettingsUtil.h +16 -0
  195. package/ios/GetLocation/SettingsUtil.m +21 -0
  196. package/ios/GetLocation/ShakebugSDKLocationModule.h +17 -0
  197. package/ios/GetLocation/ShakebugSDKLocationModule.m +218 -0
  198. package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerManager.h +40 -0
  199. package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerManager.m +588 -0
  200. package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerUtils.h +26 -0
  201. package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerUtils.m +194 -0
  202. package/ios/MicrophonePermissionManager.h +14 -0
  203. package/ios/MicrophonePermissionManager.m +35 -0
  204. package/ios/NetInfo/RNCConnectionState.h +42 -0
  205. package/ios/NetInfo/RNCConnectionState.m +119 -0
  206. package/ios/NetInfo/RNCConnectionStateWatcher.h +31 -0
  207. package/ios/NetInfo/RNCConnectionStateWatcher.m +136 -0
  208. package/ios/NetInfo/RNCNetInfo.h +13 -0
  209. package/ios/NetInfo/RNCNetInfo.m +269 -0
  210. package/ios/RecordScreen/ShakebugSDKRecordScreen.h +31 -0
  211. package/ios/RecordScreen/ShakebugSDKRecordScreen.m +309 -0
  212. package/ios/ScreenShot/ShakebugSDKRNViewShot.h +6 -0
  213. package/ios/ScreenShot/ShakebugSDKRNViewShot.m +186 -0
  214. package/ios/ScreenshotDetector/ScreenShotDetector.h +12 -0
  215. package/ios/ScreenshotDetector/ScreenShotDetector.m +37 -0
  216. package/ios/Senors/RNSensorsAccelerometer.h +22 -0
  217. package/ios/Senors/RNSensorsAccelerometer.m +162 -0
  218. package/ios/Senors/RNSensorsBarometer.h +22 -0
  219. package/ios/Senors/RNSensorsBarometer.m +141 -0
  220. package/ios/Senors/RNSensorsGravity.h +22 -0
  221. package/ios/Senors/RNSensorsGravity.m +165 -0
  222. package/ios/Senors/RNSensorsGyroscope.h +22 -0
  223. package/ios/Senors/RNSensorsGyroscope.m +160 -0
  224. package/ios/Senors/RNSensorsMagnetometer.h +22 -0
  225. package/ios/Senors/RNSensorsMagnetometer.m +163 -0
  226. package/ios/Senors/RNSensorsOrientation.h +22 -0
  227. package/ios/Senors/RNSensorsOrientation.m +189 -0
  228. package/ios/Senors/RNSensorsUtils.h +7 -0
  229. package/ios/Senors/RNSensorsUtils.m +9 -0
  230. package/ios/Shakebug.h +7 -0
  231. package/ios/Shakebug.m +16 -0
  232. package/ios/Shakebug.xcodeproj/project.pbxproj +872 -0
  233. package/ios/Shakebug.xcodeproj/xcshareddata/xcschemes/Shakebug.xcscheme +66 -0
  234. package/ios/Shakebug.xcworkspace/contents.xcworkspacedata +10 -0
  235. package/ios/Shakebug.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  236. package/ios/SketchCanvas/DrawingView.h +18 -0
  237. package/ios/SketchCanvas/DrawingView.m +96 -0
  238. package/ios/SketchCanvas/DrawingViewManager.h +12 -0
  239. package/ios/SketchCanvas/DrawingViewManager.m +35 -0
  240. package/ios/Storage/SharedPreferencesModule.h +13 -0
  241. package/ios/Storage/SharedPreferencesModule.m +35 -0
  242. package/ios/Thumbnaill/VideoThumbnailManager.h +12 -0
  243. package/ios/Thumbnaill/VideoThumbnailManager.m +73 -0
  244. package/ios/TrimVideo/ShakebugSDKVideoTrim.swift +372 -0
  245. package/ios/TrimVideo/VideoTrim-Bridging-Header.h +10 -0
  246. package/ios/TrimVideo/VideoTrim.m +23 -0
  247. package/ios/TrimVideo/VideoTrimmer.swift +810 -0
  248. package/ios/TrimVideo/VideoTrimmerThumb.swift +119 -0
  249. package/ios/TrimVideo/VideoTrimmerViewController.swift +301 -0
  250. package/ios/VideoPlayer/VideoPlayerModule.h +14 -0
  251. package/ios/VideoPlayer/VideoPlayerModule.m +29 -0
  252. package/ios/VideoPlayer/VideoPlayerViewController.h +18 -0
  253. package/ios/VideoPlayer/VideoPlayerViewController.m +29 -0
  254. package/package.json +45 -0
  255. package/shakebug-react-native.podspec +50 -0
  256. package/src/APIs/AddIssue.js +70 -0
  257. package/src/APIs/EndSession.js +32 -0
  258. package/src/APIs/Event.js +39 -0
  259. package/src/APIs/MatchKey.js +40 -0
  260. package/src/APIs/StartSession.js +84 -0
  261. package/src/Assets/images/OpenSketch.png +0 -0
  262. package/src/Assets/images/Push.png +0 -0
  263. package/src/Assets/images/RemoveTextView.png +0 -0
  264. package/src/Assets/images/black.png +0 -0
  265. package/src/Assets/images/blue.png +0 -0
  266. package/src/Assets/images/borderdBlack.png +0 -0
  267. package/src/Assets/images/borderdBlue.png +0 -0
  268. package/src/Assets/images/borderdGreen.png +0 -0
  269. package/src/Assets/images/borderdRed.png +0 -0
  270. package/src/Assets/images/borderdYellow.png +0 -0
  271. package/src/Assets/images/clear.png +0 -0
  272. package/src/Assets/images/close.png +0 -0
  273. package/src/Assets/images/green.png +0 -0
  274. package/src/Assets/images/next.png +0 -0
  275. package/src/Assets/images/play.png +0 -0
  276. package/src/Assets/images/red.png +0 -0
  277. package/src/Assets/images/shake.png +0 -0
  278. package/src/Assets/images/shakebugLogo.png +0 -0
  279. package/src/Assets/images/stopButton.png +0 -0
  280. package/src/Assets/images/text_icon.png +0 -0
  281. package/src/Assets/images/yellow.png +0 -0
  282. package/src/Componanats/CustomAlert.js +80 -0
  283. package/src/Componanats/ErrorHandler.js +80 -0
  284. package/src/Componanats/GlobalStateContext.js +22 -0
  285. package/src/Componanats/KeyboardAvoidingWrapper.js +43 -0
  286. package/src/Componanats/NavigationContext.js +42 -0
  287. package/src/Componanats/ShakeFunction.js +562 -0
  288. package/src/Componanats/localization.js +482 -0
  289. package/src/Screens/AddDetailsScreen.js +462 -0
  290. package/src/Screens/FirstScreen.js +629 -0
  291. package/src/Screens/Shakebug.js +487 -0
  292. package/src/Screens/StrockView.js +20 -0
  293. package/src/Screens/TrimVideoScreen.js +81 -0
  294. package/src/Screens/TutorialScreen.js +36 -0
  295. package/src/index.tsx +117 -0
  296. package/trimVideo/src/index.tsx +141 -0
@@ -0,0 +1,627 @@
1
+ package com.shakebug;
2
+
3
+ import android.app.Activity;
4
+ import android.graphics.Bitmap;
5
+ import android.graphics.Canvas;
6
+ import android.graphics.Color;
7
+ import android.graphics.Matrix;
8
+ import android.graphics.Paint;
9
+ import android.graphics.Point;
10
+ import android.net.Uri;
11
+ import android.os.Build;
12
+ import android.os.Handler;
13
+ import androidx.annotation.IntDef;
14
+ import androidx.annotation.NonNull;
15
+ import androidx.annotation.StringDef;
16
+
17
+ import android.os.Looper;
18
+ import android.util.Base64;
19
+ import android.util.Log;
20
+ import android.view.PixelCopy;
21
+ import android.view.SurfaceView;
22
+ import android.view.TextureView;
23
+ import android.view.View;
24
+ import android.view.ViewGroup;
25
+ import android.widget.ScrollView;
26
+
27
+ import com.facebook.react.bridge.Promise;
28
+ import com.facebook.react.bridge.ReactApplicationContext;
29
+ import com.facebook.react.uimanager.NativeViewHierarchyManager;
30
+ import com.facebook.react.uimanager.UIBlock;
31
+
32
+ import java.io.ByteArrayOutputStream;
33
+ import java.io.File;
34
+ import java.io.FileOutputStream;
35
+ import java.io.IOException;
36
+ import java.io.OutputStream;
37
+ import java.nio.ByteBuffer;
38
+ import java.nio.charset.Charset;
39
+ import java.util.ArrayList;
40
+ import java.util.Arrays;
41
+ import java.util.Collections;
42
+ import java.util.LinkedList;
43
+ import java.util.List;
44
+ import java.util.Locale;
45
+ import java.util.Set;
46
+ import java.util.WeakHashMap;
47
+ import java.util.concurrent.CountDownLatch;
48
+ import java.util.concurrent.Executor;
49
+ import java.util.concurrent.Executors;
50
+ import java.util.concurrent.TimeUnit;
51
+ import java.util.zip.Deflater;
52
+
53
+ import javax.annotation.Nullable;
54
+
55
+ import static android.view.View.VISIBLE;
56
+
57
+ /**
58
+ * Snapshot utility class allow to screenshot a view.
59
+ */
60
+ public class ViewShot implements UIBlock {
61
+ //region Constants
62
+ /**
63
+ * Tag fort Class logs.
64
+ */
65
+ private static final String TAG = ViewShot.class.getSimpleName();
66
+ /**
67
+ * Error code that we return to RN.
68
+ */
69
+ public static final String ERROR_UNABLE_TO_SNAPSHOT = "E_UNABLE_TO_SNAPSHOT";
70
+ /**
71
+ * pre-allocated output stream size for screenshot. In real life example it will eb around 7Mb.
72
+ */
73
+ private static final int PREALLOCATE_SIZE = 64 * 1024;
74
+ /**
75
+ * ARGB size in bytes.
76
+ */
77
+ private static final int ARGB_SIZE = 4;
78
+ /**
79
+ * Wait timeout for surface view capture.
80
+ */
81
+ private static final int SURFACE_VIEW_READ_PIXELS_TIMEOUT = 5;
82
+
83
+ @SuppressWarnings("WeakerAccess")
84
+ @IntDef({Formats.JPEG, Formats.PNG, Formats.WEBP, Formats.RAW})
85
+ public @interface Formats {
86
+ int JPEG = 0; // Bitmap.CompressFormat.JPEG.ordinal();
87
+ int PNG = 1; // Bitmap.CompressFormat.PNG.ordinal();
88
+ int WEBP = 2; // Bitmap.CompressFormat.WEBP.ordinal();
89
+ int RAW = -1;
90
+
91
+ Bitmap.CompressFormat[] mapping = {
92
+ Bitmap.CompressFormat.JPEG,
93
+ Bitmap.CompressFormat.PNG,
94
+ Bitmap.CompressFormat.WEBP
95
+ };
96
+ }
97
+
98
+ /**
99
+ * Supported Output results.
100
+ */
101
+ @StringDef({Results.BASE_64, Results.DATA_URI, Results.TEMP_FILE, Results.ZIP_BASE_64})
102
+ public @interface Results {
103
+ /**
104
+ * Save screenshot as temp file on device.
105
+ */
106
+ String TEMP_FILE = "tmpfile";
107
+ /**
108
+ * Base 64 encoded image.
109
+ */
110
+ String BASE_64 = "base64";
111
+ /**
112
+ * Zipped RAW image in base 64 encoding.
113
+ */
114
+ String ZIP_BASE_64 = "zip-base64";
115
+ /**
116
+ * Base64 data uri.
117
+ */
118
+ String DATA_URI = "data-uri";
119
+ }
120
+ //endregion
121
+
122
+ //region Static members
123
+ /**
124
+ * Image output buffer used as a source for base64 encoding
125
+ */
126
+ private static byte[] outputBuffer = new byte[PREALLOCATE_SIZE];
127
+ //endregion
128
+
129
+ //region Class members
130
+ private final int tag;
131
+ private final String extension;
132
+ @Formats
133
+ private final int format;
134
+ private final double quality;
135
+ private final Integer width;
136
+ private final Integer height;
137
+ private final File output;
138
+ @Results
139
+ private final String result;
140
+ private final Promise promise;
141
+ private final Boolean snapshotContentContainer;
142
+ @SuppressWarnings({"unused", "FieldCanBeLocal"})
143
+ private final ReactApplicationContext reactContext;
144
+ private final boolean handleGLSurfaceView;
145
+ private final Activity currentActivity;
146
+ private final Executor executor;
147
+ //endregion
148
+
149
+ //region Constructors
150
+ @SuppressWarnings("WeakerAccess")
151
+ public ViewShot(
152
+ final int tag,
153
+ final String extension,
154
+ @Formats final int format,
155
+ final double quality,
156
+ @Nullable Integer width,
157
+ @Nullable Integer height,
158
+ final File output,
159
+ @Results final String result,
160
+ final Boolean snapshotContentContainer,
161
+ final ReactApplicationContext reactContext,
162
+ final Activity currentActivity,
163
+ final boolean handleGLSurfaceView,
164
+ final Promise promise,
165
+ final Executor executor) {
166
+ this.tag = tag;
167
+ this.extension = extension;
168
+ this.format = format;
169
+ this.quality = quality;
170
+ this.width = width;
171
+ this.height = height;
172
+ this.output = output;
173
+ this.result = result;
174
+ this.snapshotContentContainer = snapshotContentContainer;
175
+ this.reactContext = reactContext;
176
+ this.currentActivity = currentActivity;
177
+ this.handleGLSurfaceView = handleGLSurfaceView;
178
+ this.promise = promise;
179
+ this.executor = executor;
180
+ }
181
+ //endregion
182
+
183
+ //region Overrides
184
+ @Override
185
+ public void execute(final NativeViewHierarchyManager nativeViewHierarchyManager) {
186
+ executor.execute(new Runnable () {
187
+ @Override
188
+ public void run() {
189
+ try {
190
+ final View view;
191
+
192
+ if (tag == -1) {
193
+ view = currentActivity.getWindow().getDecorView().findViewById(android.R.id.content);
194
+ } else {
195
+ view = nativeViewHierarchyManager.resolveView(tag);
196
+ }
197
+
198
+ if (view == null) {
199
+ Log.e(TAG, "No view found with reactTag: " + tag, new AssertionError());
200
+ promise.reject(ERROR_UNABLE_TO_SNAPSHOT, "No view found with reactTag: " + tag);
201
+ return;
202
+ }
203
+
204
+ final ReusableByteArrayOutputStream stream = new ReusableByteArrayOutputStream(outputBuffer);
205
+ stream.setSize(proposeSize(view));
206
+ outputBuffer = stream.innerBuffer();
207
+
208
+ if (Results.TEMP_FILE.equals(result) && Formats.RAW == format) {
209
+ saveToRawFileOnDevice(view);
210
+ } else if (Results.TEMP_FILE.equals(result) && Formats.RAW != format) {
211
+ saveToTempFileOnDevice(view);
212
+ } else if (Results.BASE_64.equals(result) || Results.ZIP_BASE_64.equals(result)) {
213
+ saveToBase64String(view);
214
+ } else if (Results.DATA_URI.equals(result)) {
215
+ saveToDataUriString(view);
216
+ }
217
+ } catch (final Throwable ex) {
218
+ Log.e(TAG, "Failed to capture view snapshot", ex);
219
+ promise.reject(ERROR_UNABLE_TO_SNAPSHOT, "Failed to capture view snapshot");
220
+ }
221
+ }
222
+ });
223
+ }
224
+ //endregion
225
+
226
+ //region Implementation
227
+ private void saveToTempFileOnDevice(@NonNull final View view) throws IOException {
228
+ final FileOutputStream fos = new FileOutputStream(output);
229
+ captureView(view, fos);
230
+
231
+ promise.resolve(Uri.fromFile(output).toString());
232
+ }
233
+
234
+ private void saveToRawFileOnDevice(@NonNull final View view) throws IOException {
235
+ final String uri = Uri.fromFile(output).toString();
236
+
237
+ final FileOutputStream fos = new FileOutputStream(output);
238
+ final ReusableByteArrayOutputStream os = new ReusableByteArrayOutputStream(outputBuffer);
239
+ final Point size = captureView(view, os);
240
+
241
+ // in case of buffer grow that will be a new array with bigger size
242
+ outputBuffer = os.innerBuffer();
243
+ final int length = os.size();
244
+ final String resolution = String.format(Locale.US, "%d:%d|", size.x, size.y);
245
+
246
+ fos.write(resolution.getBytes(Charset.forName("US-ASCII")));
247
+ fos.write(outputBuffer, 0, length);
248
+ fos.close();
249
+
250
+ promise.resolve(uri);
251
+ }
252
+
253
+ private void saveToDataUriString(@NonNull final View view) throws IOException {
254
+ final ReusableByteArrayOutputStream os = new ReusableByteArrayOutputStream(outputBuffer);
255
+ captureView(view, os);
256
+
257
+ outputBuffer = os.innerBuffer();
258
+ final int length = os.size();
259
+
260
+ final String data = Base64.encodeToString(outputBuffer, 0, length, Base64.NO_WRAP);
261
+
262
+ // correct the extension if JPG
263
+ final String imageFormat = "jpg".equals(extension) ? "jpeg" : extension;
264
+
265
+ promise.resolve("data:image/" + imageFormat + ";base64," + data);
266
+ }
267
+
268
+ private void saveToBase64String(@NonNull final View view) throws IOException {
269
+ final boolean isRaw = Formats.RAW == this.format;
270
+ final boolean isZippedBase64 = Results.ZIP_BASE_64.equals(this.result);
271
+
272
+ final ReusableByteArrayOutputStream os = new ReusableByteArrayOutputStream(outputBuffer);
273
+ final Point size = captureView(view, os);
274
+
275
+ // in case of buffer grow that will be a new array with bigger size
276
+ outputBuffer = os.innerBuffer();
277
+ final int length = os.size();
278
+ final String resolution = String.format(Locale.US, "%d:%d|", size.x, size.y);
279
+ final String header = (isRaw ? resolution : "");
280
+ final String data;
281
+
282
+ if (isZippedBase64) {
283
+ final Deflater deflater = new Deflater();
284
+ deflater.setInput(outputBuffer, 0, length);
285
+ deflater.finish();
286
+
287
+ final ReusableByteArrayOutputStream zipped = new ReusableByteArrayOutputStream(new byte[32]);
288
+ byte[] buffer = new byte[1024];
289
+ while (!deflater.finished()) {
290
+ int count = deflater.deflate(buffer); // returns the generated code... index
291
+ zipped.write(buffer, 0, count);
292
+ }
293
+
294
+ data = header + Base64.encodeToString(zipped.innerBuffer(), 0, zipped.size(), Base64.NO_WRAP);
295
+ } else {
296
+ data = header + Base64.encodeToString(outputBuffer, 0, length, Base64.NO_WRAP);
297
+ }
298
+
299
+ promise.resolve(data);
300
+ }
301
+
302
+ @NonNull
303
+ private List<View> getAllChildren(@NonNull final View v) {
304
+ if (!(v instanceof ViewGroup)) {
305
+ final ArrayList<View> viewArrayList = new ArrayList<>();
306
+ viewArrayList.add(v);
307
+
308
+ return viewArrayList;
309
+ }
310
+
311
+ final ArrayList<View> result = new ArrayList<>();
312
+
313
+ ViewGroup viewGroup = (ViewGroup) v;
314
+ for (int i = 0; i < viewGroup.getChildCount(); i++) {
315
+ View child = viewGroup.getChildAt(i);
316
+
317
+ //Do not add any parents, just add child elements
318
+ result.addAll(getAllChildren(child));
319
+ }
320
+
321
+ return result;
322
+ }
323
+
324
+ /**
325
+ * Wrap {@link #captureViewImpl(View, OutputStream)} call and on end close output stream.
326
+ */
327
+ private Point captureView(@NonNull final View view, @NonNull final OutputStream os) throws IOException {
328
+ try {
329
+ return captureViewImpl(view, os);
330
+ } finally {
331
+ os.close();
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Screenshot a view and return the captured bitmap.
337
+ *
338
+ * @param view the view to capture
339
+ * @return screenshot resolution, Width * Height
340
+ */
341
+ private Point captureViewImpl(@NonNull final View view, @NonNull final OutputStream os) {
342
+ int w = view.getWidth();
343
+ int h = view.getHeight();
344
+
345
+ if (w <= 0 || h <= 0) {
346
+ throw new RuntimeException("Impossible to snapshot the view: view is invalid");
347
+ }
348
+
349
+ // evaluate real height
350
+ if (snapshotContentContainer) {
351
+ h = 0;
352
+ ScrollView scrollView = (ScrollView) view;
353
+ for (int i = 0; i < scrollView.getChildCount(); i++) {
354
+ h += scrollView.getChildAt(i).getHeight();
355
+ }
356
+ }
357
+
358
+ final Point resolution = new Point(w, h);
359
+ Bitmap bitmap = getBitmapForScreenshot(w, h);
360
+
361
+ final Paint paint = new Paint();
362
+ paint.setAntiAlias(true);
363
+ paint.setFilterBitmap(true);
364
+ paint.setDither(true);
365
+
366
+ // Uncomment next line if you want to wait attached android studio debugger:
367
+ // Debug.waitForDebugger();
368
+
369
+ final Canvas c = new Canvas(bitmap);
370
+ view.draw(c);
371
+
372
+ //after view is drawn, go through children
373
+ final List<View> childrenList = getAllChildren(view);
374
+
375
+ for (final View child : childrenList) {
376
+ // skip any child that we don't know how to process
377
+ if (child instanceof TextureView) {
378
+ // skip all invisible to user child views
379
+ if (child.getVisibility() != VISIBLE) continue;
380
+
381
+ final TextureView tvChild = (TextureView) child;
382
+ tvChild.setOpaque(false); // <-- switch off background fill
383
+
384
+ // NOTE (olku): get re-usable bitmap. TextureView should use bitmaps with matching size,
385
+ // otherwise content of the TextureView will be scaled to provided bitmap dimensions
386
+ final Bitmap childBitmapBuffer = tvChild.getBitmap(getExactBitmapForScreenshot(child.getWidth(), child.getHeight()));
387
+
388
+ final int countCanvasSave = c.save();
389
+ applyTransformations(c, view, child);
390
+
391
+ // due to re-use of bitmaps for screenshot, we can get bitmap that is bigger in size than requested
392
+ c.drawBitmap(childBitmapBuffer, 0, 0, paint);
393
+
394
+ c.restoreToCount(countCanvasSave);
395
+ recycleBitmap(childBitmapBuffer);
396
+ } else if (child instanceof SurfaceView && handleGLSurfaceView) {
397
+ final SurfaceView svChild = (SurfaceView)child;
398
+ final CountDownLatch latch = new CountDownLatch(1);
399
+
400
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
401
+ final Bitmap childBitmapBuffer = getExactBitmapForScreenshot(child.getWidth(), child.getHeight());
402
+ try {
403
+ PixelCopy.request(svChild, childBitmapBuffer, new PixelCopy.OnPixelCopyFinishedListener() {
404
+ @Override
405
+ public void onPixelCopyFinished(int copyResult) {
406
+ final int countCanvasSave = c.save();
407
+ applyTransformations(c, view, child);
408
+ c.drawBitmap(childBitmapBuffer, 0, 0, paint);
409
+ c.restoreToCount(countCanvasSave);
410
+ recycleBitmap(childBitmapBuffer);
411
+ latch.countDown();
412
+ }
413
+ }, new Handler(Looper.getMainLooper()));
414
+ latch.await(SURFACE_VIEW_READ_PIXELS_TIMEOUT, TimeUnit.SECONDS);
415
+ } catch (Exception e) {
416
+ Log.e(TAG, "Cannot PixelCopy for " + svChild, e);
417
+ }
418
+ } else {
419
+ Bitmap cache = svChild.getDrawingCache();
420
+ if (cache != null) {
421
+ c.drawBitmap(svChild.getDrawingCache(), 0, 0, paint);
422
+ }
423
+ }
424
+ }
425
+ }
426
+
427
+ if (width != null && height != null && (width != w || height != h)) {
428
+ final Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
429
+ recycleBitmap(bitmap);
430
+
431
+ bitmap = scaledBitmap;
432
+ }
433
+
434
+ // special case, just save RAW ARGB array without any compression
435
+ if (Formats.RAW == this.format && os instanceof ReusableByteArrayOutputStream) {
436
+ final int total = w * h * ARGB_SIZE;
437
+ final ReusableByteArrayOutputStream rbaos = cast(os);
438
+ bitmap.copyPixelsToBuffer(rbaos.asBuffer(total));
439
+ rbaos.setSize(total);
440
+ } else {
441
+ final Bitmap.CompressFormat cf = Formats.mapping[this.format];
442
+
443
+ bitmap.compress(cf, (int) (100.0 * quality), os);
444
+ }
445
+
446
+ recycleBitmap(bitmap);
447
+
448
+ return resolution; // return image width and height
449
+ }
450
+
451
+ /**
452
+ * Concat all the transformation matrix's from parent to child.
453
+ */
454
+ @NonNull
455
+ @SuppressWarnings("UnusedReturnValue")
456
+ private Matrix applyTransformations(final Canvas c, @NonNull final View root, @NonNull final View child) {
457
+ final Matrix transform = new Matrix();
458
+ final LinkedList<View> ms = new LinkedList<>();
459
+
460
+ // find all parents of the child view
461
+ View iterator = child;
462
+ do {
463
+ ms.add(iterator);
464
+
465
+ iterator = (View) iterator.getParent();
466
+ } while (iterator != root);
467
+
468
+ // apply transformations from parent --> child order
469
+ Collections.reverse(ms);
470
+
471
+ for (final View v : ms) {
472
+ c.save();
473
+
474
+ // apply each view transformations, so each child will be affected by them
475
+ final float dx = v.getLeft() + ((v != child) ? v.getPaddingLeft() : 0) + v.getTranslationX();
476
+ final float dy = v.getTop() + ((v != child) ? v.getPaddingTop() : 0) + v.getTranslationY();
477
+ c.translate(dx, dy);
478
+ c.rotate(v.getRotation(), v.getPivotX(), v.getPivotY());
479
+ c.scale(v.getScaleX(), v.getScaleY());
480
+
481
+ // compute the matrix just for any future use
482
+ transform.postTranslate(dx, dy);
483
+ transform.postRotate(v.getRotation(), v.getPivotX(), v.getPivotY());
484
+ transform.postScale(v.getScaleX(), v.getScaleY());
485
+ }
486
+
487
+ return transform;
488
+ }
489
+
490
+ @SuppressWarnings("unchecked")
491
+ private static <T extends A, A> T cast(final A instance) {
492
+ return (T) instance;
493
+ }
494
+ //endregion
495
+
496
+ //region Cache re-usable bitmaps
497
+ /**
498
+ * Synchronization guard.
499
+ */
500
+ private static final Object guardBitmaps = new Object();
501
+ /**
502
+ * Reusable bitmaps for screenshots.
503
+ */
504
+ private static final Set<Bitmap> weakBitmaps = Collections.newSetFromMap(new WeakHashMap<Bitmap, Boolean>());
505
+
506
+ /**
507
+ * Propose allocation size of the array output stream.
508
+ */
509
+ private static int proposeSize(@NonNull final View view) {
510
+ final int w = view.getWidth();
511
+ final int h = view.getHeight();
512
+
513
+ return Math.min(w * h * ARGB_SIZE, 32);
514
+ }
515
+
516
+ /**
517
+ * Return bitmap to set of available.
518
+ */
519
+ private static void recycleBitmap(@NonNull final Bitmap bitmap) {
520
+ synchronized (guardBitmaps) {
521
+ weakBitmaps.add(bitmap);
522
+ }
523
+ }
524
+
525
+ /**
526
+ * Try to find a bitmap for screenshot in reusable set and if not found create a new one.
527
+ */
528
+ @NonNull
529
+ private static Bitmap getBitmapForScreenshot(final int width, final int height) {
530
+ synchronized (guardBitmaps) {
531
+ for (final Bitmap bmp : weakBitmaps) {
532
+ if (bmp.getWidth() == width && bmp.getHeight() == height) {
533
+ weakBitmaps.remove(bmp);
534
+ bmp.eraseColor(Color.TRANSPARENT);
535
+ return bmp;
536
+ }
537
+ }
538
+ }
539
+
540
+ return Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
541
+ }
542
+
543
+ /**
544
+ * Try to find a bitmap with exact width and height for screenshot in reusable set and if
545
+ * not found create a new one.
546
+ */
547
+ @NonNull
548
+ private static Bitmap getExactBitmapForScreenshot(final int width, final int height) {
549
+ synchronized (guardBitmaps) {
550
+ for (final Bitmap bmp : weakBitmaps) {
551
+ if (bmp.getWidth() == width && bmp.getHeight() == height) {
552
+ weakBitmaps.remove(bmp);
553
+ bmp.eraseColor(Color.TRANSPARENT);
554
+ return bmp;
555
+ }
556
+ }
557
+ }
558
+
559
+ return Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
560
+ }
561
+ //endregion
562
+
563
+ //region Nested declarations
564
+
565
+ /**
566
+ * Stream that can re-use pre-allocated buffer.
567
+ */
568
+ @SuppressWarnings("WeakerAccess")
569
+ public static class ReusableByteArrayOutputStream extends ByteArrayOutputStream {
570
+ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
571
+
572
+ public ReusableByteArrayOutputStream(@NonNull final byte[] buffer) {
573
+ super(0);
574
+
575
+ this.buf = buffer;
576
+ }
577
+
578
+ /**
579
+ * Get access to inner buffer without any memory copy operations.
580
+ */
581
+ public byte[] innerBuffer() {
582
+ return this.buf;
583
+ }
584
+
585
+ @NonNull
586
+ public ByteBuffer asBuffer(final int size) {
587
+ if (this.buf.length < size) {
588
+ grow(size);
589
+ }
590
+
591
+ return ByteBuffer.wrap(this.buf);
592
+ }
593
+
594
+ public void setSize(final int size) {
595
+ this.count = size;
596
+ }
597
+
598
+ /**
599
+ * Increases the capacity to ensure that it can hold at least the
600
+ * number of elements specified by the minimum capacity argument.
601
+ *
602
+ * @param minCapacity the desired minimum capacity
603
+ */
604
+ protected void grow(int minCapacity) {
605
+ // overflow-conscious code
606
+ int oldCapacity = buf.length;
607
+ int newCapacity = oldCapacity << 1;
608
+ if (newCapacity - minCapacity < 0)
609
+ newCapacity = minCapacity;
610
+ if (newCapacity - MAX_ARRAY_SIZE > 0)
611
+ newCapacity = hugeCapacity(minCapacity);
612
+ buf = Arrays.copyOf(buf, newCapacity);
613
+ }
614
+
615
+ protected static int hugeCapacity(int minCapacity) {
616
+ if (minCapacity < 0) // overflow
617
+ throw new OutOfMemoryError();
618
+
619
+ return (minCapacity > MAX_ARRAY_SIZE) ?
620
+ Integer.MAX_VALUE :
621
+ MAX_ARRAY_SIZE;
622
+ }
623
+
624
+ }
625
+ //endregion
626
+
627
+ }
@@ -0,0 +1,54 @@
1
+ package com.shakebug.adapters;
2
+
3
+ import android.content.Context;
4
+ import android.graphics.Bitmap;
5
+ import android.view.LayoutInflater;
6
+ import android.view.View;
7
+ import android.view.ViewGroup;
8
+ import android.widget.ImageView;
9
+ import android.widget.LinearLayout;
10
+ import androidx.annotation.NonNull;
11
+ import androidx.recyclerview.widget.RecyclerView;
12
+ import com.shakebug.R;
13
+ import com.shakebug.utils.VideoTrimmerUtil;
14
+ import java.util.ArrayList;
15
+ import java.util.List;
16
+
17
+ public class VideoTrimmerAdapter extends RecyclerView.Adapter {
18
+ private final List<Bitmap> mBitmaps = new ArrayList<>();
19
+ private final LayoutInflater mInflater;
20
+
21
+ public VideoTrimmerAdapter(Context context) {
22
+ this.mInflater = LayoutInflater.from(context);
23
+ }
24
+
25
+ @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
26
+ return new TrimmerViewHolder(mInflater.inflate(R.layout.video_thumb_item_layout, parent, false));
27
+ }
28
+
29
+ @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
30
+ ((TrimmerViewHolder) holder).thumbImageView.setImageBitmap(mBitmaps.get(position));
31
+ }
32
+
33
+ @Override public int getItemCount() {
34
+ return mBitmaps.size();
35
+ }
36
+
37
+ public void addBitmaps(Bitmap bitmap) {
38
+ mBitmaps.add(bitmap);
39
+ notifyItemInserted(mBitmaps.size() - 1);
40
+ }
41
+
42
+ private static final class TrimmerViewHolder extends RecyclerView.ViewHolder {
43
+ ImageView thumbImageView;
44
+
45
+ TrimmerViewHolder(View itemView) {
46
+ super(itemView);
47
+ thumbImageView = itemView.findViewById(R.id.thumb);
48
+ LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) thumbImageView.getLayoutParams();
49
+ layoutParams.width = VideoTrimmerUtil.VIDEO_FRAMES_WIDTH / VideoTrimmerUtil.MAX_COUNT_RANGE;
50
+ thumbImageView.setLayoutParams(layoutParams);
51
+ }
52
+ }
53
+ }
54
+
@@ -0,0 +1,11 @@
1
+ package com.shakebug.callback;
2
+
3
+ /**
4
+ * Author:J.Chou
5
+ * Date: 2016.07.20 19:01.
6
+ * Email: who_know_me@163.com
7
+ * Describe:
8
+ */
9
+ public interface SingleCallback<T,V> {
10
+ void onSingleCallback(T t,V v);
11
+ }
@@ -0,0 +1,5 @@
1
+ package com.shakebug.interfaces;
2
+
3
+ public interface IVideoTrimmerView {
4
+ void onDestroy();
5
+ }
@@ -0,0 +1,5 @@
1
+ package com.shakebug.interfaces;
2
+
3
+ public interface VideoPlayerListner {
4
+ void onCancel();
5
+ }