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.
- package/DeviceInfo/index.js.flow +177 -0
- package/DeviceInfo/index.ts +1034 -0
- package/DeviceInfo/internal/asyncHookWrappers.ts +59 -0
- package/DeviceInfo/internal/devicesWithDynamicIsland.ts +30 -0
- package/DeviceInfo/internal/devicesWithNotch.ts +374 -0
- package/DeviceInfo/internal/nativeInterface.ts +28 -0
- package/DeviceInfo/internal/privateTypes.ts +231 -0
- package/DeviceInfo/internal/supported-platform-info.ts +97 -0
- package/DeviceInfo/internal/types.ts +19 -0
- package/DeviceInfo/web/index.js +223 -0
- package/GetLocals/src/NativeRNLocalize.ts +18 -0
- package/GetLocals/src/constants.ts +269 -0
- package/GetLocals/src/index.ts +56 -0
- package/GetLocals/src/module.ts +51 -0
- package/GetLocals/src/module.web.ts +148 -0
- package/GetLocals/src/types.ts +31 -0
- package/GetLocation/LocationError.ts +20 -0
- package/GetLocation/index.ts +46 -0
- package/GetLocation/utils.ts +89 -0
- package/ImageOrVedioPicker/src/index.ts +28 -0
- package/ImageOrVedioPicker/src/platforms/NativeImagePicker.ts +10 -0
- package/ImageOrVedioPicker/src/platforms/native.ts +61 -0
- package/ImageOrVedioPicker/src/platforms/web.ts +159 -0
- package/ImageOrVedioPicker/src/types.ts +74 -0
- package/NetInfo/src/__tests__/eventListenerCallbacks.spec.ts +332 -0
- package/NetInfo/src/__tests__/fetch.spec.ts +479 -0
- package/NetInfo/src/index.ts +186 -0
- package/NetInfo/src/internal/__mocks__/nativeModule.ts +13 -0
- package/NetInfo/src/internal/defaultConfiguration.ts +17 -0
- package/NetInfo/src/internal/defaultConfiguration.web.ts +17 -0
- package/NetInfo/src/internal/internetReachability.ts +180 -0
- package/NetInfo/src/internal/nativeInterface.ts +43 -0
- package/NetInfo/src/internal/nativeInterface.web.ts +27 -0
- package/NetInfo/src/internal/nativeModule.ts +15 -0
- package/NetInfo/src/internal/nativeModule.web.ts +306 -0
- package/NetInfo/src/internal/privateTypes.ts +41 -0
- package/NetInfo/src/internal/state.ts +137 -0
- package/NetInfo/src/internal/types.ts +128 -0
- package/README.md +246 -0
- package/RecordScreen/src/index.tsx +75 -0
- package/ScreenShot/src/RNViewShot.js +3 -0
- package/ScreenShot/src/RNViewShot.web.js +42 -0
- package/ScreenShot/src/index.js +308 -0
- package/Sensor/src/index.js +14 -0
- package/Sensor/src/rnsensors.js +57 -0
- package/Sensor/src/sensors.js +97 -0
- package/VideoPlayer/PlayVideo.tsx +51 -0
- package/VideoPlayer/index.js +69 -0
- package/android/README.md +14 -0
- package/android/build/generated/source/buildConfig/debug/com/shakebug/BuildConfig.java +10 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +42 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +6 -0
- package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/R.txt +47 -0
- package/android/build/intermediates/compiled_local_resources/debug/out/xml_imagepicker_provider_paths.xml.flat +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +12 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/BuildConfig.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/CustomMediaMetadataRetriever.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ImageMetadata.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ImagePickerProvider.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/Metadata.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/Options.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/RecordScreenModule$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/RecordScreenModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/Shakebug.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ShakebugPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/Utility.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/Utils.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/VideoMetadata.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$Formats.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$Results.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot$ReusableByteArrayOutputStream.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/shakebug/ViewShot.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +49 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +82 -0
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +42 -0
- package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
- package/android/build/intermediates/packaged_res/debug/values/values.xml +25 -0
- package/android/build/intermediates/packaged_res/debug/xml/imagepicker_provider_paths.xml +4 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/BuildConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/CustomMediaMetadataRetriever.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ImageMetadata.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ImagePickerProvider.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Metadata.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Options.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/RecordScreenModule$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/RecordScreenModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Shakebug.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ShakebugPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Utility.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/Utils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/VideoMetadata.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$Formats.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$Results.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot$ReusableByteArrayOutputStream.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/shakebug/ViewShot.class +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +48 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +97 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +235 -0
- package/android/src/main/AndroidManifest.xml +40 -0
- package/android/src/main/java/com/shakebug/AmazonFireDeviceConnectivityPoller.java +170 -0
- package/android/src/main/java/com/shakebug/BaseUtils.java +33 -0
- package/android/src/main/java/com/shakebug/BroadcastReceiverConnectivityReceiver.java +131 -0
- package/android/src/main/java/com/shakebug/ConnectivityReceiver.java +318 -0
- package/android/src/main/java/com/shakebug/CrashLoggerModule.java +48 -0
- package/android/src/main/java/com/shakebug/DateUtil.java +64 -0
- package/android/src/main/java/com/shakebug/DeviceType.java +18 -0
- package/android/src/main/java/com/shakebug/DeviceUtil.java +46 -0
- package/android/src/main/java/com/shakebug/DrawingView.java +90 -0
- package/android/src/main/java/com/shakebug/DrawingViewManager.java +38 -0
- package/android/src/main/java/com/shakebug/GetLocation.java +147 -0
- package/android/src/main/java/com/shakebug/ImageMetadata.java +42 -0
- package/android/src/main/java/com/shakebug/ImagePickerProvider.java +8 -0
- package/android/src/main/java/com/shakebug/Metadata.java +46 -0
- package/android/src/main/java/com/shakebug/NetInfoModule.java +79 -0
- package/android/src/main/java/com/shakebug/NetInfoUtils.java +50 -0
- package/android/src/main/java/com/shakebug/NetworkCallbackConnectivityReceiver.java +209 -0
- package/android/src/main/java/com/shakebug/Options.java +42 -0
- package/android/src/main/java/com/shakebug/RNDeviceModule.java +1036 -0
- package/android/src/main/java/com/shakebug/RNInstallReferrerClient.java +124 -0
- package/android/src/main/java/com/shakebug/RNLocalizeModule.java +79 -0
- package/android/src/main/java/com/shakebug/RNLocalizeModuleImpl.java +258 -0
- package/android/src/main/java/com/shakebug/ReactNativeGetLocationModule.java +95 -0
- package/android/src/main/java/com/shakebug/RecordScreenModule.java +202 -0
- package/android/src/main/java/com/shakebug/ScreenshotDetectorModule.java +63 -0
- package/android/src/main/java/com/shakebug/SettingsUtil.java +44 -0
- package/android/src/main/java/com/shakebug/Shakebug.java +181 -0
- package/android/src/main/java/com/shakebug/ShakebugPackage.java +75 -0
- package/android/src/main/java/com/shakebug/ShakebugSDKImagePickerModule.java +56 -0
- package/android/src/main/java/com/shakebug/ShakebugSDKImagePickerModuleImpl.java +230 -0
- package/android/src/main/java/com/shakebug/ShakebugSDKScreenShotModule.java +196 -0
- package/android/src/main/java/com/shakebug/SharedPreferencesModule.java +39 -0
- package/android/src/main/java/com/shakebug/UnitConverter.java +48 -0
- package/android/src/main/java/com/shakebug/Utility.java +29 -0
- package/android/src/main/java/com/shakebug/Utils.java +593 -0
- package/android/src/main/java/com/shakebug/VideoMetadata.java +91 -0
- package/android/src/main/java/com/shakebug/VideoPlayerModule.java +199 -0
- package/android/src/main/java/com/shakebug/VideoThumbnailModule.java +215 -0
- package/android/src/main/java/com/shakebug/VideoTrimModule.java +372 -0
- package/android/src/main/java/com/shakebug/ViewShot.java +627 -0
- package/android/src/main/java/com/shakebug/adapters/VideoTrimmerAdapter.java +54 -0
- package/android/src/main/java/com/shakebug/callback/SingleCallback.java +11 -0
- package/android/src/main/java/com/shakebug/interfaces/IVideoTrimmerView.java +5 -0
- package/android/src/main/java/com/shakebug/interfaces/VideoPlayerListner.java +5 -0
- package/android/src/main/java/com/shakebug/interfaces/VideoTrimListener.java +10 -0
- package/android/src/main/java/com/shakebug/resolver/DeviceIdResolver.java +87 -0
- package/android/src/main/java/com/shakebug/resolver/DeviceTypeResolver.java +94 -0
- package/android/src/main/java/com/shakebug/thread/BackgroundExecutor.java +246 -0
- package/android/src/main/java/com/shakebug/thread/UiThreadExecutor.java +120 -0
- package/android/src/main/java/com/shakebug/types/CellularGeneration.java +60 -0
- package/android/src/main/java/com/shakebug/types/ConnectionType.java +26 -0
- package/android/src/main/java/com/shakebug/utils/StorageUtil.java +139 -0
- package/android/src/main/java/com/shakebug/utils/VideoTrimmerUtil.java +89 -0
- package/android/src/main/java/com/shakebug/widgets/RangeSeekBarView.java +534 -0
- package/android/src/main/java/com/shakebug/widgets/SpacesItemDecoration2.java +32 -0
- package/android/src/main/java/com/shakebug/widgets/VideoPlayerView.java +429 -0
- package/android/src/main/java/com/shakebug/widgets/VideoTrimmerView.java +477 -0
- package/android/src/main/java/com/shakebug/widgets/ZVideoView.java +48 -0
- package/android/src/main/res/drawable/custom_progress.xml +16 -0
- package/android/src/main/res/drawable/custom_thumb.xml +4 -0
- package/android/src/main/res/drawable/ic_close_button.xml +10 -0
- package/android/src/main/res/drawable/ic_video_pause_black.png +0 -0
- package/android/src/main/res/drawable/ic_video_play_black.png +0 -0
- package/android/src/main/res/drawable/ic_video_thumb_handle.png +0 -0
- package/android/src/main/res/drawable/icon_seek_bar.png +0 -0
- package/android/src/main/res/layout/video_player_view.xml +121 -0
- package/android/src/main/res/layout/video_thumb_item_layout.xml +16 -0
- package/android/src/main/res/layout/video_trimmer_view.xml +148 -0
- package/android/src/main/res/values/colors.xml +17 -0
- package/android/src/main/res/values/strings.xml +14 -0
- package/android/src/main/res/xml/imagepicker_provider_paths.xml +4 -0
- package/ios/CammeraPermission/RNCameraPermission.h +16 -0
- package/ios/CammeraPermission/RNCameraPermission.m +46 -0
- package/ios/DeviceInfo/DeviceUID.h +14 -0
- package/ios/DeviceInfo/DeviceUID.m +202 -0
- package/ios/DeviceInfo/EnvironmentUtil.h +41 -0
- package/ios/DeviceInfo/EnvironmentUtil.m +56 -0
- package/ios/DeviceInfo/RNDeviceInfo.h +22 -0
- package/ios/DeviceInfo/RNDeviceInfo.m +918 -0
- package/ios/GetLocals/ShakebugSDKRNLocalize.h +21 -0
- package/ios/GetLocals/ShakebugSDKRNLocalize.m +296 -0
- package/ios/GetLocation/SettingsUtil.h +16 -0
- package/ios/GetLocation/SettingsUtil.m +21 -0
- package/ios/GetLocation/ShakebugSDKLocationModule.h +17 -0
- package/ios/GetLocation/ShakebugSDKLocationModule.m +218 -0
- package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerManager.h +40 -0
- package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerManager.m +588 -0
- package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerUtils.h +26 -0
- package/ios/ImageOrVideoPicker/ShakebugSDKImagePickerUtils.m +194 -0
- package/ios/MicrophonePermissionManager.h +14 -0
- package/ios/MicrophonePermissionManager.m +35 -0
- package/ios/NetInfo/RNCConnectionState.h +42 -0
- package/ios/NetInfo/RNCConnectionState.m +119 -0
- package/ios/NetInfo/RNCConnectionStateWatcher.h +31 -0
- package/ios/NetInfo/RNCConnectionStateWatcher.m +136 -0
- package/ios/NetInfo/RNCNetInfo.h +13 -0
- package/ios/NetInfo/RNCNetInfo.m +269 -0
- package/ios/RecordScreen/ShakebugSDKRecordScreen.h +31 -0
- package/ios/RecordScreen/ShakebugSDKRecordScreen.m +309 -0
- package/ios/ScreenShot/ShakebugSDKRNViewShot.h +6 -0
- package/ios/ScreenShot/ShakebugSDKRNViewShot.m +186 -0
- package/ios/ScreenshotDetector/ScreenShotDetector.h +12 -0
- package/ios/ScreenshotDetector/ScreenShotDetector.m +37 -0
- package/ios/Senors/RNSensorsAccelerometer.h +22 -0
- package/ios/Senors/RNSensorsAccelerometer.m +162 -0
- package/ios/Senors/RNSensorsBarometer.h +22 -0
- package/ios/Senors/RNSensorsBarometer.m +141 -0
- package/ios/Senors/RNSensorsGravity.h +22 -0
- package/ios/Senors/RNSensorsGravity.m +165 -0
- package/ios/Senors/RNSensorsGyroscope.h +22 -0
- package/ios/Senors/RNSensorsGyroscope.m +160 -0
- package/ios/Senors/RNSensorsMagnetometer.h +22 -0
- package/ios/Senors/RNSensorsMagnetometer.m +163 -0
- package/ios/Senors/RNSensorsOrientation.h +22 -0
- package/ios/Senors/RNSensorsOrientation.m +189 -0
- package/ios/Senors/RNSensorsUtils.h +7 -0
- package/ios/Senors/RNSensorsUtils.m +9 -0
- package/ios/Shakebug.h +7 -0
- package/ios/Shakebug.m +16 -0
- package/ios/Shakebug.xcodeproj/project.pbxproj +872 -0
- package/ios/Shakebug.xcodeproj/xcshareddata/xcschemes/Shakebug.xcscheme +66 -0
- package/ios/Shakebug.xcworkspace/contents.xcworkspacedata +10 -0
- package/ios/Shakebug.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/SketchCanvas/DrawingView.h +18 -0
- package/ios/SketchCanvas/DrawingView.m +96 -0
- package/ios/SketchCanvas/DrawingViewManager.h +12 -0
- package/ios/SketchCanvas/DrawingViewManager.m +35 -0
- package/ios/Storage/SharedPreferencesModule.h +13 -0
- package/ios/Storage/SharedPreferencesModule.m +35 -0
- package/ios/Thumbnaill/VideoThumbnailManager.h +12 -0
- package/ios/Thumbnaill/VideoThumbnailManager.m +73 -0
- package/ios/TrimVideo/ShakebugSDKVideoTrim.swift +372 -0
- package/ios/TrimVideo/VideoTrim-Bridging-Header.h +10 -0
- package/ios/TrimVideo/VideoTrim.m +23 -0
- package/ios/TrimVideo/VideoTrimmer.swift +810 -0
- package/ios/TrimVideo/VideoTrimmerThumb.swift +119 -0
- package/ios/TrimVideo/VideoTrimmerViewController.swift +301 -0
- package/ios/VideoPlayer/VideoPlayerModule.h +14 -0
- package/ios/VideoPlayer/VideoPlayerModule.m +29 -0
- package/ios/VideoPlayer/VideoPlayerViewController.h +18 -0
- package/ios/VideoPlayer/VideoPlayerViewController.m +29 -0
- package/package.json +45 -0
- package/shakebug-react-native.podspec +50 -0
- package/src/APIs/AddIssue.js +70 -0
- package/src/APIs/EndSession.js +32 -0
- package/src/APIs/Event.js +39 -0
- package/src/APIs/MatchKey.js +40 -0
- package/src/APIs/StartSession.js +84 -0
- package/src/Assets/images/OpenSketch.png +0 -0
- package/src/Assets/images/Push.png +0 -0
- package/src/Assets/images/RemoveTextView.png +0 -0
- package/src/Assets/images/black.png +0 -0
- package/src/Assets/images/blue.png +0 -0
- package/src/Assets/images/borderdBlack.png +0 -0
- package/src/Assets/images/borderdBlue.png +0 -0
- package/src/Assets/images/borderdGreen.png +0 -0
- package/src/Assets/images/borderdRed.png +0 -0
- package/src/Assets/images/borderdYellow.png +0 -0
- package/src/Assets/images/clear.png +0 -0
- package/src/Assets/images/close.png +0 -0
- package/src/Assets/images/green.png +0 -0
- package/src/Assets/images/next.png +0 -0
- package/src/Assets/images/play.png +0 -0
- package/src/Assets/images/red.png +0 -0
- package/src/Assets/images/shake.png +0 -0
- package/src/Assets/images/shakebugLogo.png +0 -0
- package/src/Assets/images/stopButton.png +0 -0
- package/src/Assets/images/text_icon.png +0 -0
- package/src/Assets/images/yellow.png +0 -0
- package/src/Componanats/CustomAlert.js +80 -0
- package/src/Componanats/ErrorHandler.js +80 -0
- package/src/Componanats/GlobalStateContext.js +22 -0
- package/src/Componanats/KeyboardAvoidingWrapper.js +43 -0
- package/src/Componanats/NavigationContext.js +42 -0
- package/src/Componanats/ShakeFunction.js +562 -0
- package/src/Componanats/localization.js +482 -0
- package/src/Screens/AddDetailsScreen.js +462 -0
- package/src/Screens/FirstScreen.js +629 -0
- package/src/Screens/Shakebug.js +487 -0
- package/src/Screens/StrockView.js +20 -0
- package/src/Screens/TrimVideoScreen.js +81 -0
- package/src/Screens/TutorialScreen.js +36 -0
- package/src/index.tsx +117 -0
- package/trimVideo/src/index.tsx +141 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#import "ShakebugSDKImagePickerUtils.h"
|
|
2
|
+
#import <CoreServices/CoreServices.h>
|
|
3
|
+
#import <PhotosUI/PhotosUI.h>
|
|
4
|
+
|
|
5
|
+
@implementation ShakebugSDKImagePickerUtils
|
|
6
|
+
|
|
7
|
+
+ (void) setupPickerFromOptions:(UIImagePickerController *)picker options:(NSDictionary *)options target:(RNImagePickerTarget)target
|
|
8
|
+
{
|
|
9
|
+
if ([[options objectForKey:@"mediaType"] isEqualToString:@"video"]) {
|
|
10
|
+
|
|
11
|
+
if ([[options objectForKey:@"videoQuality"] isEqualToString:@"high"]) {
|
|
12
|
+
picker.videoQuality = UIImagePickerControllerQualityTypeHigh;
|
|
13
|
+
}
|
|
14
|
+
else if ([[options objectForKey:@"videoQuality"] isEqualToString:@"low"]) {
|
|
15
|
+
picker.videoQuality = UIImagePickerControllerQualityTypeLow;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
picker.videoQuality = UIImagePickerControllerQualityTypeMedium;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (target == camera) {
|
|
23
|
+
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
|
|
24
|
+
|
|
25
|
+
if ([options[@"durationLimit"] doubleValue] > 0) {
|
|
26
|
+
picker.videoMaximumDuration = [options[@"durationLimit"] doubleValue];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if ([options[@"cameraType"] isEqualToString:@"front"]) {
|
|
30
|
+
picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
|
|
31
|
+
} else {
|
|
32
|
+
picker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if ([options[@"mediaType"] isEqualToString:@"video"]) {
|
|
39
|
+
picker.mediaTypes = @[(NSString *)kUTTypeMovie];
|
|
40
|
+
} else if ([options[@"mediaType"] isEqualToString:@"photo"]) {
|
|
41
|
+
picker.mediaTypes = @[(NSString *)kUTTypeImage];
|
|
42
|
+
} else if ([options[@"mediaType"] isEqualToString:@"mixed"]) {
|
|
43
|
+
picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
picker.modalPresentationStyle = [RCTConvert UIModalPresentationStyle:options[@"presentationStyle"]];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
+ (PHPickerConfiguration *)makeConfigurationFromOptions:(NSDictionary *)options target:(RNImagePickerTarget)target API_AVAILABLE(ios(14))
|
|
50
|
+
{
|
|
51
|
+
#if __has_include(<PhotosUI/PHPicker.h>)
|
|
52
|
+
PHPickerConfiguration *configuration;
|
|
53
|
+
|
|
54
|
+
if(options[@"includeExtra"]) {
|
|
55
|
+
PHPhotoLibrary *photoLibrary = [PHPhotoLibrary sharedPhotoLibrary];
|
|
56
|
+
configuration = [[PHPickerConfiguration alloc] initWithPhotoLibrary:photoLibrary];
|
|
57
|
+
} else {
|
|
58
|
+
configuration = [[PHPickerConfiguration alloc] init];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if ([[options objectForKey:@"assetRepresentationMode"] isEqualToString:@"current"]) {
|
|
62
|
+
configuration.preferredAssetRepresentationMode = PHPickerConfigurationAssetRepresentationModeCurrent;
|
|
63
|
+
}
|
|
64
|
+
else if ([[options objectForKey:@"assetRepresentationMode"] isEqualToString:@"compatible"]) {
|
|
65
|
+
configuration.preferredAssetRepresentationMode = PHPickerConfigurationAssetRepresentationModeCompatible;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
configuration.preferredAssetRepresentationMode = PHPickerConfigurationAssetRepresentationModeAutomatic;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
configuration.selectionLimit = [options[@"selectionLimit"] integerValue];
|
|
72
|
+
|
|
73
|
+
if ([options[@"mediaType"] isEqualToString:@"video"]) {
|
|
74
|
+
configuration.filter = [PHPickerFilter videosFilter];
|
|
75
|
+
} else if ([options[@"mediaType"] isEqualToString:@"photo"]) {
|
|
76
|
+
configuration.filter = [PHPickerFilter imagesFilter];
|
|
77
|
+
} else if ((target == library) && ([options[@"mediaType"] isEqualToString:@"mixed"])) {
|
|
78
|
+
configuration.filter = [PHPickerFilter anyFilterMatchingSubfilters: @[PHPickerFilter.imagesFilter, PHPickerFilter.videosFilter]];
|
|
79
|
+
}
|
|
80
|
+
return configuration;
|
|
81
|
+
#else
|
|
82
|
+
return nil;
|
|
83
|
+
#endif
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
+ (BOOL) isSimulator
|
|
88
|
+
{
|
|
89
|
+
#if TARGET_OS_SIMULATOR
|
|
90
|
+
return YES;
|
|
91
|
+
#endif
|
|
92
|
+
return NO;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
+ (NSString*) getFileType:(NSData *)imageData
|
|
96
|
+
{
|
|
97
|
+
const uint8_t firstByteJpg = 0xFF;
|
|
98
|
+
const uint8_t firstBytePng = 0x89;
|
|
99
|
+
const uint8_t firstByteGif = 0x47;
|
|
100
|
+
|
|
101
|
+
uint8_t firstByte;
|
|
102
|
+
[imageData getBytes:&firstByte length:1];
|
|
103
|
+
switch (firstByte) {
|
|
104
|
+
case firstByteJpg:
|
|
105
|
+
return @"jpg";
|
|
106
|
+
case firstBytePng:
|
|
107
|
+
return @"png";
|
|
108
|
+
case firstByteGif:
|
|
109
|
+
return @"gif";
|
|
110
|
+
default:
|
|
111
|
+
return @"jpg";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
+ (NSString *) getFileTypeFromUrl:(NSURL *)url {
|
|
116
|
+
CFStringRef fileExtension = (__bridge CFStringRef)[url pathExtension];
|
|
117
|
+
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);
|
|
118
|
+
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
|
|
119
|
+
CFRelease(UTI);
|
|
120
|
+
return (__bridge_transfer NSString *)MIMEType;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
+ (NSNumber *) getFileSizeFromUrl:(NSURL *)url {
|
|
124
|
+
NSError *attributesError;
|
|
125
|
+
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[url path] error:&attributesError];
|
|
126
|
+
NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
|
|
127
|
+
long fileSize = [fileSizeNumber longLongValue];
|
|
128
|
+
|
|
129
|
+
if (attributesError) {
|
|
130
|
+
return nil;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return [NSNumber numberWithLong:fileSize];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
+ (CGSize)getVideoDimensionsFromUrl:(NSURL *)url {
|
|
137
|
+
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
|
|
138
|
+
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
|
|
139
|
+
|
|
140
|
+
if ([tracks count] > 0) {
|
|
141
|
+
AVAssetTrack *track = [tracks objectAtIndex:0];
|
|
142
|
+
return track.naturalSize;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return CGSizeMake(0, 0);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
+ (UIImage*)resizeImage:(UIImage*)image maxWidth:(float)maxWidth maxHeight:(float)maxHeight
|
|
149
|
+
{
|
|
150
|
+
if ((maxWidth == 0) || (maxHeight == 0)) {
|
|
151
|
+
return image;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (image.size.width <= maxWidth && image.size.height <= maxHeight) {
|
|
155
|
+
return image;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
CGSize newSize = CGSizeMake(image.size.width, image.size.height);
|
|
159
|
+
if (maxWidth < newSize.width) {
|
|
160
|
+
newSize = CGSizeMake(maxWidth, (maxWidth / newSize.width) * newSize.height);
|
|
161
|
+
}
|
|
162
|
+
if (maxHeight < newSize.height) {
|
|
163
|
+
newSize = CGSizeMake((maxHeight / newSize.height) * newSize.width, maxHeight);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
newSize.width = (int)newSize.width;
|
|
167
|
+
newSize.height = (int)newSize.height;
|
|
168
|
+
|
|
169
|
+
UIGraphicsBeginImageContext(newSize);
|
|
170
|
+
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
|
|
171
|
+
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
172
|
+
if (newImage == nil) {
|
|
173
|
+
NSLog(@"could not scale image");
|
|
174
|
+
}
|
|
175
|
+
UIGraphicsEndImageContext();
|
|
176
|
+
|
|
177
|
+
return newImage;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
+ (PHAsset *)fetchPHAssetOnIOS13:(NSDictionary<NSString *,id> *)info
|
|
181
|
+
{
|
|
182
|
+
NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
|
|
183
|
+
|
|
184
|
+
if(!referenceURL) {
|
|
185
|
+
return nil;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// We fetch the asset like this to support iOS 10 and lower
|
|
189
|
+
// see: https://stackoverflow.com/a/52529904/4177049
|
|
190
|
+
PHFetchResult* fetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[referenceURL] options:nil];
|
|
191
|
+
return fetchResult.firstObject;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
@end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//
|
|
2
|
+
// MicrophonePermissionManager.h
|
|
3
|
+
// Shakebug
|
|
4
|
+
//
|
|
5
|
+
// Created by ideveloper2 on 28/02/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(MicrophonePermissionManager, NSObject)
|
|
13
|
+
RCT_EXTERN_METHOD(requestMicrophonePermission:(RCTResponseSenderBlock)callback)
|
|
14
|
+
@end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// MicrophonePermissionManager.m
|
|
2
|
+
|
|
3
|
+
#import <React/RCTBridgeModule.h>
|
|
4
|
+
#import <AVFoundation/AVFoundation.h>
|
|
5
|
+
|
|
6
|
+
@interface MicrophonePermissionManager : NSObject <RCTBridgeModule>
|
|
7
|
+
@end
|
|
8
|
+
|
|
9
|
+
@implementation MicrophonePermissionManager
|
|
10
|
+
|
|
11
|
+
RCT_EXPORT_MODULE();
|
|
12
|
+
|
|
13
|
+
RCT_EXPORT_METHOD(requestMicrophonePermission:(RCTResponseSenderBlock)callback) {
|
|
14
|
+
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
|
|
15
|
+
|
|
16
|
+
if (!audioSession) {
|
|
17
|
+
callback(@[@"AVAudioSession is not available", @(NO)]);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
NSError *error = nil;
|
|
22
|
+
[audioSession requestRecordPermission:^(BOOL granted) {
|
|
23
|
+
if (granted) {
|
|
24
|
+
callback(@[[NSNull null], @(YES)]);
|
|
25
|
+
} else {
|
|
26
|
+
callback(@[[NSNull null], @(NO)]);
|
|
27
|
+
}
|
|
28
|
+
}];
|
|
29
|
+
|
|
30
|
+
if (error) {
|
|
31
|
+
callback(@[error.localizedDescription, @(NO)]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNCConnectionState.h
|
|
3
|
+
// Shakebug
|
|
4
|
+
//
|
|
5
|
+
// Created by ideveloper2 on 06/03/24.
|
|
6
|
+
// Copyright © 2024 Facebook. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
#import <SystemConfiguration/SystemConfiguration.h>
|
|
11
|
+
|
|
12
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
13
|
+
|
|
14
|
+
// Based on the ConnectionType enum described in the W3C Network Information API spec
|
|
15
|
+
// (https://wicg.github.io/netinfo/).
|
|
16
|
+
static NSString *const RNCConnectionTypeUnknown = @"unknown";
|
|
17
|
+
static NSString *const RNCConnectionTypeNone = @"none";
|
|
18
|
+
static NSString *const RNCConnectionTypeWifi = @"wifi";
|
|
19
|
+
static NSString *const RNCConnectionTypeCellular = @"cellular";
|
|
20
|
+
static NSString *const RNCConnectionTypeEthernet = @"ethernet";
|
|
21
|
+
|
|
22
|
+
// Based on the EffectiveConnectionType enum described in the W3C Network Information API spec
|
|
23
|
+
// (https://wicg.github.io/netinfo/).
|
|
24
|
+
static NSString *const RNCCellularGeneration2g = @"2g";
|
|
25
|
+
static NSString *const RNCCellularGeneration3g = @"3g";
|
|
26
|
+
static NSString *const RNCCellularGeneration4g = @"4g";
|
|
27
|
+
static NSString *const RNCCellularGeneration5g = @"5g";
|
|
28
|
+
|
|
29
|
+
@interface ShakebugSDKRNCConnectionState : NSObject
|
|
30
|
+
|
|
31
|
+
- (instancetype)init;
|
|
32
|
+
- (instancetype)initWithReachabilityFlags:(SCNetworkReachabilityFlags)flags;
|
|
33
|
+
- (BOOL)isEqualToConnectionState:(ShakebugSDKRNCConnectionState *)otherState;
|
|
34
|
+
|
|
35
|
+
@property (nonatomic, strong, readonly) NSString *type;
|
|
36
|
+
@property (nullable, nonatomic, strong, readonly) NSString *cellularGeneration;
|
|
37
|
+
@property (nonatomic, readonly) BOOL connected;
|
|
38
|
+
@property (nonatomic, readonly) BOOL expensive;
|
|
39
|
+
|
|
40
|
+
@end
|
|
41
|
+
|
|
42
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNCConnectionState.m
|
|
3
|
+
// Shakebug
|
|
4
|
+
//
|
|
5
|
+
// Created by ideveloper2 on 06/03/24.
|
|
6
|
+
// Copyright © 2024 Facebook. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
#import "RNCConnectionState.h"
|
|
11
|
+
#if !TARGET_OS_TV && !TARGET_OS_MACCATALYST && !TARGET_OS_VISION
|
|
12
|
+
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
#if TARGET_OS_TV || TARGET_OS_OSX || TARGET_OS_MACCATALYST || TARGET_OS_VISION
|
|
16
|
+
#include <ifaddrs.h>
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
@implementation ShakebugSDKRNCConnectionState
|
|
20
|
+
|
|
21
|
+
// Creates a new "blank" state
|
|
22
|
+
- (instancetype)init
|
|
23
|
+
{
|
|
24
|
+
self = [super init];
|
|
25
|
+
if (self) {
|
|
26
|
+
_type = RNCConnectionTypeUnknown;
|
|
27
|
+
_cellularGeneration = nil;
|
|
28
|
+
_expensive = false;
|
|
29
|
+
}
|
|
30
|
+
return self;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Creates the state from the given reachability references
|
|
34
|
+
- (instancetype)initWithReachabilityFlags:(SCNetworkReachabilityFlags)flags
|
|
35
|
+
{
|
|
36
|
+
self = [self init];
|
|
37
|
+
if (self) {
|
|
38
|
+
_type = RNCConnectionTypeUnknown;
|
|
39
|
+
_cellularGeneration = nil;
|
|
40
|
+
_expensive = false;
|
|
41
|
+
|
|
42
|
+
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0 ||
|
|
43
|
+
(flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0) {
|
|
44
|
+
_type = RNCConnectionTypeNone;
|
|
45
|
+
}
|
|
46
|
+
#if !TARGET_OS_TV && !TARGET_OS_OSX && !TARGET_OS_MACCATALYST && !TARGET_OS_VISION
|
|
47
|
+
else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) {
|
|
48
|
+
_type = RNCConnectionTypeCellular;
|
|
49
|
+
_expensive = true;
|
|
50
|
+
|
|
51
|
+
CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
|
|
52
|
+
if (netinfo) {
|
|
53
|
+
if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS] ||
|
|
54
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] ||
|
|
55
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
|
|
56
|
+
_cellularGeneration = RNCCellularGeneration2g;
|
|
57
|
+
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA] ||
|
|
58
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] ||
|
|
59
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] ||
|
|
60
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] ||
|
|
61
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] ||
|
|
62
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB] ||
|
|
63
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
|
|
64
|
+
_cellularGeneration = RNCCellularGeneration3g;
|
|
65
|
+
} else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
|
|
66
|
+
_cellularGeneration = RNCCellularGeneration4g;
|
|
67
|
+
} else if (@available(iOS 14.1, *)) {
|
|
68
|
+
if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNRNSA] ||
|
|
69
|
+
[netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNR]) {
|
|
70
|
+
_cellularGeneration = RNCCellularGeneration5g;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
#endif
|
|
76
|
+
else {
|
|
77
|
+
_type = RNCConnectionTypeWifi;
|
|
78
|
+
#if TARGET_OS_TV || TARGET_OS_OSX || TARGET_OS_MACCATALYST || TARGET_OS_VISION
|
|
79
|
+
struct ifaddrs *interfaces = NULL;
|
|
80
|
+
struct ifaddrs *temp_addr = NULL;
|
|
81
|
+
int success = 0;
|
|
82
|
+
// retrieve the current interfaces - returns 0 on success
|
|
83
|
+
success = getifaddrs(&interfaces);
|
|
84
|
+
if (success == 0) {
|
|
85
|
+
// Loop through linked list of interfaces
|
|
86
|
+
temp_addr = interfaces;
|
|
87
|
+
while (temp_addr != NULL) {
|
|
88
|
+
if (temp_addr->ifa_addr->sa_family == AF_INET) {
|
|
89
|
+
// Check if interface is en0 which is the ethernet connection on the Apple TV
|
|
90
|
+
NSString* ifname = [NSString stringWithUTF8String:temp_addr->ifa_name];
|
|
91
|
+
if ([ifname isEqualToString:@"en0"]) {
|
|
92
|
+
_type = RNCConnectionTypeEthernet;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
temp_addr = temp_addr->ifa_next;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Free memory
|
|
99
|
+
freeifaddrs(interfaces);
|
|
100
|
+
#endif
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return self;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Checks if two states are equal
|
|
107
|
+
- (BOOL)isEqualToConnectionState:(ShakebugSDKRNCConnectionState *)otherState
|
|
108
|
+
{
|
|
109
|
+
return [self.type isEqualToString:otherState.type]
|
|
110
|
+
&& [self.cellularGeneration isEqualToString:otherState.cellularGeneration]
|
|
111
|
+
&& self.expensive == otherState.expensive;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
- (BOOL)connected
|
|
115
|
+
{
|
|
116
|
+
return ![self.type isEqualToString:RNCConnectionTypeNone] && ![self.type isEqualToString:RNCConnectionTypeUnknown];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNCConnectionStateWatcher.h
|
|
3
|
+
// Shakebug
|
|
4
|
+
//
|
|
5
|
+
// Created by ideveloper2 on 06/03/24.
|
|
6
|
+
// Copyright © 2024 Facebook. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
#import <Foundation/Foundation.h>
|
|
11
|
+
#import "RNCConnectionState.h"
|
|
12
|
+
|
|
13
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
14
|
+
|
|
15
|
+
@class ShakebugSDKRNCConnectionStateWatcher;
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@protocol RNCConnectionStateWatcherDelegate
|
|
19
|
+
|
|
20
|
+
- (void)connectionStateWatcher:(ShakebugSDKRNCConnectionStateWatcher *)connectionStateWatcher didUpdateState:(ShakebugSDKRNCConnectionState *)state;
|
|
21
|
+
|
|
22
|
+
@end
|
|
23
|
+
|
|
24
|
+
@interface ShakebugSDKRNCConnectionStateWatcher : NSObject
|
|
25
|
+
|
|
26
|
+
- (instancetype)initWithDelegate:(id<RNCConnectionStateWatcherDelegate>)delegate;
|
|
27
|
+
- (ShakebugSDKRNCConnectionState *)currentState;
|
|
28
|
+
|
|
29
|
+
@end
|
|
30
|
+
|
|
31
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNCConnectionStateWatcher.m
|
|
3
|
+
// Shakebug
|
|
4
|
+
//
|
|
5
|
+
// Created by ideveloper2 on 06/03/24.
|
|
6
|
+
// Copyright © 2024 Facebook. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import "RNCConnectionStateWatcher.h"
|
|
10
|
+
#import <SystemConfiguration/SystemConfiguration.h>
|
|
11
|
+
#import <netinet/in.h>
|
|
12
|
+
|
|
13
|
+
@interface ShakebugSDKRNCConnectionStateWatcher () <NSURLSessionDataDelegate>
|
|
14
|
+
|
|
15
|
+
@property (nonatomic) SCNetworkReachabilityRef reachabilityRef;
|
|
16
|
+
@property (nullable, weak, nonatomic) id<RNCConnectionStateWatcherDelegate> delegate;
|
|
17
|
+
@property (nonatomic) SCNetworkReachabilityFlags lastFlags;
|
|
18
|
+
@property (nonnull, strong, nonatomic) ShakebugSDKRNCConnectionState *state;
|
|
19
|
+
|
|
20
|
+
@end
|
|
21
|
+
|
|
22
|
+
@implementation ShakebugSDKRNCConnectionStateWatcher
|
|
23
|
+
|
|
24
|
+
#pragma mark - Lifecycle
|
|
25
|
+
|
|
26
|
+
- (instancetype)initWithDelegate:(id<RNCConnectionStateWatcherDelegate>)delegate
|
|
27
|
+
{
|
|
28
|
+
self = [self init];
|
|
29
|
+
if (self) {
|
|
30
|
+
_delegate = delegate;
|
|
31
|
+
_state = [[ShakebugSDKRNCConnectionState alloc] init];
|
|
32
|
+
_reachabilityRef = [self createReachabilityRef];
|
|
33
|
+
}
|
|
34
|
+
return self;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
- (void)dealloc
|
|
38
|
+
{
|
|
39
|
+
self.delegate = nil;
|
|
40
|
+
|
|
41
|
+
if (self.reachabilityRef != nil) {
|
|
42
|
+
SCNetworkReachabilityUnscheduleFromRunLoop(self.reachabilityRef, CFRunLoopGetMain(), kCFRunLoopCommonModes);
|
|
43
|
+
CFRelease(self.reachabilityRef);
|
|
44
|
+
self.reachabilityRef = nil;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#pragma mark - Public methods
|
|
49
|
+
|
|
50
|
+
- (ShakebugSDKRNCConnectionState *)currentState
|
|
51
|
+
{
|
|
52
|
+
return self.state;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#pragma mark - Callback
|
|
56
|
+
|
|
57
|
+
typedef void (^RNCConnectionStateUpdater)(SCNetworkReachabilityFlags);
|
|
58
|
+
|
|
59
|
+
static void RNCReachabilityCallback(__unused SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info)
|
|
60
|
+
{
|
|
61
|
+
RNCConnectionStateUpdater block = (__bridge id)info;
|
|
62
|
+
if (block != nil) {
|
|
63
|
+
block(flags);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static void RNCReachabilityContextRelease(const void *info)
|
|
68
|
+
{
|
|
69
|
+
Block_release(info);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static const void *RNCReachabilityContextRetain(const void *info)
|
|
73
|
+
{
|
|
74
|
+
return Block_copy(info);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
- (void)update:(SCNetworkReachabilityFlags)flags
|
|
78
|
+
{
|
|
79
|
+
self.lastFlags = flags;
|
|
80
|
+
self.state = [[ShakebugSDKRNCConnectionState alloc] initWithReachabilityFlags:flags];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#pragma mark - Setters
|
|
84
|
+
|
|
85
|
+
- (void)setState:(ShakebugSDKRNCConnectionState *)state
|
|
86
|
+
{
|
|
87
|
+
if (![state isEqualToConnectionState:_state]) {
|
|
88
|
+
_state = state;
|
|
89
|
+
|
|
90
|
+
[self updateDelegate];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#pragma mark - Utilities
|
|
95
|
+
|
|
96
|
+
- (void)updateDelegate
|
|
97
|
+
{
|
|
98
|
+
[self.delegate connectionStateWatcher:self didUpdateState:self.state];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
- (SCNetworkReachabilityRef)createReachabilityRef
|
|
102
|
+
{
|
|
103
|
+
struct sockaddr_in zeroAddress;
|
|
104
|
+
bzero(&zeroAddress, sizeof(zeroAddress));
|
|
105
|
+
zeroAddress.sin_len = sizeof(zeroAddress);
|
|
106
|
+
zeroAddress.sin_family = AF_INET;
|
|
107
|
+
|
|
108
|
+
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);
|
|
109
|
+
|
|
110
|
+
__weak typeof(self) weakSelf = self;
|
|
111
|
+
RNCConnectionStateUpdater callback = ^(SCNetworkReachabilityFlags flags) {
|
|
112
|
+
__strong __typeof(weakSelf) strongSelf = weakSelf;
|
|
113
|
+
if (strongSelf != nil) {
|
|
114
|
+
[strongSelf update:flags];
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
SCNetworkReachabilityContext context = {
|
|
119
|
+
0,
|
|
120
|
+
(__bridge void *)callback,
|
|
121
|
+
RNCReachabilityContextRetain,
|
|
122
|
+
RNCReachabilityContextRelease,
|
|
123
|
+
NULL
|
|
124
|
+
};
|
|
125
|
+
SCNetworkReachabilitySetCallback(reachability, RNCReachabilityCallback, &context);
|
|
126
|
+
SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
|
|
127
|
+
|
|
128
|
+
// Set the state the first time
|
|
129
|
+
SCNetworkReachabilityFlags flags;
|
|
130
|
+
SCNetworkReachabilityGetFlags(reachability, &flags);
|
|
131
|
+
[self update:flags];
|
|
132
|
+
|
|
133
|
+
return reachability;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@end
|