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,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <LinearLayout
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:tools="http://schemas.android.com/tools"
5
+ android:layout_width="wrap_content"
6
+ android:layout_height="60dp"
7
+ android:orientation="vertical"
8
+ >
9
+
10
+ <ImageView
11
+ android:id="@+id/thumb"
12
+ android:layout_width="39dp"
13
+ android:layout_height="match_parent"
14
+ android:scaleType="centerCrop"
15
+ tools:src="@color/red"/>
16
+ </LinearLayout>
@@ -0,0 +1,148 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <RelativeLayout
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:tools="http://schemas.android.com/tools"
5
+ android:layout_width="match_parent"
6
+ android:layout_height="match_parent"
7
+ android:orientation="vertical"
8
+ >
9
+
10
+ <RelativeLayout
11
+ android:id="@+id/layout_surface_view"
12
+ android:layout_width="match_parent"
13
+ android:layout_height="match_parent"
14
+ android:layout_above="@+id/layout"
15
+ android:background="@android:color/black"
16
+ android:gravity="center"
17
+ >
18
+
19
+ <com.shakebug.widgets.ZVideoView
20
+ android:id="@+id/video_loader"
21
+ android:layout_width="match_parent"
22
+ android:layout_height="match_parent"
23
+ android:layout_centerInParent="true" />
24
+
25
+ </RelativeLayout>
26
+
27
+ <RelativeLayout
28
+ android:id="@+id/layout"
29
+ android:layout_width="match_parent"
30
+ android:layout_height="wrap_content"
31
+ android:layout_alignParentBottom="true"
32
+ android:background="@android:color/black"
33
+ >
34
+
35
+ <!-- <TextView-->
36
+ <!-- android:id="@+id/video_shoot_tip"-->
37
+ <!-- android:layout_width="match_parent"-->
38
+ <!-- android:layout_height="30dp"-->
39
+ <!-- android:layout_alignParentLeft="true"-->
40
+ <!-- android:layout_alignParentStart="true"-->
41
+ <!-- android:layout_alignParentTop="true"-->
42
+ <!-- android:gravity="center"-->
43
+ <!-- android:textColor="@android:color/white"-->
44
+ <!-- android:textSize="12dp"-->
45
+ <!-- tools:text="拖动选择你要发表的10秒以内片段"-->
46
+ <!-- />-->
47
+ <FrameLayout
48
+ android:id="@+id/video_frames_layout"
49
+ android:layout_width="match_parent"
50
+ android:layout_height="60dp"
51
+ >
52
+
53
+ <androidx.recyclerview.widget.RecyclerView
54
+ android:id="@+id/video_frames_recyclerView"
55
+ android:layout_width="match_parent"
56
+ android:layout_height="50dp"
57
+ android:layout_gravity="bottom"
58
+ tools:background="@android:color/holo_green_light"
59
+ />
60
+
61
+ <ImageView
62
+ android:id="@+id/positionIcon"
63
+ android:layout_width="wrap_content"
64
+ android:layout_height="50dp"
65
+ android:layout_gravity="bottom"
66
+ android:layout_marginLeft="35dp"
67
+ android:contentDescription="@null"
68
+ android:src="@drawable/icon_seek_bar"
69
+ />
70
+
71
+ <LinearLayout
72
+ android:layout_width="match_parent"
73
+ android:layout_height="wrap_content"
74
+ android:layout_gravity="bottom"
75
+ android:orientation="horizontal"
76
+ >
77
+
78
+ <View
79
+ android:layout_width="35dp"
80
+ android:layout_height="50dp"
81
+ android:layout_gravity="bottom"
82
+ android:background="@color/shadow_color"
83
+ />
84
+
85
+ <LinearLayout
86
+ android:id="@+id/seekBarLayout"
87
+ android:layout_width="0dp"
88
+ android:layout_height="60dp"
89
+ android:layout_gravity="bottom"
90
+ android:layout_weight="1"
91
+ android:gravity="bottom"
92
+ android:orientation="vertical"
93
+ />
94
+
95
+ <View
96
+ android:layout_width="35dp"
97
+ android:layout_height="match_parent"
98
+ android:layout_gravity="bottom"
99
+ android:background="@color/shadow_color"
100
+ />
101
+ </LinearLayout>
102
+ </FrameLayout>
103
+
104
+ <FrameLayout
105
+ android:layout_width="match_parent"
106
+ android:layout_height="50dp"
107
+ android:layout_below="@+id/video_frames_layout"
108
+ android:layout_marginLeft="10dp"
109
+ android:layout_marginRight="10dp"
110
+ android:orientation="horizontal"
111
+ android:visibility="visible"
112
+ >
113
+
114
+ <TextView
115
+ android:id="@+id/cancelBtn"
116
+ android:layout_width="wrap_content"
117
+ android:layout_height="match_parent"
118
+ android:layout_gravity="left"
119
+ android:gravity="center"
120
+ android:padding="10dp"
121
+ android:text="@string/cancel"
122
+ android:textColor="@android:color/white"
123
+ android:textSize="16dp" />
124
+
125
+ <ImageView
126
+ android:id="@+id/icon_video_play"
127
+ android:layout_width="wrap_content"
128
+ android:layout_height="match_parent"
129
+ android:layout_gravity="center"
130
+ android:padding="12dp"
131
+ android:src="@drawable/ic_video_play_black"
132
+ />
133
+
134
+ <TextView
135
+ android:id="@+id/saveBtn"
136
+ android:layout_width="wrap_content"
137
+ android:layout_height="match_parent"
138
+ android:layout_gravity="right"
139
+ android:gravity="center"
140
+ android:padding="10dp"
141
+ android:text="@string/save"
142
+ android:textColor="#2196F3"
143
+ android:textSize="16dp" />
144
+
145
+ </FrameLayout>
146
+
147
+ </RelativeLayout>
148
+ </RelativeLayout>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <color name="colorPrimary">#3F51B5</color>
4
+ <color name="colorPrimaryDark">#303F9F</color>
5
+ <color name="colorAccent">#FF4081</color>
6
+
7
+ <color name="white">#ffffffff</color>
8
+ <color name="red">#aacc0000</color>
9
+ <color name="background_video_color">#2f3031</color>
10
+ <color name="background_progress_color">#6C6D6D</color>
11
+ <color name="progress_color">#aacc0000</color>
12
+ <color name="line_color">#FF15FF00</color>
13
+ <color name="shadow_color">#7F000000</color>
14
+ <color name="line_button">#565758</color>
15
+ <color name="black_translucent">#50000000</color>
16
+ <color name="top_bottom">#42BAF8</color>
17
+ </resources>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources xmlns:tools="http://schemas.android.com/tools"
3
+ tools:ignore="MissingTranslation">
4
+ <string name="app_name">Video Trim</string>
5
+ <string name="trimmed_done">video trim completed!</string>
6
+ <!-- <string name="trimming">Trimming video...</string>-->
7
+ <string name="compressing">Compressing video...</string>
8
+ <string name="compressed_done">video compression completed!</string>
9
+ <string name="open_permission">Open permission</string>
10
+ <string name="video_record_des">To record a video, you need to give the camera and microphone access.</string>
11
+ <string name="recording">RECORD</string>
12
+ <string name="cancel">Cancel</string>
13
+ <string name="save">Save</string>
14
+ </resources>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <paths>
3
+ <cache-path name="cacheDir" path="." />
4
+ </paths>
@@ -0,0 +1,16 @@
1
+ //
2
+ // RNCameraPermission.h
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 14/03/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+ #import <React/RCTBridgeModule.h>
10
+ #import <AVFoundation/AVFoundation.h>
11
+
12
+ @interface RCT_EXTERN_MODULE(RNCameraPermission, NSObject)
13
+
14
+ // RCT_EXTERN_METHOD(checkCameraPermissionStatus:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
15
+
16
+ @end
@@ -0,0 +1,46 @@
1
+ //
2
+ // RNCameraPermission.m
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 14/03/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+ #import "RNCameraPermission.h"
10
+
11
+ @implementation RNCameraPermission
12
+
13
+ // RCT_EXPORT_MODULE();
14
+
15
+ RCT_EXPORT_METHOD(checkCameraPermissionStatus:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
16
+ {
17
+ __block NSString *status; // Add __block specifier here
18
+
19
+ // Check camera permission status
20
+ AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
21
+
22
+ switch (authorizationStatus) {
23
+ case AVAuthorizationStatusAuthorized:
24
+ status = @"granted";
25
+ resolve(status);
26
+ break;
27
+ case AVAuthorizationStatusDenied:
28
+ case AVAuthorizationStatusRestricted:
29
+ status = @"denied";
30
+ resolve(status);
31
+ break;
32
+ case AVAuthorizationStatusNotDetermined:
33
+ // Request camera permission
34
+ [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
35
+ if (granted) {
36
+ status = @"granted";
37
+ } else {
38
+ status = @"denied";
39
+ }
40
+ resolve(status);
41
+ }];
42
+ break;
43
+ }
44
+ }
45
+
46
+ @end
@@ -0,0 +1,14 @@
1
+ //
2
+ // DeviceUID.h
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 29/02/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+
11
+ @interface ShakebugSDKDeviceUID : NSObject
12
+ + (NSString *)syncUid;
13
+ + (NSString *)uid;
14
+ @end
@@ -0,0 +1,202 @@
1
+ //
2
+ // DeviceUID.m
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 29/02/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+ #import "DeviceUID.h"
10
+
11
+ @import UIKit;
12
+
13
+ @interface ShakebugSDKDeviceUID ()
14
+
15
+ @property(nonatomic, strong, readonly) NSString *uid;
16
+
17
+ @end
18
+
19
+ NSString * const ShakebugSDKUIDKey = @"deviceUID";
20
+
21
+ @implementation ShakebugSDKDeviceUID
22
+
23
+ @synthesize uid = _uid;
24
+
25
+ #pragma mark - Public methods
26
+
27
+ + (NSString *)uid {
28
+ return [[[ShakebugSDKDeviceUID alloc] init] uid];
29
+ }
30
+
31
+ + (NSString *)syncUid {
32
+ return [[[ShakebugSDKDeviceUID alloc] init] syncUid];
33
+ }
34
+
35
+ #pragma mark - Instance methods
36
+
37
+ - (id)init:(NSString *)key {
38
+ self = [super init];
39
+ if (self) {
40
+ _uid = nil;
41
+ }
42
+ return self;
43
+ }
44
+
45
+ /*! Returns the Device UID.
46
+ The UID is obtained in a chain of fallbacks:
47
+ - Keychain
48
+ - NSUserDefaults
49
+ - Apple IFV (Identifier for Vendor)
50
+ - Generate a random UUID if everything else is unavailable
51
+ At last, the UID is persisted if needed to.
52
+ */
53
+ - (NSString *)uid {
54
+ if (!_uid) _uid = [[self class] valueForKeychainKey:ShakebugSDKUIDKey service:ShakebugSDKUIDKey];
55
+ if (!_uid) _uid = [[self class] valueForUserDefaultsKey:ShakebugSDKUIDKey];
56
+ if (!_uid) _uid = [[self class] appleIFV];
57
+ if (!_uid) _uid = [[self class] randomUUID];
58
+ [self saveIfNeed];
59
+ return _uid;
60
+ }
61
+
62
+ /*! Persist Apple IFV (Identifier for Vendor) or random UUID as Device UID.
63
+ */
64
+ - (NSString *)syncUid {
65
+ _uid = [[self class] appleIFV];
66
+ if (!_uid) _uid = [[self class] randomUUID];
67
+ [self save];
68
+ return _uid;
69
+ }
70
+
71
+ /*! Persist UID to NSUserDefaults and Keychain
72
+ */
73
+ - (void)save {
74
+ [ShakebugSDKDeviceUID setValue:_uid forUserDefaultsKey:ShakebugSDKUIDKey];
75
+ [ShakebugSDKDeviceUID updateValue:_uid forKeychainKey:ShakebugSDKUIDKey inService:ShakebugSDKUIDKey];
76
+ }
77
+
78
+ /*! Persist UID to NSUserDefaults and Keychain, if not yet saved
79
+ */
80
+ - (void)saveIfNeed {
81
+ if (![ShakebugSDKDeviceUID valueForUserDefaultsKey:ShakebugSDKUIDKey]) {
82
+ [ShakebugSDKDeviceUID setValue:_uid forUserDefaultsKey:ShakebugSDKUIDKey];
83
+ }
84
+ if (![ShakebugSDKDeviceUID valueForKeychainKey:ShakebugSDKUIDKey service:ShakebugSDKUIDKey]) {
85
+ [ShakebugSDKDeviceUID setValue:_uid forKeychainKey:ShakebugSDKUIDKey inService:ShakebugSDKUIDKey];
86
+ }
87
+ }
88
+
89
+ #pragma mark - Keychain methods
90
+
91
+ /*! Create as generic NSDictionary to be used to query and update Keychain items.
92
+ * param1
93
+ * param2
94
+ */
95
+ + (NSMutableDictionary *)keychainItemForKey:(NSString *)key service:(NSString *)service {
96
+ NSMutableDictionary *keychainItem = [[NSMutableDictionary alloc] init];
97
+ keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;
98
+ keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAfterFirstUnlock;
99
+ keychainItem[(__bridge id)kSecAttrAccount] = key;
100
+ keychainItem[(__bridge id)kSecAttrService] = service;
101
+ return keychainItem;
102
+ }
103
+
104
+ /*! Sets
105
+ * param1
106
+ * param2
107
+ */
108
+ + (OSStatus)setValue:(NSString *)value forKeychainKey:(NSString *)key inService:(NSString *)service {
109
+ NSMutableDictionary *keychainItem = [[self class] keychainItemForKey:key service:service];
110
+ keychainItem[(__bridge id)kSecValueData] = [value dataUsingEncoding:NSUTF8StringEncoding];
111
+ OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
112
+
113
+ if (status == errSecDuplicateItem) {
114
+ [ShakebugSDKDeviceUID deleteValue:key inService:service];
115
+ status = SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
116
+ }
117
+ return status;
118
+ }
119
+
120
+ /*! Updates
121
+ * param1
122
+ * param2
123
+ */
124
+ + (OSStatus)updateValue:(NSString *)value forKeychainKey:(NSString *)key inService:(NSString *)service {
125
+ NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
126
+ (__bridge id)kSecClassGenericPassword, kSecClass,
127
+ key, kSecAttrAccount,
128
+ service, kSecAttrService,
129
+ nil];
130
+
131
+ NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObjectsAndKeys:
132
+ [value dataUsingEncoding:NSUTF8StringEncoding], kSecValueData,
133
+ nil];
134
+
135
+ return SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributesToUpdate);
136
+ }
137
+
138
+ + (OSStatus)deleteValue:(NSString *)key inService:(NSString *)service {
139
+ NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
140
+ (__bridge id)kSecClassGenericPassword, kSecClass,
141
+ key, kSecAttrAccount,
142
+ service, kSecAttrService,
143
+ nil];
144
+
145
+ OSStatus status= SecItemDelete((__bridge CFDictionaryRef)query);
146
+ return status;
147
+
148
+ }
149
+
150
+
151
+ + (NSString *)valueForKeychainKey:(NSString *)key service:(NSString *)service {
152
+ OSStatus status;
153
+ NSMutableDictionary *keychainItem = [[self class] keychainItemForKey:key service:service];
154
+ keychainItem[(__bridge id)kSecReturnData] = (__bridge id)kCFBooleanTrue;
155
+ keychainItem[(__bridge id)kSecReturnAttributes] = (__bridge id)kCFBooleanTrue;
156
+ CFDictionaryRef result = nil;
157
+ status = SecItemCopyMatching((__bridge CFDictionaryRef)keychainItem, (CFTypeRef *)&result);
158
+ if (status != noErr) {
159
+ return nil;
160
+ }
161
+ NSDictionary *resultDict = (__bridge_transfer NSDictionary *)result;
162
+ NSData *data = resultDict[(__bridge id)kSecValueData];
163
+ if (!data) {
164
+ return nil;
165
+ }
166
+ return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
167
+ }
168
+
169
+ #pragma mark - NSUserDefaults methods
170
+
171
+ + (BOOL)setValue:(NSString *)value forUserDefaultsKey:(NSString *)key {
172
+ [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
173
+ return [[NSUserDefaults standardUserDefaults] synchronize];
174
+ }
175
+
176
+ + (NSString *)valueForUserDefaultsKey:(NSString *)key {
177
+ return [[NSUserDefaults standardUserDefaults] objectForKey:key];
178
+ }
179
+
180
+ #pragma mark - UID Generation methods
181
+
182
+ + (NSString *)appleIFV {
183
+ if(NSClassFromString(@"UIDevice") && [UIDevice instancesRespondToSelector:@selector(identifierForVendor)]) {
184
+ // only available in iOS >= 6.0
185
+ return [[UIDevice currentDevice].identifierForVendor UUIDString];
186
+ }
187
+ return nil;
188
+ }
189
+
190
+ + (NSString *)randomUUID {
191
+ if(NSClassFromString(@"NSUUID")) {
192
+ return [[NSUUID UUID] UUIDString];
193
+ }
194
+ CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
195
+ CFStringRef cfuuid = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
196
+ CFRelease(uuidRef);
197
+ NSString *uuid = [((__bridge NSString *) cfuuid) copy];
198
+ CFRelease(cfuuid);
199
+ return uuid;
200
+ }
201
+
202
+ @end
@@ -0,0 +1,41 @@
1
+ //
2
+ // EnvironmentUtil.h
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 29/02/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+
10
+
11
+ #import <Foundation/Foundation.h>
12
+
13
+ /**
14
+ * App environment
15
+ */
16
+ typedef NS_ENUM(NSInteger, MSACEnvironment) {
17
+
18
+ /**
19
+ * App has been downloaded from the AppStore.
20
+ */
21
+ MSACEnvironmentAppStore = 0,
22
+
23
+ /**
24
+ * App has been downloaded from TestFlight.
25
+ */
26
+ MSACEnvironmentTestFlight = 1,
27
+
28
+ /**
29
+ * App has been installed by some other mechanism.
30
+ * This could be Ad-Hoc, Enterprise, etc.
31
+ */
32
+ MSACEnvironmentOther = 2
33
+ };
34
+
35
+ #define ShakebugSDKEnvironmentValues [NSArray arrayWithObjects: @"AppStore", @"TestFlight", @"Other", nil]
36
+
37
+ @interface ShakebugSDKEnvironmentUtil : NSObject
38
+
39
+ + (MSACEnvironment)currentAppEnvironment;
40
+
41
+ @end
@@ -0,0 +1,56 @@
1
+ //
2
+ // EnvironmentUtil.m
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 29/02/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+
10
+ #import "EnvironmentUtil.h"
11
+
12
+ @implementation ShakebugSDKEnvironmentUtil
13
+
14
+ + (MSACEnvironment)currentAppEnvironment {
15
+ #if TARGET_OS_SIMULATOR || TARGET_OS_OSX || TARGET_OS_MACCATALYST
16
+ return MSACEnvironmentOther;
17
+ #else
18
+
19
+ // MobilePovision profiles are a clear indicator for Ad-Hoc distribution.
20
+ if ([self hasEmbeddedMobileProvision]) {
21
+ return MSACEnvironmentOther;
22
+ }
23
+
24
+ /**
25
+ * TestFlight is only supported from iOS 8 onwards and as our deployment target is iOS 8, we don't have to do any checks for
26
+ * floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1).
27
+ */
28
+ if ([self isAppStoreReceiptSandbox]) {
29
+ return MSACEnvironmentTestFlight;
30
+ }
31
+
32
+ return MSACEnvironmentAppStore;
33
+ #endif
34
+ }
35
+
36
+ + (BOOL)hasEmbeddedMobileProvision {
37
+ BOOL hasEmbeddedMobileProvision = !![[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];
38
+ return hasEmbeddedMobileProvision;
39
+ }
40
+
41
+ + (BOOL)isAppStoreReceiptSandbox {
42
+ #if TARGET_OS_SIMULATOR
43
+ return NO;
44
+ #else
45
+ if (![NSBundle.mainBundle respondsToSelector:@selector(appStoreReceiptURL)]) {
46
+ return NO;
47
+ }
48
+ NSURL *appStoreReceiptURL = NSBundle.mainBundle.appStoreReceiptURL;
49
+ NSString *appStoreReceiptLastComponent = appStoreReceiptURL.lastPathComponent;
50
+
51
+ BOOL isSandboxReceipt = [appStoreReceiptLastComponent isEqualToString:@"sandboxReceipt"];
52
+ return isSandboxReceipt;
53
+ #endif
54
+ }
55
+
56
+ @end
@@ -0,0 +1,22 @@
1
+ //
2
+ // RNDeviceInfo.h
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 29/02/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+
10
+ #import <UIKit/UIKit.h>
11
+ #import <AVFoundation/AVFoundation.h>
12
+ #import <sys/utsname.h>
13
+ #import <React/RCTBridgeModule.h>
14
+ #import <React/RCTEventEmitter.h>
15
+ #import <React/RCTLog.h>
16
+
17
+ @interface ShakebugSDKRNDeviceInfo : RCTEventEmitter <RCTBridgeModule>
18
+
19
+ @property (nonatomic) float lowBatteryThreshold;
20
+
21
+ @end
22
+