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,918 @@
1
+ //
2
+ // RNDeviceInfo.m
3
+ // Shakebug
4
+ //
5
+ // Created by ideveloper2 on 29/02/24.
6
+ // Copyright © 2024 Facebook. All rights reserved.
7
+ //
8
+
9
+ //
10
+ // RNDeviceInfo.m
11
+ // Learnium
12
+ //
13
+ // Created by Rebecca Hughes on 03/08/2015.
14
+ // Copyright © 2015 Learnium Limited. All rights reserved.
15
+ //
16
+
17
+ #include <ifaddrs.h>
18
+ #include <arpa/inet.h>
19
+ #import <mach/mach.h>
20
+ #import <mach-o/arch.h>
21
+ #import <CoreLocation/CoreLocation.h>
22
+ #import <React/RCTUtils.h>
23
+ #import "RNDeviceInfo.h"
24
+ #import "DeviceUID.h"
25
+ #import <DeviceCheck/DeviceCheck.h>
26
+ #import "EnvironmentUtil.h"
27
+
28
+ #if !(TARGET_OS_TV)
29
+ #import <WebKit/WebKit.h>
30
+ #import <LocalAuthentication/LocalAuthentication.h>
31
+ #endif
32
+
33
+ typedef NS_ENUM(NSInteger, DeviceType) {
34
+ DeviceTypeHandset,
35
+ DeviceTypeTablet,
36
+ DeviceTypeTv,
37
+ DeviceTypeDesktop,
38
+ DeviceTypeHeadset,
39
+ DeviceTypeUnknown
40
+ };
41
+
42
+ #define DeviceTypeValues [NSArray arrayWithObjects: @"Handset", @"Tablet", @"Tv", @"Desktop", @"Headset", @"unknown", nil]
43
+
44
+ #if (!(TARGET_OS_TV || TARGET_OS_VISION))
45
+ @import CoreTelephony;
46
+ #endif
47
+
48
+ #if !TARGET_OS_TV
49
+ @import Darwin.sys.sysctl;
50
+ #endif
51
+
52
+ @implementation ShakebugSDKRNDeviceInfo
53
+ {
54
+ bool hasListeners;
55
+ }
56
+
57
+ RCT_EXPORT_MODULE();
58
+
59
+ + (BOOL)requiresMainQueueSetup
60
+ {
61
+ return NO;
62
+ }
63
+
64
+ - (NSArray<NSString *> *)supportedEvents
65
+ {
66
+ return @[@"RNDeviceInfo_batteryLevelDidChange", @"RNDeviceInfo_batteryLevelIsLow", @"RNDeviceInfo_powerStateDidChange", @"RNDeviceInfo_headphoneConnectionDidChange", @"RNDeviceInfo_brightnessDidChange"];
67
+ }
68
+
69
+ - (NSDictionary *)constantsToExport {
70
+ return @{
71
+ @"deviceId": [self getDeviceId],
72
+ @"bundleId": [self getBundleId],
73
+ @"systemName": [self getSystemName],
74
+ @"systemVersion": [self getSystemVersion],
75
+ @"appVersion": [self getAppVersion],
76
+ @"buildNumber": [self getBuildNumber],
77
+ @"isTablet": @([self isTablet]),
78
+ @"appName": [self getAppName],
79
+ @"brand": @"Apple",
80
+ @"model": [self getModel],
81
+ @"deviceType": [self getDeviceTypeName],
82
+ @"isDisplayZoomed": @([self isDisplayZoomed]),
83
+ };
84
+ }
85
+
86
+ - (id)init
87
+ {
88
+ if ((self = [super init])) {
89
+ #if !TARGET_OS_TV
90
+ _lowBatteryThreshold = 0.20;
91
+ [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
92
+
93
+ [[NSNotificationCenter defaultCenter] addObserver:self
94
+ selector:@selector(batteryLevelDidChange:)
95
+ name:UIDeviceBatteryLevelDidChangeNotification
96
+ object: nil];
97
+ [[NSNotificationCenter defaultCenter] addObserver:self
98
+ selector:@selector(powerStateDidChange:)
99
+ name:UIDeviceBatteryStateDidChangeNotification
100
+ object: nil];
101
+ [[NSNotificationCenter defaultCenter] addObserver:self
102
+ selector:@selector(powerStateDidChange:)
103
+ name:NSProcessInfoPowerStateDidChangeNotification
104
+ object: nil];
105
+ [[NSNotificationCenter defaultCenter] addObserver:self
106
+ selector:@selector(headphoneConnectionDidChange:)
107
+ name:AVAudioSessionRouteChangeNotification
108
+ object: [AVAudioSession sharedInstance]];
109
+ #if !TARGET_OS_VISION
110
+ [[NSNotificationCenter defaultCenter] addObserver:self
111
+ selector:@selector(brightnessDidChange:)
112
+ name:UIScreenBrightnessDidChangeNotification
113
+ object: nil];
114
+ #endif
115
+ #endif
116
+ }
117
+
118
+ return self;
119
+ }
120
+
121
+ - (void)startObserving {
122
+ hasListeners = YES;
123
+ }
124
+
125
+ - (void)stopObserving {
126
+ hasListeners = NO;
127
+ }
128
+
129
+ - (DeviceType) getDeviceType
130
+ {
131
+ switch ([[UIDevice currentDevice] userInterfaceIdiom]) {
132
+ case UIUserInterfaceIdiomPhone: return DeviceTypeHandset;
133
+ case UIUserInterfaceIdiomPad:
134
+ if (TARGET_OS_MACCATALYST) {
135
+ return DeviceTypeDesktop;
136
+ }
137
+ if (@available(iOS 14.0, *)) {
138
+ if ([NSProcessInfo processInfo].isiOSAppOnMac) {
139
+ return DeviceTypeDesktop;
140
+ }
141
+ }
142
+ return DeviceTypeTablet;
143
+ case UIUserInterfaceIdiomTV: return DeviceTypeTv;
144
+ case UIUserInterfaceIdiomMac: return DeviceTypeDesktop;
145
+ #if TARGET_OS_VISION
146
+ case UIUserInterfaceIdiomVision: return DeviceTypeHeadset;
147
+ #endif
148
+ default: return DeviceTypeUnknown;
149
+ }
150
+ }
151
+
152
+ - (NSDictionary *) getStorageDictionary {
153
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
154
+ return [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: nil];
155
+ }
156
+
157
+ - (NSString *) getSystemName {
158
+ UIDevice *currentDevice = [UIDevice currentDevice];
159
+ return currentDevice.systemName;
160
+ }
161
+
162
+ - (NSString *) getSystemVersion {
163
+ UIDevice *currentDevice = [UIDevice currentDevice];
164
+ return currentDevice.systemVersion;
165
+ }
166
+
167
+ - (NSString *) getDeviceName {
168
+ UIDevice *currentDevice = [UIDevice currentDevice];
169
+ return currentDevice.name;
170
+ }
171
+
172
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDeviceNameSync) {
173
+ return self.getDeviceName;
174
+ }
175
+
176
+ RCT_EXPORT_METHOD(getDeviceName:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
177
+ resolve(self.getDeviceName);
178
+ }
179
+
180
+ - (BOOL) isDisplayZoomed {
181
+ #if !TARGET_OS_VISION
182
+ return [UIScreen mainScreen].scale != [UIScreen mainScreen].nativeScale;
183
+ #else
184
+ return NO;
185
+ #endif
186
+ }
187
+
188
+ - (NSString *) getAppName {
189
+ NSString *displayName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
190
+ NSString *bundleName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
191
+ return displayName ? displayName : bundleName;
192
+ }
193
+
194
+ - (NSString *) getBundleId {
195
+ return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"];
196
+ }
197
+
198
+ - (NSString *) getAppVersion {
199
+ return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
200
+ }
201
+
202
+ - (NSString *) getBuildNumber {
203
+ return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
204
+ }
205
+
206
+ - (NSDictionary *) getDeviceNamesByCode {
207
+ return @{
208
+ @"iPod1,1": @"iPod Touch", // (Original)
209
+ @"iPod2,1": @"iPod Touch", // (Second Generation)
210
+ @"iPod3,1": @"iPod Touch", // (Third Generation)
211
+ @"iPod4,1": @"iPod Touch", // (Fourth Generation)
212
+ @"iPod5,1": @"iPod Touch", // (Fifth Generation)
213
+ @"iPod7,1": @"iPod Touch", // (Sixth Generation)
214
+ @"iPod9,1": @"iPod Touch", // (Seventh Generation)
215
+ @"iPhone1,1": @"iPhone", // (Original)
216
+ @"iPhone1,2": @"iPhone 3G", // (3G)
217
+ @"iPhone2,1": @"iPhone 3GS", // (3GS)
218
+ @"iPad1,1": @"iPad", // (Original)
219
+ @"iPad2,1": @"iPad 2", //
220
+ @"iPad2,2": @"iPad 2", //
221
+ @"iPad2,3": @"iPad 2", //
222
+ @"iPad2,4": @"iPad 2", //
223
+ @"iPad3,1": @"iPad", // (3rd Generation)
224
+ @"iPad3,2": @"iPad", // (3rd Generation)
225
+ @"iPad3,3": @"iPad", // (3rd Generation)
226
+ @"iPhone3,1": @"iPhone 4", // (GSM)
227
+ @"iPhone3,2": @"iPhone 4", // iPhone 4
228
+ @"iPhone3,3": @"iPhone 4", // (CDMA/Verizon/Sprint)
229
+ @"iPhone4,1": @"iPhone 4S", //
230
+ @"iPhone5,1": @"iPhone 5", // (model A1428, AT&T/Canada)
231
+ @"iPhone5,2": @"iPhone 5", // (model A1429, everything else)
232
+ @"iPad3,4": @"iPad", // (4th Generation)
233
+ @"iPad3,5": @"iPad", // (4th Generation)
234
+ @"iPad3,6": @"iPad", // (4th Generation)
235
+ @"iPad2,5": @"iPad Mini", // (Original)
236
+ @"iPad2,6": @"iPad Mini", // (Original)
237
+ @"iPad2,7": @"iPad Mini", // (Original)
238
+ @"iPhone5,3": @"iPhone 5c", // (model A1456, A1532 | GSM)
239
+ @"iPhone5,4": @"iPhone 5c", // (model A1507, A1516, A1526 (China), A1529 | Global)
240
+ @"iPhone6,1": @"iPhone 5s", // (model A1433, A1533 | GSM)
241
+ @"iPhone6,2": @"iPhone 5s", // (model A1457, A1518, A1528 (China), A1530 | Global)
242
+ @"iPhone7,1": @"iPhone 6 Plus", //
243
+ @"iPhone7,2": @"iPhone 6", //
244
+ @"iPhone8,1": @"iPhone 6s", //
245
+ @"iPhone8,2": @"iPhone 6s Plus", //
246
+ @"iPhone8,4": @"iPhone SE", //
247
+ @"iPhone9,1": @"iPhone 7", // (model A1660 | CDMA)
248
+ @"iPhone9,3": @"iPhone 7", // (model A1778 | Global)
249
+ @"iPhone9,2": @"iPhone 7 Plus", // (model A1661 | CDMA)
250
+ @"iPhone9,4": @"iPhone 7 Plus", // (model A1784 | Global)
251
+ @"iPhone10,3": @"iPhone X", // (model A1865, A1902)
252
+ @"iPhone10,6": @"iPhone X", // (model A1901)
253
+ @"iPhone10,1": @"iPhone 8", // (model A1863, A1906, A1907)
254
+ @"iPhone10,4": @"iPhone 8", // (model A1905)
255
+ @"iPhone10,2": @"iPhone 8 Plus", // (model A1864, A1898, A1899)
256
+ @"iPhone10,5": @"iPhone 8 Plus", // (model A1897)
257
+ @"iPhone11,2": @"iPhone XS", // (model A2097, A2098)
258
+ @"iPhone11,4": @"iPhone XS Max", // (model A1921, A2103)
259
+ @"iPhone11,6": @"iPhone XS Max", // (model A2104)
260
+ @"iPhone11,8": @"iPhone XR", // (model A1882, A1719, A2105)
261
+ @"iPhone12,1": @"iPhone 11",
262
+ @"iPhone12,3": @"iPhone 11 Pro",
263
+ @"iPhone12,5": @"iPhone 11 Pro Max",
264
+ @"iPhone12,8": @"iPhone SE", // (2nd Generation iPhone SE),
265
+ @"iPhone13,1": @"iPhone 12 mini",
266
+ @"iPhone13,2": @"iPhone 12",
267
+ @"iPhone13,3": @"iPhone 12 Pro",
268
+ @"iPhone13,4": @"iPhone 12 Pro Max",
269
+ @"iPhone14,4": @"iPhone 13 mini",
270
+ @"iPhone14,5": @"iPhone 13",
271
+ @"iPhone14,2": @"iPhone 13 Pro",
272
+ @"iPhone14,3": @"iPhone 13 Pro Max",
273
+ @"iPhone14,6": @"iPhone SE", // (3nd Generation iPhone SE),
274
+ @"iPhone14,7": @"iPhone 14",
275
+ @"iPhone14,8": @"iPhone 14 Plus",
276
+ @"iPhone15,2": @"iPhone 14 Pro",
277
+ @"iPhone15,3": @"iPhone 14 Pro Max",
278
+ @"iPhone15,4": @"iPhone 15",
279
+ @"iPhone15,5": @"iPhone 15 Plus",
280
+ @"iPhone16,1": @"iPhone 15 Pro",
281
+ @"iPhone16,2": @"iPhone 15 Pro Max",
282
+ @"iPad4,1": @"iPad Air", // 5th Generation iPad (iPad Air) - Wifi
283
+ @"iPad4,2": @"iPad Air", // 5th Generation iPad (iPad Air) - Cellular
284
+ @"iPad4,3": @"iPad Air", // 5th Generation iPad (iPad Air)
285
+ @"iPad4,4": @"iPad Mini 2", // (2nd Generation iPad Mini - Wifi)
286
+ @"iPad4,5": @"iPad Mini 2", // (2nd Generation iPad Mini - Cellular)
287
+ @"iPad4,6": @"iPad Mini 2", // (2nd Generation iPad Mini)
288
+ @"iPad4,7": @"iPad Mini 3", // (3rd Generation iPad Mini)
289
+ @"iPad4,8": @"iPad Mini 3", // (3rd Generation iPad Mini)
290
+ @"iPad4,9": @"iPad Mini 3", // (3rd Generation iPad Mini)
291
+ @"iPad5,1": @"iPad Mini 4", // (4th Generation iPad Mini)
292
+ @"iPad5,2": @"iPad Mini 4", // (4th Generation iPad Mini)
293
+ @"iPad5,3": @"iPad Air 2", // 6th Generation iPad (iPad Air 2)
294
+ @"iPad5,4": @"iPad Air 2", // 6th Generation iPad (iPad Air 2)
295
+ @"iPad6,3": @"iPad Pro 9.7-inch", // iPad Pro 9.7-inch
296
+ @"iPad6,4": @"iPad Pro 9.7-inch", // iPad Pro 9.7-inch
297
+ @"iPad6,7": @"iPad Pro 12.9-inch", // iPad Pro 12.9-inch
298
+ @"iPad6,8": @"iPad Pro 12.9-inch", // iPad Pro 12.9-inch
299
+ @"iPad6,11": @"iPad (5th generation)", // Apple iPad 9.7 inch (5th generation) - WiFi
300
+ @"iPad6,12": @"iPad (5th generation)", // Apple iPad 9.7 inch (5th generation) - WiFi + cellular
301
+ @"iPad7,1": @"iPad Pro 12.9-inch", // 2nd Generation iPad Pro 12.5-inch - Wifi
302
+ @"iPad7,2": @"iPad Pro 12.9-inch", // 2nd Generation iPad Pro 12.5-inch - Cellular
303
+ @"iPad7,3": @"iPad Pro 10.5-inch", // iPad Pro 10.5-inch - Wifi
304
+ @"iPad7,4": @"iPad Pro 10.5-inch", // iPad Pro 10.5-inch - Cellular
305
+ @"iPad7,5": @"iPad (6th generation)", // iPad (6th generation) - Wifi
306
+ @"iPad7,6": @"iPad (6th generation)", // iPad (6th generation) - Cellular
307
+ @"iPad7,11": @"iPad (7th generation)", // iPad 10.2 inch (7th generation) - Wifi
308
+ @"iPad7,12": @"iPad (7th generation)", // iPad 10.2 inch (7th generation) - Wifi + cellular
309
+ @"iPad8,1": @"iPad Pro 11-inch (3rd generation)", // iPad Pro 11 inch (3rd generation) - Wifi
310
+ @"iPad8,2": @"iPad Pro 11-inch (3rd generation)", // iPad Pro 11 inch (3rd generation) - 1TB - Wifi
311
+ @"iPad8,3": @"iPad Pro 11-inch (3rd generation)", // iPad Pro 11 inch (3rd generation) - Wifi + cellular
312
+ @"iPad8,4": @"iPad Pro 11-inch (3rd generation)", // iPad Pro 11 inch (3rd generation) - 1TB - Wifi + cellular
313
+ @"iPad8,5": @"iPad Pro 12.9-inch (3rd generation)", // iPad Pro 12.9 inch (3rd generation) - Wifi
314
+ @"iPad8,6": @"iPad Pro 12.9-inch (3rd generation)", // iPad Pro 12.9 inch (3rd generation) - 1TB - Wifi
315
+ @"iPad8,7": @"iPad Pro 12.9-inch (3rd generation)", // iPad Pro 12.9 inch (3rd generation) - Wifi + cellular
316
+ @"iPad8,8": @"iPad Pro 12.9-inch (3rd generation)", // iPad Pro 12.9 inch (3rd generation) - 1TB - Wifi + cellular
317
+ @"iPad11,1": @"iPad Mini 5", // (5th Generation iPad Mini)
318
+ @"iPad11,2": @"iPad Mini 5", // (5th Generation iPad Mini)
319
+ @"iPad11,3": @"iPad Air (3rd generation)",
320
+ @"iPad11,4": @"iPad Air (3rd generation)",
321
+ @"iPad13,1": @"iPad Air (4th generation)",
322
+ @"iPad13,2": @"iPad Air (4th generation)",
323
+ @"AppleTV2,1": @"Apple TV", // Apple TV (2nd Generation)
324
+ @"AppleTV3,1": @"Apple TV", // Apple TV (3rd Generation)
325
+ @"AppleTV3,2": @"Apple TV", // Apple TV (3rd Generation - Rev A)
326
+ @"AppleTV5,3": @"Apple TV", // Apple TV (4th Generation)
327
+ @"AppleTV6,2": @"Apple TV 4K", // Apple TV 4K
328
+ @"RealityDevice14,1": @"Apple Vision Pro" // Apple Vision Pro
329
+ };
330
+ }
331
+
332
+ - (NSString *) getModel {
333
+ NSString* deviceId = [self getDeviceId];
334
+ NSDictionary* deviceNamesByCode = [self getDeviceNamesByCode];
335
+ NSString* deviceName =[deviceNamesByCode valueForKey:deviceId];
336
+
337
+ // Return the real device name if we have it
338
+ if (deviceName) {
339
+ return deviceName;
340
+ }
341
+
342
+ // If we don't have the real device name, try a generic
343
+ if ([deviceId hasPrefix:@"iPod"]) {
344
+ return @"iPod Touch";
345
+ } else if ([deviceId hasPrefix:@"iPad"]) {
346
+ return @"iPad";
347
+ } else if ([deviceId hasPrefix:@"iPhone"]) {
348
+ return @"iPhone";
349
+ } else if ([deviceId hasPrefix:@"AppleTV"]) {
350
+ return @"Apple TV";
351
+ } else if ([deviceId hasPrefix:@"RealityDevice"]) {
352
+ return @"Apple Vision";
353
+ }
354
+
355
+ // If we could not even get a generic, it's unknown
356
+ return @"unknown";
357
+ }
358
+
359
+ - (NSString *) getCarrier {
360
+ #if (TARGET_OS_TV || TARGET_OS_MACCATALYST || TARGET_OS_VISION)
361
+ return @"unknown";
362
+ #else
363
+ CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
364
+ CTCarrier *carrier = [netinfo subscriberCellularProvider];
365
+ if (carrier.carrierName != nil) {
366
+ return carrier.carrierName;
367
+ }
368
+ return @"unknown";
369
+ #endif
370
+ }
371
+
372
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getCarrierSync) {
373
+ return self.getCarrier;
374
+ }
375
+
376
+ RCT_EXPORT_METHOD(getCarrier:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
377
+ resolve(self.getCarrier);
378
+ }
379
+
380
+ - (NSString *) getBuildId {
381
+ #if TARGET_OS_TV
382
+ return @"unknown";
383
+ #else
384
+ size_t bufferSize = 64;
385
+ NSMutableData *buffer = [[NSMutableData alloc] initWithLength:bufferSize];
386
+ int status = sysctlbyname("kern.osversion", buffer.mutableBytes, &bufferSize, NULL, 0);
387
+ if (status != 0) {
388
+ return @"unknown";
389
+ }
390
+ NSString* buildId = [[NSString alloc] initWithCString:buffer.mutableBytes encoding:NSUTF8StringEncoding];
391
+ return buildId;
392
+ #endif
393
+ }
394
+
395
+ RCT_EXPORT_METHOD(getBuildId:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
396
+ resolve(self.getBuildId);
397
+ }
398
+
399
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getBuildIdSync) {
400
+ return self.getBuildId;
401
+ }
402
+
403
+ - (NSString *) uniqueId {
404
+ return [ShakebugSDKDeviceUID uid];
405
+ }
406
+
407
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getUniqueIdSync) {
408
+ return self.uniqueId;
409
+ }
410
+
411
+ RCT_EXPORT_METHOD(getUniqueId:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
412
+ resolve(self.uniqueId);
413
+ }
414
+
415
+ RCT_EXPORT_METHOD(syncUniqueId:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
416
+ resolve([ShakebugSDKDeviceUID syncUid]);
417
+ }
418
+
419
+ - (NSString *) getDeviceId {
420
+ struct utsname systemInfo;
421
+ uname(&systemInfo);
422
+ NSString* deviceId = [NSString stringWithCString:systemInfo.machine
423
+ encoding:NSUTF8StringEncoding];
424
+ #if TARGET_IPHONE_SIMULATOR
425
+ deviceId = [NSString stringWithFormat:@"%s", getenv("SIMULATOR_MODEL_IDENTIFIER")];
426
+ #endif
427
+ return deviceId;
428
+ }
429
+
430
+
431
+ - (BOOL) isEmulator {
432
+ #if TARGET_IPHONE_SIMULATOR
433
+ return YES;
434
+ #else
435
+ return NO;
436
+ #endif
437
+ }
438
+
439
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isEmulatorSync) {
440
+ return @(self.isEmulator);
441
+ }
442
+
443
+ RCT_EXPORT_METHOD(isEmulator:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
444
+ resolve(@(self.isEmulator));
445
+ }
446
+
447
+ - (BOOL) isTablet {
448
+ if ([self getDeviceType] == DeviceTypeTablet) {
449
+ return YES;
450
+ } else {
451
+ return NO;
452
+ }
453
+ }
454
+
455
+ RCT_EXPORT_METHOD(getDeviceToken:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
456
+ if (@available(iOS 11.0, *)) {
457
+ if (TARGET_IPHONE_SIMULATOR) {
458
+ reject(@"NOT AVAILABLE", @"Device check is only available for physical devices", nil);
459
+ return;
460
+ }
461
+
462
+ DCDevice *device = DCDevice.currentDevice;
463
+
464
+ if ([device isSupported]) {
465
+ [DCDevice.currentDevice generateTokenWithCompletionHandler:^(NSData * _Nullable token, NSError * _Nullable error) {
466
+ if (error) {
467
+ reject(@"ERROR GENERATING TOKEN", error.localizedDescription, error);
468
+ return;
469
+ }
470
+
471
+ resolve([token base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]);
472
+ }];
473
+ } else {
474
+ reject(@"NOT SUPPORTED", @"Device check is not supported by this device", nil);
475
+ return;
476
+ }
477
+ } else {
478
+ reject(@"NOT AVAILABLE", @"Device check is only available for iOS > 11", nil);
479
+ return;
480
+ }
481
+ }
482
+
483
+ - (float) getFontScale {
484
+ // Font scales based on font sizes from https://developer.apple.com/ios/human-interface-guidelines/visual-design/typography/
485
+ float fontScale = 1.0;
486
+
487
+ #if !TARGET_OS_VISION
488
+ UITraitCollection *traitCollection = [[UIScreen mainScreen] traitCollection];
489
+
490
+ // Shared application is unavailable in an app extension.
491
+ if (traitCollection) {
492
+ __block NSString *contentSize = nil;
493
+ RCTUnsafeExecuteOnMainQueueSync(^{
494
+ if (@available(iOS 10.0, tvOS 10.0, macCatalyst 13.0, *)) {
495
+ contentSize = traitCollection.preferredContentSizeCategory;
496
+ } else {
497
+ // if we can't get contentSize, we'll fall back to 1.0
498
+ }
499
+ });
500
+
501
+ if ([contentSize isEqual: @"UICTContentSizeCategoryXS"]) fontScale = 0.82;
502
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryS"]) fontScale = 0.88;
503
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryM"]) fontScale = 0.95;
504
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryL"]) fontScale = 1.0;
505
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryXL"]) fontScale = 1.12;
506
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryXXL"]) fontScale = 1.23;
507
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryXXXL"]) fontScale = 1.35;
508
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryAccessibilityM"]) fontScale = 1.64;
509
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryAccessibilityL"]) fontScale = 1.95;
510
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryAccessibilityXL"]) fontScale = 2.35;
511
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryAccessibilityXXL"]) fontScale = 2.76;
512
+ else if ([contentSize isEqual: @"UICTContentSizeCategoryAccessibilityXXXL"]) fontScale = 3.12;
513
+ }
514
+ #endif
515
+
516
+ return fontScale;
517
+ }
518
+
519
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getFontScaleSync) {
520
+ return @(self.getFontScale);
521
+ }
522
+
523
+ RCT_EXPORT_METHOD(getFontScale:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
524
+ resolve(@(self.getFontScale));
525
+ }
526
+
527
+ - (double) getTotalMemory {
528
+ return [NSProcessInfo processInfo].physicalMemory;
529
+ }
530
+
531
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getTotalMemorySync) {
532
+ return @(self.getTotalMemory);
533
+ }
534
+
535
+ RCT_EXPORT_METHOD(getTotalMemory:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
536
+ resolve(@(self.getTotalMemory));
537
+ }
538
+
539
+ - (double) getTotalDiskCapacity {
540
+ uint64_t totalSpace = 0;
541
+ NSDictionary *storage = [self getStorageDictionary];
542
+
543
+ if (storage) {
544
+ NSNumber *fileSystemSizeInBytes = [storage objectForKey: NSFileSystemSize];
545
+ totalSpace = [fileSystemSizeInBytes unsignedLongLongValue];
546
+ }
547
+ return (double) totalSpace;
548
+ }
549
+
550
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getTotalDiskCapacitySync) {
551
+ return @(self.getTotalDiskCapacity);
552
+ }
553
+
554
+ RCT_EXPORT_METHOD(getTotalDiskCapacity:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
555
+ resolve(@(self.getTotalDiskCapacity));
556
+ }
557
+
558
+ - (double) getFreeDiskStorage {
559
+ uint64_t freeSpace = 0;
560
+ NSDictionary *storage = [self getStorageDictionary];
561
+
562
+ if (storage) {
563
+ NSNumber *freeFileSystemSizeInBytes = [storage objectForKey: NSFileSystemFreeSize];
564
+ freeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue];
565
+ }
566
+ return (double) freeSpace;
567
+ }
568
+
569
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getFreeDiskStorageSync) {
570
+ return @(self.getFreeDiskStorage);
571
+ }
572
+
573
+ RCT_EXPORT_METHOD(getFreeDiskStorage:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
574
+ resolve(@(self.getFreeDiskStorage));
575
+ }
576
+
577
+ - (NSString *) getDeviceTypeName {
578
+ return [DeviceTypeValues objectAtIndex: [self getDeviceType]];
579
+ }
580
+
581
+ - (NSArray *) getSupportedAbis {
582
+ /* https://stackoverflow.com/questions/19859388/how-can-i-get-the-ios-device-cpu-architecture-in-runtime */
583
+ const NXArchInfo *info = NXGetLocalArchInfo();
584
+ NSString *typeOfCpu = [NSString stringWithUTF8String:info->description];
585
+ return @[typeOfCpu];
586
+ }
587
+
588
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getSupportedAbisSync) {
589
+ return self.getSupportedAbis;
590
+ }
591
+
592
+ RCT_EXPORT_METHOD(getSupportedAbis:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
593
+ resolve(self.getSupportedAbis);
594
+ }
595
+
596
+ - (NSString *) getIpAddress {
597
+ NSString *address = @"0.0.0.0";
598
+ struct ifaddrs *interfaces = NULL;
599
+ struct ifaddrs *temp_addr = NULL;
600
+ int success = 0;
601
+ // retrieve the current interfaces - returns 0 on success
602
+ success = getifaddrs(&interfaces);
603
+ if (success == 0) {
604
+ // Loop through linked list of interfaces
605
+ temp_addr = interfaces;
606
+ while(temp_addr != NULL) {
607
+ sa_family_t addr_family = temp_addr->ifa_addr->sa_family;
608
+ // Check for IPv4 or IPv6-only interfaces
609
+ if(addr_family == AF_INET || addr_family == AF_INET6) {
610
+ NSString* ifname = [NSString stringWithUTF8String:temp_addr->ifa_name];
611
+ if(
612
+ // Check if interface is en0 which is the wifi connection the iPhone
613
+ // and the ethernet connection on the Apple TV
614
+ [ifname isEqualToString:@"en0"] ||
615
+ // Check if interface is en1 which is the wifi connection on the Apple TV
616
+ [ifname isEqualToString:@"en1"]
617
+ ) {
618
+ const struct sockaddr_in *addr = (const struct sockaddr_in*)temp_addr->ifa_addr;
619
+ socklen_t addr_len = addr_family == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN;
620
+ char addr_buffer[addr_len];
621
+ // We use inet_ntop because it also supports getting an address from
622
+ // interfaces that are IPv6-only
623
+ const char *netname = inet_ntop(addr_family, &addr->sin_addr, addr_buffer, addr_len);
624
+
625
+ // Get NSString from C String
626
+ address = [NSString stringWithUTF8String:netname];
627
+ }
628
+ }
629
+ temp_addr = temp_addr->ifa_next;
630
+ }
631
+ }
632
+ // Free memory
633
+ freeifaddrs(interfaces);
634
+ return address;
635
+ }
636
+
637
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getIpAddressSync) {
638
+ return self.getIpAddress;
639
+ }
640
+
641
+ RCT_EXPORT_METHOD(getIpAddress:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
642
+ resolve(self.getIpAddress);
643
+ }
644
+
645
+ - (BOOL) isPinOrFingerprintSet {
646
+ #if TARGET_OS_TV
647
+ return NO;
648
+ #else
649
+ LAContext *context = [[LAContext alloc] init];
650
+ return [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil];
651
+ #endif
652
+ }
653
+
654
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isPinOrFingerprintSetSync) {
655
+ return @(self.isPinOrFingerprintSet);
656
+ }
657
+
658
+ RCT_EXPORT_METHOD(isPinOrFingerprintSet:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
659
+ resolve(@(self.isPinOrFingerprintSet));
660
+ }
661
+
662
+ - (void) batteryLevelDidChange:(NSNotification *)notification {
663
+ if (!hasListeners) {
664
+ return;
665
+ }
666
+
667
+ float batteryLevel = self.getBatteryLevel;
668
+ [self sendEventWithName:@"RNDeviceInfo_batteryLevelDidChange" body:@(batteryLevel)];
669
+
670
+ if (batteryLevel <= _lowBatteryThreshold) {
671
+ [self sendEventWithName:@"RNDeviceInfo_batteryLevelIsLow" body:@(batteryLevel)];
672
+ }
673
+ }
674
+
675
+ - (void) powerStateDidChange:(NSNotification *)notification {
676
+ if (!hasListeners) {
677
+ return;
678
+ }
679
+ [self sendEventWithName:@"RNDeviceInfo_powerStateDidChange" body:self.powerState];
680
+ }
681
+
682
+ - (void) headphoneConnectionDidChange:(NSNotification *)notification {
683
+ if (!hasListeners) {
684
+ return;
685
+ }
686
+ BOOL isConnected = [self isHeadphonesConnected];
687
+ [self sendEventWithName:@"RNDeviceInfo_headphoneConnectionDidChange" body:[NSNumber numberWithBool:isConnected]];
688
+ }
689
+
690
+ - (void) brightnessDidChange:(NSNotification *)notification {
691
+ if (!hasListeners) {
692
+ return;
693
+ }
694
+ [self sendEventWithName:@"RNDeviceInfo_brightnessDidChange" body:self.getBrightness];
695
+ }
696
+
697
+ - (NSDictionary *) powerState {
698
+ #if RCT_DEV && (!TARGET_IPHONE_SIMULATOR) && !TARGET_OS_TV
699
+ if ([UIDevice currentDevice].isBatteryMonitoringEnabled != true) {
700
+ RCTLogWarn(@"Battery monitoring is not enabled. "
701
+ "You need to enable monitoring with `[UIDevice currentDevice].batteryMonitoringEnabled = TRUE`");
702
+ }
703
+ #endif
704
+ #if RCT_DEV && TARGET_IPHONE_SIMULATOR && !TARGET_OS_TV
705
+ if ([UIDevice currentDevice].batteryState == UIDeviceBatteryStateUnknown) {
706
+ RCTLogWarn(@"Battery state `unknown` and monitoring disabled, this is normal for simulators and tvOS.");
707
+ }
708
+ #endif
709
+ float batteryLevel = self.getBatteryLevel;
710
+
711
+ return @{
712
+ #if TARGET_OS_TV
713
+ @"batteryLevel": @(batteryLevel),
714
+ @"batteryState": @"full",
715
+ #else
716
+ @"batteryLevel": @(batteryLevel),
717
+ @"batteryState": [@[@"unknown", @"unplugged", @"charging", @"full"] objectAtIndex: [UIDevice currentDevice].batteryState],
718
+ @"lowPowerMode": @([NSProcessInfo processInfo].isLowPowerModeEnabled),
719
+ #endif
720
+ };
721
+ }
722
+
723
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getPowerStateSync) {
724
+ return self.powerState;
725
+ }
726
+
727
+ RCT_EXPORT_METHOD(getPowerState:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
728
+ resolve(self.powerState);
729
+ }
730
+
731
+ - (float) getBatteryLevel {
732
+ #if TARGET_OS_TV
733
+ return [@1 floatValue];
734
+ #else
735
+ return [@([UIDevice currentDevice].batteryLevel) floatValue];
736
+ #endif
737
+ }
738
+
739
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getBatteryLevelSync) {
740
+ return @(self.getBatteryLevel);
741
+ }
742
+
743
+ RCT_EXPORT_METHOD(getBatteryLevel:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
744
+ resolve(@(self.getBatteryLevel));
745
+ }
746
+
747
+ - (BOOL) isBatteryCharging {
748
+ return [self.powerState[@"batteryState"] isEqualToString:@"charging"];
749
+ }
750
+
751
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isBatteryChargingSync) {
752
+ return @(self.isBatteryCharging);
753
+ }
754
+
755
+ RCT_EXPORT_METHOD(isBatteryCharging:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
756
+ resolve(@(self.isBatteryCharging));
757
+ }
758
+
759
+ - (BOOL) isLocationEnabled {
760
+ return [CLLocationManager locationServicesEnabled];
761
+ }
762
+
763
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isLocationEnabledSync) {
764
+ return @(self.isLocationEnabled);
765
+ }
766
+
767
+ RCT_EXPORT_METHOD(isLocationEnabled:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
768
+ resolve(@(self.isLocationEnabled));
769
+ }
770
+
771
+ - (BOOL) isHeadphonesConnected {
772
+ AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
773
+ for (AVAudioSessionPortDescription* desc in [route outputs]) {
774
+ if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones]) {
775
+ return YES;
776
+ }
777
+ if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP]) {
778
+ return YES;
779
+ }
780
+ if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP]) {
781
+ return YES;
782
+ }
783
+ }
784
+ return NO;
785
+ }
786
+
787
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isHeadphonesConnectedSync) {
788
+ return @(self.isHeadphonesConnected);
789
+ }
790
+
791
+ RCT_EXPORT_METHOD(isHeadphonesConnected:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
792
+ resolve(@(self.isHeadphonesConnected));
793
+ }
794
+
795
+ - (unsigned long) getUsedMemory {
796
+ struct task_basic_info info;
797
+ mach_msg_type_number_t size = sizeof(info);
798
+ kern_return_t kerr = task_info(mach_task_self(),
799
+ TASK_BASIC_INFO,
800
+ (task_info_t)&info,
801
+ &size);
802
+ if (kerr != KERN_SUCCESS) {
803
+ return -1;
804
+ }
805
+
806
+ return (unsigned long)info.resident_size;
807
+ }
808
+
809
+ RCT_EXPORT_METHOD(getUsedMemory:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
810
+ unsigned long usedMemory = self.getUsedMemory;
811
+ if (usedMemory == -1) {
812
+ reject(@"fetch_error", @"task_info failed", nil);
813
+ } else {
814
+ resolve(@(usedMemory));
815
+ }
816
+ }
817
+
818
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getUsedMemorySync) {
819
+ return @(self.getUsedMemory);
820
+ }
821
+
822
+ RCT_EXPORT_METHOD(getUserAgent:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
823
+ #if TARGET_OS_TV
824
+ reject(@"not_available_error", @"not available on tvOS", nil);
825
+ #else
826
+ __weak ShakebugSDKRNDeviceInfo *weakSelf = self;
827
+ dispatch_async(dispatch_get_main_queue(), ^{
828
+ __strong ShakebugSDKRNDeviceInfo *strongSelf = weakSelf;
829
+ if (strongSelf) {
830
+ // Save WKWebView (it might deallocate before we ask for user Agent)
831
+ __block WKWebView *webView = [[WKWebView alloc] init];
832
+
833
+ [webView evaluateJavaScript:@"window.navigator.userAgent;" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
834
+ if (error) {
835
+ reject(@"getUserAgentError", error.localizedDescription, error);
836
+ }else{
837
+ resolve([NSString stringWithFormat:@"%@", result]);
838
+ }
839
+ // Destroy the WKWebView after task is complete
840
+ webView = nil;
841
+ }];
842
+ }
843
+ });
844
+ #endif
845
+ }
846
+
847
+ - (NSDictionary *) getAvailableLocationProviders {
848
+ #if !TARGET_OS_TV
849
+ return @{
850
+ @"locationServicesEnabled": [NSNumber numberWithBool: [CLLocationManager locationServicesEnabled]],
851
+ @"significantLocationChangeMonitoringAvailable": [NSNumber numberWithBool: [CLLocationManager significantLocationChangeMonitoringAvailable]],
852
+ @"headingAvailable": [NSNumber numberWithBool: [CLLocationManager headingAvailable]],
853
+ @"isRangingAvailable": [NSNumber numberWithBool: [CLLocationManager isRangingAvailable]]
854
+ };
855
+ #else
856
+ return @{
857
+ @"locationServicesEnabled": [NSNumber numberWithBool: [CLLocationManager locationServicesEnabled]]
858
+ };
859
+ #endif
860
+ }
861
+
862
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getAvailableLocationProvidersSync) {
863
+ return self.getAvailableLocationProviders;
864
+ }
865
+
866
+ RCT_EXPORT_METHOD(getAvailableLocationProviders:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
867
+ resolve(self.getAvailableLocationProviders);
868
+ }
869
+
870
+ #pragma mark - Installer Package Name -
871
+
872
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getInstallerPackageNameSync) {
873
+ return [ShakebugSDKEnvironmentValues objectAtIndex:[ShakebugSDKEnvironmentUtil currentAppEnvironment]];
874
+ }
875
+
876
+ RCT_EXPORT_METHOD(getInstallerPackageName:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
877
+ resolve([ShakebugSDKEnvironmentValues objectAtIndex:[ShakebugSDKEnvironmentUtil currentAppEnvironment]]);
878
+ }
879
+
880
+ - (NSNumber *) getBrightness {
881
+ #if !TARGET_OS_TV && !TARGET_OS_VISION
882
+ return @([UIScreen mainScreen].brightness);
883
+ #else
884
+ return @(-1);
885
+ #endif
886
+ }
887
+
888
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getBrightnessSync) {
889
+ return self.getBrightness;
890
+ }
891
+
892
+ RCT_EXPORT_METHOD(getBrightness:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
893
+ resolve(self.getBrightness);
894
+ }
895
+
896
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getFirstInstallTimeSync) {
897
+ return @(self.getFirstInstallTime);
898
+ }
899
+
900
+ RCT_EXPORT_METHOD(getFirstInstallTime:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
901
+ resolve(@(self.getFirstInstallTime));
902
+ }
903
+
904
+ - (long long) getFirstInstallTime {
905
+ NSURL* urlToDocumentsFolder = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
906
+ NSError *error;
907
+ NSDate *installDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:urlToDocumentsFolder.path error:&error] objectForKey:NSFileCreationDate];
908
+ return [@(floor([installDate timeIntervalSince1970] * 1000)) longLongValue];
909
+ }
910
+
911
+ #pragma mark - dealloc -
912
+
913
+ - (void)dealloc
914
+ {
915
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
916
+ }
917
+
918
+ @end