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,230 @@
|
|
|
1
|
+
package com.shakebug;
|
|
2
|
+
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.content.ActivityNotFoundException;
|
|
5
|
+
import android.content.Intent;
|
|
6
|
+
import android.net.Uri;
|
|
7
|
+
import android.os.Build;
|
|
8
|
+
import android.provider.MediaStore;
|
|
9
|
+
|
|
10
|
+
import com.facebook.react.bridge.ActivityEventListener;
|
|
11
|
+
import com.facebook.react.bridge.Callback;
|
|
12
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
13
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
14
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
15
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
16
|
+
import com.facebook.react.module.annotations.ReactModule;
|
|
17
|
+
|
|
18
|
+
import java.io.File;
|
|
19
|
+
import java.util.Collections;
|
|
20
|
+
import java.util.List;
|
|
21
|
+
import java.util.concurrent.ExecutorService;
|
|
22
|
+
import java.util.concurrent.Executors;
|
|
23
|
+
|
|
24
|
+
import static com.shakebug.Utils.*;
|
|
25
|
+
|
|
26
|
+
public class ShakebugSDKImagePickerModuleImpl implements ActivityEventListener {
|
|
27
|
+
static final String NAME = "ShakebugSDKImagePicker";
|
|
28
|
+
|
|
29
|
+
// Public to let consuming apps hook into the image picker response
|
|
30
|
+
public static final int REQUEST_LAUNCH_IMAGE_CAPTURE = 13001;
|
|
31
|
+
public static final int REQUEST_LAUNCH_VIDEO_CAPTURE = 13002;
|
|
32
|
+
public static final int REQUEST_LAUNCH_LIBRARY = 13003;
|
|
33
|
+
|
|
34
|
+
private Uri fileUri;
|
|
35
|
+
|
|
36
|
+
private ReactApplicationContext reactContext;
|
|
37
|
+
|
|
38
|
+
Callback callback;
|
|
39
|
+
|
|
40
|
+
Options options;
|
|
41
|
+
Uri cameraCaptureURI;
|
|
42
|
+
|
|
43
|
+
public ShakebugSDKImagePickerModuleImpl(ReactApplicationContext reactContext) {
|
|
44
|
+
this.reactContext = reactContext;
|
|
45
|
+
this.reactContext.addActivityEventListener(this);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public void launchCamera(final ReadableMap options, final Callback callback) {
|
|
49
|
+
if (!isCameraAvailable(reactContext)) {
|
|
50
|
+
callback.invoke(getErrorMap(errCameraUnavailable, null));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
final Activity currentActivity = this.reactContext.getCurrentActivity();
|
|
55
|
+
if (currentActivity == null) {
|
|
56
|
+
callback.invoke(getErrorMap(errOthers, "Activity error"));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!isCameraPermissionFulfilled(reactContext, currentActivity)) {
|
|
61
|
+
callback.invoke(getErrorMap(errOthers, cameraPermissionDescription));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
this.callback = callback;
|
|
66
|
+
this.options = new Options(options);
|
|
67
|
+
|
|
68
|
+
if (this.options.saveToPhotos && Build.VERSION.SDK_INT <= Build.VERSION_CODES.P && !hasPermission(currentActivity)) {
|
|
69
|
+
callback.invoke(getErrorMap(errPermission, null));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
int requestCode;
|
|
74
|
+
File file;
|
|
75
|
+
Intent cameraIntent;
|
|
76
|
+
|
|
77
|
+
if (this.options.mediaType.equals(mediaTypeVideo)) {
|
|
78
|
+
requestCode = REQUEST_LAUNCH_VIDEO_CAPTURE;
|
|
79
|
+
cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
|
|
80
|
+
cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, this.options.videoQuality);
|
|
81
|
+
if (this.options.durationLimit > 0) {
|
|
82
|
+
cameraIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, this.options.durationLimit);
|
|
83
|
+
}
|
|
84
|
+
file = createFile(reactContext, "mp4");
|
|
85
|
+
cameraCaptureURI = createUri(file, reactContext);
|
|
86
|
+
} else {
|
|
87
|
+
requestCode = REQUEST_LAUNCH_IMAGE_CAPTURE;
|
|
88
|
+
cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
|
89
|
+
file = createFile(reactContext, "jpg");
|
|
90
|
+
cameraCaptureURI = createUri(file, reactContext);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (this.options.useFrontCamera) {
|
|
94
|
+
setFrontCamera(cameraIntent);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
fileUri = Uri.fromFile(file);
|
|
98
|
+
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraCaptureURI);
|
|
99
|
+
cameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
currentActivity.startActivityForResult(cameraIntent, requestCode);
|
|
103
|
+
} catch (ActivityNotFoundException e) {
|
|
104
|
+
callback.invoke(getErrorMap(errOthers, e.getMessage()));
|
|
105
|
+
this.callback = null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public void launchImageLibrary(final ReadableMap options, final Callback callback) {
|
|
110
|
+
final Activity currentActivity = this.reactContext.getCurrentActivity();
|
|
111
|
+
if (currentActivity == null) {
|
|
112
|
+
callback.invoke(getErrorMap(errOthers, "Activity error"));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this.callback = callback;
|
|
117
|
+
this.options = new Options(options);
|
|
118
|
+
|
|
119
|
+
int requestCode;
|
|
120
|
+
Intent libraryIntent;
|
|
121
|
+
requestCode = REQUEST_LAUNCH_LIBRARY;
|
|
122
|
+
|
|
123
|
+
int selectionLimit = this.options.selectionLimit;
|
|
124
|
+
boolean isSingleSelect = selectionLimit == 1;
|
|
125
|
+
boolean isPhoto = this.options.mediaType.equals(mediaTypePhoto);
|
|
126
|
+
boolean isVideo = this.options.mediaType.equals(mediaTypeVideo);
|
|
127
|
+
|
|
128
|
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
129
|
+
if (isSingleSelect && (isPhoto || isVideo)) {
|
|
130
|
+
libraryIntent = new Intent(Intent.ACTION_PICK);
|
|
131
|
+
} else {
|
|
132
|
+
libraryIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
|
133
|
+
libraryIntent.addCategory(Intent.CATEGORY_OPENABLE);
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
libraryIntent = new Intent(MediaStore.ACTION_PICK_IMAGES);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!isSingleSelect) {
|
|
140
|
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
141
|
+
libraryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
|
|
142
|
+
} else {
|
|
143
|
+
if (selectionLimit != 1) {
|
|
144
|
+
int maxNum = selectionLimit;
|
|
145
|
+
if (selectionLimit == 0) maxNum = MediaStore.getPickImagesMaxLimit();
|
|
146
|
+
libraryIntent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNum);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (isPhoto) {
|
|
152
|
+
libraryIntent.setType("image/*");
|
|
153
|
+
} else if (isVideo) {
|
|
154
|
+
libraryIntent.setType("video/*");
|
|
155
|
+
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
156
|
+
libraryIntent.setType("*/*");
|
|
157
|
+
libraryIntent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
currentActivity.startActivityForResult(libraryIntent, requestCode);
|
|
162
|
+
} catch (ActivityNotFoundException e) {
|
|
163
|
+
callback.invoke(getErrorMap(errOthers, e.getMessage()));
|
|
164
|
+
this.callback = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
void onAssetsObtained(List<Uri> fileUris) {
|
|
169
|
+
ExecutorService executor = Executors.newSingleThreadExecutor();
|
|
170
|
+
|
|
171
|
+
executor.submit(() -> {
|
|
172
|
+
try {
|
|
173
|
+
callback.invoke(getResponseMap(fileUris, options, reactContext));
|
|
174
|
+
} catch (RuntimeException exception) {
|
|
175
|
+
callback.invoke(getErrorMap(errOthers, exception.getMessage()));
|
|
176
|
+
} finally {
|
|
177
|
+
callback = null;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
@Override
|
|
183
|
+
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
|
|
184
|
+
|
|
185
|
+
// onActivityResult is called even when ActivityNotFoundException occurs
|
|
186
|
+
if (!isValidRequestCode(requestCode) || (this.callback == null)) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (resultCode != Activity.RESULT_OK) {
|
|
191
|
+
if (requestCode == REQUEST_LAUNCH_IMAGE_CAPTURE) {
|
|
192
|
+
deleteFile(fileUri);
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
callback.invoke(getCancelMap());
|
|
196
|
+
return;
|
|
197
|
+
} catch (RuntimeException exception) {
|
|
198
|
+
callback.invoke(getErrorMap(errOthers, exception.getMessage()));
|
|
199
|
+
} finally {
|
|
200
|
+
callback = null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
switch (requestCode) {
|
|
205
|
+
case REQUEST_LAUNCH_IMAGE_CAPTURE:
|
|
206
|
+
if (options.saveToPhotos) {
|
|
207
|
+
saveToPublicDirectory(cameraCaptureURI, reactContext, "photo");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
onAssetsObtained(Collections.singletonList(fileUri));
|
|
211
|
+
break;
|
|
212
|
+
|
|
213
|
+
case REQUEST_LAUNCH_LIBRARY:
|
|
214
|
+
onAssetsObtained(collectUrisFromData(data));
|
|
215
|
+
break;
|
|
216
|
+
|
|
217
|
+
case REQUEST_LAUNCH_VIDEO_CAPTURE:
|
|
218
|
+
if (options.saveToPhotos) {
|
|
219
|
+
saveToPublicDirectory(cameraCaptureURI, reactContext, "video");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
onAssetsObtained(Collections.singletonList(fileUri));
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@Override
|
|
228
|
+
public void onNewIntent(Intent intent) {
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
|
|
2
|
+
package com.shakebug;
|
|
3
|
+
|
|
4
|
+
import android.app.Activity;
|
|
5
|
+
import android.content.Context;
|
|
6
|
+
import android.net.Uri;
|
|
7
|
+
import android.os.AsyncTask;
|
|
8
|
+
import androidx.annotation.NonNull;
|
|
9
|
+
import android.util.DisplayMetrics;
|
|
10
|
+
import android.util.Log;
|
|
11
|
+
|
|
12
|
+
import com.facebook.react.bridge.GuardedAsyncTask;
|
|
13
|
+
import com.facebook.react.bridge.Promise;
|
|
14
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
15
|
+
import com.facebook.react.bridge.ReactContext;
|
|
16
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
17
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
18
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
19
|
+
import com.facebook.react.uimanager.UIManagerModule;
|
|
20
|
+
|
|
21
|
+
import java.io.File;
|
|
22
|
+
import java.io.FilenameFilter;
|
|
23
|
+
import java.io.IOException;
|
|
24
|
+
import java.util.Collections;
|
|
25
|
+
import java.util.Map;
|
|
26
|
+
import java.util.concurrent.Executor;
|
|
27
|
+
import java.util.concurrent.Executors;
|
|
28
|
+
|
|
29
|
+
import com.shakebug.ViewShot.Formats;
|
|
30
|
+
import com.shakebug.ViewShot.Results;
|
|
31
|
+
|
|
32
|
+
public class ShakebugSDKScreenShotModule extends ReactContextBaseJavaModule {
|
|
33
|
+
|
|
34
|
+
public static final String RNVIEW_SHOT = "ShakebugSDKRNViewShot";
|
|
35
|
+
|
|
36
|
+
private final ReactApplicationContext reactContext;
|
|
37
|
+
|
|
38
|
+
private final Executor executor = Executors.newCachedThreadPool();
|
|
39
|
+
|
|
40
|
+
public ShakebugSDKScreenShotModule(ReactApplicationContext reactContext) {
|
|
41
|
+
super(reactContext);
|
|
42
|
+
this.reactContext = reactContext;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Override
|
|
46
|
+
public String getName() {
|
|
47
|
+
return RNVIEW_SHOT;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Override
|
|
51
|
+
public Map<String, Object> getConstants() {
|
|
52
|
+
return Collections.emptyMap();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@Override
|
|
56
|
+
public void onCatalystInstanceDestroy() {
|
|
57
|
+
super.onCatalystInstanceDestroy();
|
|
58
|
+
new CleanTask(getReactApplicationContext()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@ReactMethod
|
|
62
|
+
public void releaseCapture(String uri) {
|
|
63
|
+
final String path = Uri.parse(uri).getPath();
|
|
64
|
+
if (path == null) return;
|
|
65
|
+
File file = new File(path);
|
|
66
|
+
if (!file.exists()) return;
|
|
67
|
+
File parent = file.getParentFile();
|
|
68
|
+
if (parent.equals(reactContext.getExternalCacheDir()) || parent.equals(reactContext.getCacheDir())) {
|
|
69
|
+
file.delete();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@ReactMethod
|
|
74
|
+
public void captureRef(int tag, ReadableMap options, Promise promise) {
|
|
75
|
+
final ReactApplicationContext context = getReactApplicationContext();
|
|
76
|
+
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
|
|
77
|
+
|
|
78
|
+
final String extension = options.getString("format");
|
|
79
|
+
final int imageFormat = "jpg".equals(extension)
|
|
80
|
+
? Formats.JPEG
|
|
81
|
+
: "webm".equals(extension)
|
|
82
|
+
? Formats.WEBP
|
|
83
|
+
: "raw".equals(extension)
|
|
84
|
+
? Formats.RAW
|
|
85
|
+
: Formats.PNG;
|
|
86
|
+
|
|
87
|
+
final double quality = options.getDouble("quality");
|
|
88
|
+
final Integer scaleWidth = options.hasKey("width") ? options.getInt("width") : null;
|
|
89
|
+
final Integer scaleHeight = options.hasKey("height") ? options.getInt("height") : null;
|
|
90
|
+
final String resultStreamFormat = options.getString("result");
|
|
91
|
+
final String fileName = options.hasKey("fileName") ? options.getString("fileName") : null;
|
|
92
|
+
final Boolean snapshotContentContainer = options.getBoolean("snapshotContentContainer");
|
|
93
|
+
final boolean handleGLSurfaceView = options.hasKey("handleGLSurfaceViewOnAndroid") && options.getBoolean("handleGLSurfaceViewOnAndroid");
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
File outputFile = null;
|
|
97
|
+
if (Results.TEMP_FILE.equals(resultStreamFormat)) {
|
|
98
|
+
outputFile = createTempFile(getReactApplicationContext(), extension, fileName);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
final Activity activity = getCurrentActivity();
|
|
102
|
+
final UIManagerModule uiManager = this.reactContext.getNativeModule(UIManagerModule.class);
|
|
103
|
+
|
|
104
|
+
uiManager.addUIBlock(new ViewShot(
|
|
105
|
+
tag, extension, imageFormat, quality,
|
|
106
|
+
scaleWidth, scaleHeight, outputFile, resultStreamFormat,
|
|
107
|
+
snapshotContentContainer, reactContext, activity, handleGLSurfaceView, promise, executor)
|
|
108
|
+
);
|
|
109
|
+
} catch (final Throwable ex) {
|
|
110
|
+
Log.e(RNVIEW_SHOT, "Failed to snapshot view tag " + tag, ex);
|
|
111
|
+
promise.reject(ViewShot.ERROR_UNABLE_TO_SNAPSHOT, "Failed to snapshot view tag " + tag);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@ReactMethod
|
|
116
|
+
public void captureScreen(ReadableMap options, Promise promise) {
|
|
117
|
+
captureRef(-1, options, promise);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private static final String TEMP_FILE_PREFIX = "ReactNative-snapshot-image";
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Asynchronous task that cleans up cache dirs (internal and, if available, external) of cropped
|
|
124
|
+
* image files. This is run when the catalyst instance is being destroyed (i.e. app is shutting
|
|
125
|
+
* down) and when the module is instantiated, to handle the case where the app crashed.
|
|
126
|
+
*/
|
|
127
|
+
private static class CleanTask extends GuardedAsyncTask<Void, Void> implements FilenameFilter {
|
|
128
|
+
private final File cacheDir;
|
|
129
|
+
private final File externalCacheDir;
|
|
130
|
+
|
|
131
|
+
private CleanTask(ReactContext context) {
|
|
132
|
+
super(context);
|
|
133
|
+
|
|
134
|
+
cacheDir = context.getCacheDir();
|
|
135
|
+
externalCacheDir = context.getExternalCacheDir();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@Override
|
|
139
|
+
protected void doInBackgroundGuarded(Void... params) {
|
|
140
|
+
if (null != cacheDir) {
|
|
141
|
+
cleanDirectory(cacheDir);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (externalCacheDir != null) {
|
|
145
|
+
cleanDirectory(externalCacheDir);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@Override
|
|
150
|
+
public final boolean accept(File dir, String filename) {
|
|
151
|
+
return filename.startsWith(TEMP_FILE_PREFIX);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private void cleanDirectory(@NonNull final File directory) {
|
|
155
|
+
final File[] toDelete = directory.listFiles(this);
|
|
156
|
+
|
|
157
|
+
if (toDelete != null) {
|
|
158
|
+
for (File file : toDelete) {
|
|
159
|
+
if (file.delete()) {
|
|
160
|
+
Log.d(RNVIEW_SHOT, "deleted file: " + file.getAbsolutePath());
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Create a temporary file in the cache directory on either internal or external storage,
|
|
169
|
+
* whichever is available and has more free space.
|
|
170
|
+
*/
|
|
171
|
+
@NonNull
|
|
172
|
+
private File createTempFile(@NonNull final Context context, @NonNull final String ext, String fileName) throws IOException {
|
|
173
|
+
final File externalCacheDir = context.getExternalCacheDir();
|
|
174
|
+
final File internalCacheDir = context.getCacheDir();
|
|
175
|
+
final File cacheDir;
|
|
176
|
+
|
|
177
|
+
if (externalCacheDir == null && internalCacheDir == null) {
|
|
178
|
+
throw new IOException("No cache directory available");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (externalCacheDir == null) {
|
|
182
|
+
cacheDir = internalCacheDir;
|
|
183
|
+
} else if (internalCacheDir == null) {
|
|
184
|
+
cacheDir = externalCacheDir;
|
|
185
|
+
} else {
|
|
186
|
+
cacheDir = externalCacheDir.getFreeSpace() > internalCacheDir.getFreeSpace() ?
|
|
187
|
+
externalCacheDir : internalCacheDir;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
final String suffix = "." + ext;
|
|
191
|
+
if (fileName != null) {
|
|
192
|
+
return File.createTempFile(fileName, suffix, cacheDir);
|
|
193
|
+
}
|
|
194
|
+
return File.createTempFile(TEMP_FILE_PREFIX, suffix, cacheDir);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// SharedPreferencesModule.java
|
|
2
|
+
|
|
3
|
+
package com.shakebug;
|
|
4
|
+
|
|
5
|
+
import android.content.Context;
|
|
6
|
+
import android.content.SharedPreferences;
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
8
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
9
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
10
|
+
import com.facebook.react.bridge.Promise;
|
|
11
|
+
|
|
12
|
+
public class SharedPreferencesModule extends ReactContextBaseJavaModule {
|
|
13
|
+
private static final String PREFS_NAME = "MyPrefsFile";
|
|
14
|
+
private SharedPreferences sharedPreferences;
|
|
15
|
+
|
|
16
|
+
public SharedPreferencesModule(ReactApplicationContext reactContext) {
|
|
17
|
+
super(reactContext);
|
|
18
|
+
sharedPreferences = reactContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Override
|
|
22
|
+
public String getName() {
|
|
23
|
+
return "ShakebugSDKSharedPreferencesModule";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@ReactMethod
|
|
27
|
+
public void getString(String key, Promise promise) {
|
|
28
|
+
String value = sharedPreferences.getString(key, "");
|
|
29
|
+
promise.resolve(value);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@ReactMethod
|
|
33
|
+
public void setString(String key, String value, Promise promise) {
|
|
34
|
+
SharedPreferences.Editor editor = sharedPreferences.edit();
|
|
35
|
+
editor.putString(key, value);
|
|
36
|
+
editor.apply();
|
|
37
|
+
promise.resolve(null);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package com.shakebug;
|
|
2
|
+
|
|
3
|
+
import android.util.DisplayMetrics;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Created by choujason on 7/31/16.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
public class UnitConverter {
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
public static DisplayMetrics getDisplayMetrics(){
|
|
13
|
+
|
|
14
|
+
return BaseUtils.getContext().getResources().getDisplayMetrics();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public static float dpToPx(float dp) {
|
|
18
|
+
return dp * getDisplayMetrics().density;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public static int dpToPx(int dp) {
|
|
22
|
+
return (int) (dp * getDisplayMetrics().density + 0.5f);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public static float pxToDp(float px) {
|
|
26
|
+
return px / getDisplayMetrics().density;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public static int pxToDp(int px) {
|
|
30
|
+
return (int) (px / getDisplayMetrics().density + 0.5f);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static float spToPx(float sp) {
|
|
34
|
+
return sp * getDisplayMetrics().scaledDensity;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public static int spToPx(int sp) {
|
|
38
|
+
return (int) (sp * getDisplayMetrics().scaledDensity + 0.5f);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public static float pxToSp(float px) {
|
|
42
|
+
return px / getDisplayMetrics().scaledDensity;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public static int pxToSp(int px) {
|
|
46
|
+
return (int) (px / getDisplayMetrics().scaledDensity + 0.5f);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package com.shakebug;
|
|
2
|
+
|
|
3
|
+
import android.util.Log;
|
|
4
|
+
import android.graphics.RectF;
|
|
5
|
+
|
|
6
|
+
public final class Utility {
|
|
7
|
+
public static RectF fillImage(float imgWidth, float imgHeight, float targetWidth, float targetHeight, String mode) {
|
|
8
|
+
float imageAspectRatio = imgWidth / imgHeight;
|
|
9
|
+
float targetAspectRatio = targetWidth / targetHeight;
|
|
10
|
+
switch (mode) {
|
|
11
|
+
case "AspectFill": {
|
|
12
|
+
float scaleFactor = targetAspectRatio < imageAspectRatio ? targetHeight / imgHeight : targetWidth / imgWidth;
|
|
13
|
+
float w = imgWidth * scaleFactor, h = imgHeight * scaleFactor;
|
|
14
|
+
return new RectF((targetWidth - w) / 2, (targetHeight - h) / 2,
|
|
15
|
+
w + (targetWidth - w) / 2, h + (targetHeight - h) / 2);
|
|
16
|
+
}
|
|
17
|
+
case "AspectFit":
|
|
18
|
+
default: {
|
|
19
|
+
float scaleFactor = targetAspectRatio > imageAspectRatio ? targetHeight / imgHeight : targetWidth / imgWidth;
|
|
20
|
+
float w = imgWidth * scaleFactor, h = imgHeight * scaleFactor;
|
|
21
|
+
return new RectF((targetWidth - w) / 2, (targetHeight - h) / 2,
|
|
22
|
+
w + (targetWidth - w) / 2, h + (targetHeight - h) / 2);
|
|
23
|
+
}
|
|
24
|
+
case "ScaleToFill": {
|
|
25
|
+
return new RectF(0, 0, targetWidth, targetHeight);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|