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,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
|