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,429 @@
|
|
|
1
|
+
package com.shakebug.widgets;
|
|
2
|
+
|
|
3
|
+
import static com.shakebug.utils.VideoTrimmerUtil.RECYCLER_VIEW_PADDING;
|
|
4
|
+
import static com.shakebug.utils.VideoTrimmerUtil.VIDEO_FRAMES_WIDTH;
|
|
5
|
+
|
|
6
|
+
import android.animation.ValueAnimator;
|
|
7
|
+
import android.content.Context;
|
|
8
|
+
import android.content.pm.ActivityInfo;
|
|
9
|
+
import android.content.res.Configuration;
|
|
10
|
+
import android.graphics.Bitmap;
|
|
11
|
+
import android.media.MediaMetadataRetriever;
|
|
12
|
+
import android.media.MediaPlayer;
|
|
13
|
+
import android.net.Uri;
|
|
14
|
+
import android.os.Handler;
|
|
15
|
+
import android.util.AttributeSet;
|
|
16
|
+
import android.view.LayoutInflater;
|
|
17
|
+
import android.view.View;
|
|
18
|
+
import android.view.ViewGroup;
|
|
19
|
+
import android.view.Window;
|
|
20
|
+
import android.view.WindowManager;
|
|
21
|
+
import android.view.animation.LinearInterpolator;
|
|
22
|
+
import android.widget.FrameLayout;
|
|
23
|
+
import android.widget.ImageView;
|
|
24
|
+
import android.widget.MediaController;
|
|
25
|
+
import android.widget.RelativeLayout;
|
|
26
|
+
import android.widget.SeekBar;
|
|
27
|
+
import android.widget.SeekBar.OnSeekBarChangeListener;
|
|
28
|
+
import android.widget.TextView;
|
|
29
|
+
|
|
30
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
31
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
32
|
+
import com.shakebug.DeviceUtil;
|
|
33
|
+
import com.shakebug.R;
|
|
34
|
+
import com.shakebug.adapters.VideoTrimmerAdapter;
|
|
35
|
+
import com.shakebug.interfaces.IVideoTrimmerView;
|
|
36
|
+
import com.shakebug.interfaces.VideoPlayerListner;
|
|
37
|
+
import com.shakebug.thread.BackgroundExecutor;
|
|
38
|
+
import com.shakebug.thread.UiThreadExecutor;
|
|
39
|
+
import com.shakebug.utils.VideoTrimmerUtil;
|
|
40
|
+
|
|
41
|
+
import java.util.Locale;
|
|
42
|
+
import java.util.concurrent.TimeUnit;
|
|
43
|
+
/**
|
|
44
|
+
* Author:Kenil
|
|
45
|
+
* Date: 2024.08.01 2:23 PM
|
|
46
|
+
* Email: who_know_me@163.com
|
|
47
|
+
* Describe:
|
|
48
|
+
*/
|
|
49
|
+
public class VideoPlayerView extends FrameLayout implements IVideoTrimmerView {
|
|
50
|
+
|
|
51
|
+
private static final String TAG = VideoPlayerView.class.getSimpleName();
|
|
52
|
+
|
|
53
|
+
private int mMaxWidth = VIDEO_FRAMES_WIDTH;
|
|
54
|
+
private ReactApplicationContext mContext;
|
|
55
|
+
private RelativeLayout mLinearVideo;
|
|
56
|
+
private ImageView mPlayView;
|
|
57
|
+
private ZVideoView mVideoView;
|
|
58
|
+
// private ImageView mPlayView;
|
|
59
|
+
private ImageView mRedProgressIcon;
|
|
60
|
+
private float mAverageMsPx;//每毫秒所占的px
|
|
61
|
+
private float averagePxMs;//每px所占用的ms毫秒
|
|
62
|
+
private Uri mSourceUri;
|
|
63
|
+
private VideoPlayerListner mOnTrimVideoListener;
|
|
64
|
+
private int mDuration = 0;
|
|
65
|
+
private VideoTrimmerAdapter mVideoThumbAdapter;
|
|
66
|
+
private boolean isFromRestore = false;
|
|
67
|
+
//new
|
|
68
|
+
private long mLeftProgressPos, mRightProgressPos;
|
|
69
|
+
private long mRedProgressBarPos = 0;
|
|
70
|
+
private long scrollPos = 0;
|
|
71
|
+
private int mScaledTouchSlop;
|
|
72
|
+
private int lastScrollX;
|
|
73
|
+
private boolean isSeeking;
|
|
74
|
+
private boolean isOverScaledTouchSlop;
|
|
75
|
+
private int mThumbsTotalCount;
|
|
76
|
+
private ValueAnimator mRedProgressAnimator;
|
|
77
|
+
private Handler mAnimationHandler = new Handler();
|
|
78
|
+
private Boolean mIsPrepared = false;
|
|
79
|
+
private int mMaxDuration = 0;
|
|
80
|
+
|
|
81
|
+
private MediaController mMediaController;
|
|
82
|
+
|
|
83
|
+
private SeekBar mSeekBar;
|
|
84
|
+
|
|
85
|
+
public VideoPlayerView(ReactApplicationContext context, AttributeSet attrs) {
|
|
86
|
+
this(context, attrs, 0, null);
|
|
87
|
+
}
|
|
88
|
+
public VideoPlayerView(ReactApplicationContext context, ReadableMap config, AttributeSet attrs) {
|
|
89
|
+
this(context, attrs, 0, config);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public VideoPlayerView(ReactApplicationContext context, AttributeSet attrs, int defStyleAttr, ReadableMap config) {
|
|
93
|
+
super(context, attrs, defStyleAttr);
|
|
94
|
+
init(context, config);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private void init(ReactApplicationContext context, ReadableMap config) {
|
|
98
|
+
this.mContext = context;
|
|
99
|
+
|
|
100
|
+
// listen to onConfigurationChanged doesn't work for this, it runs too soon
|
|
101
|
+
context.getCurrentActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
102
|
+
LayoutInflater.from(context).inflate(R.layout.video_player_view, this, true);
|
|
103
|
+
|
|
104
|
+
mLinearVideo = findViewById(R.id.layout_surface_view);
|
|
105
|
+
mVideoView = findViewById(R.id.video_loader);
|
|
106
|
+
mPlayView = findViewById(R.id.icon_video_play);
|
|
107
|
+
mSeekBar = findViewById(R.id.videoSeekBar);
|
|
108
|
+
mMediaController = new MediaController(context);
|
|
109
|
+
mVideoThumbAdapter = new VideoTrimmerAdapter(mContext);
|
|
110
|
+
|
|
111
|
+
configure(config);
|
|
112
|
+
setUpListeners();
|
|
113
|
+
setUpSeekBar();
|
|
114
|
+
//
|
|
115
|
+
// setStatusBarColorBlack(context);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
private void setStatusBarColorBlack(ReactApplicationContext context) {
|
|
120
|
+
Window window = context.getCurrentActivity().getWindow();
|
|
121
|
+
if (window != null) {
|
|
122
|
+
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
|
123
|
+
window.setStatusBarColor(context.getResources().getColor(android.R.color.black)); // or any other color you prefer
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public void initVideoByURI(final Uri videoURI) {
|
|
128
|
+
mSourceUri = videoURI;
|
|
129
|
+
mVideoView.setVideoURI(videoURI);
|
|
130
|
+
mVideoView.requestFocus();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private void setUpListeners() {
|
|
134
|
+
mVideoView.setOnPreparedListener(mp -> {
|
|
135
|
+
if (mIsPrepared) return;
|
|
136
|
+
mIsPrepared = true;
|
|
137
|
+
mDuration = mVideoView.getDuration();
|
|
138
|
+
mSeekBar.setMax(mDuration);
|
|
139
|
+
mMediaController.setMediaPlayer(mVideoView);
|
|
140
|
+
mMediaController.setAnchorView(mLinearVideo);
|
|
141
|
+
mMediaController.setEnabled(true);
|
|
142
|
+
setPlayPauseViewIcon(true);
|
|
143
|
+
mVideoView.start(); // Autoplay video
|
|
144
|
+
mAnimationHandler.post(mUpdateSeekBarTask);
|
|
145
|
+
updateDurationText(mDuration);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
mVideoView.setOnCompletionListener(mp -> {
|
|
149
|
+
mVideoView.seekTo((int) mLeftProgressPos);
|
|
150
|
+
mSeekBar.setProgress(mSeekBar.getMax());
|
|
151
|
+
setPlayPauseViewIcon(false);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
findViewById(R.id.cancelBtn).setOnClickListener(view -> {
|
|
155
|
+
mOnTrimVideoListener.onCancel();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
mPlayView.setOnClickListener(view -> {
|
|
159
|
+
playVideoOrPause();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
private void setUpSeekBar() {
|
|
165
|
+
mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
|
|
166
|
+
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
167
|
+
if (fromUser) {
|
|
168
|
+
// This part remains the same as your current implementation
|
|
169
|
+
mVideoView.seekTo(progress);
|
|
170
|
+
updateCurrentDurationText(progress);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
175
|
+
// Optional: Implement what happens when user starts touching the seek bar
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
179
|
+
// Handle seek bar release point behavior here
|
|
180
|
+
if (mVideoView.isPlaying()) {
|
|
181
|
+
mVideoView.pause();
|
|
182
|
+
mAnimationHandler.removeCallbacks(mUpdateSeekBarTask);
|
|
183
|
+
// Resume playing from the release point
|
|
184
|
+
mVideoView.start();
|
|
185
|
+
mAnimationHandler.post(mUpdateSeekBarTask);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private Runnable mUpdateSeekBarTask = new Runnable() {
|
|
192
|
+
public void run() {
|
|
193
|
+
if (mVideoView.isPlaying()) {
|
|
194
|
+
mSeekBar.setProgress(mVideoView.getCurrentPosition());
|
|
195
|
+
updateCurrentDurationText(mVideoView.getCurrentPosition());
|
|
196
|
+
mAnimationHandler.postDelayed(this, 100); // Update every 100 milliseconds
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
private void startShootVideoThumbs(final Context context, final Uri videoUri, int totalThumbsCount, long startPosition, long endPosition) {
|
|
201
|
+
VideoTrimmerUtil.shootVideoThumbInBackground(context, videoUri, totalThumbsCount, startPosition, endPosition,
|
|
202
|
+
(bitmap, interval) -> {
|
|
203
|
+
if (bitmap != null) {
|
|
204
|
+
UiThreadExecutor.runTask("", () -> mVideoThumbAdapter.addBitmaps(bitmap), 0L);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public static String formatTime(long duration) {
|
|
210
|
+
long hours = TimeUnit.MILLISECONDS.toHours(duration);
|
|
211
|
+
long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) % 60;
|
|
212
|
+
long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) % 60;
|
|
213
|
+
return String.format(Locale.getDefault(), "%02d:%02d:%02d", hours, minutes, seconds);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private void updateDurationText(long duration) {
|
|
217
|
+
String durationFormatted = formatTime(duration);
|
|
218
|
+
TextView textViewDuration = findViewById(R.id.textViewDuration);
|
|
219
|
+
textViewDuration.setText(durationFormatted);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private void updateCurrentDurationText(int progress) {
|
|
223
|
+
String currentDurationFormatted = formatTime(progress);
|
|
224
|
+
TextView textViewCurrentDuration = findViewById(R.id.textViewCurrentTime);
|
|
225
|
+
textViewCurrentDuration.setText(currentDurationFormatted);
|
|
226
|
+
}
|
|
227
|
+
private void videoPrepared(MediaPlayer mp) {
|
|
228
|
+
ViewGroup.LayoutParams lp = mVideoView.getLayoutParams();
|
|
229
|
+
int videoWidth = mp.getVideoWidth();
|
|
230
|
+
int videoHeight = mp.getVideoHeight();
|
|
231
|
+
|
|
232
|
+
float videoProportion = (float) videoWidth / (float) videoHeight;
|
|
233
|
+
int screenWidth = mLinearVideo.getWidth();
|
|
234
|
+
int screenHeight = mLinearVideo.getHeight();
|
|
235
|
+
|
|
236
|
+
if (videoHeight > videoWidth) {
|
|
237
|
+
lp.width = screenWidth;
|
|
238
|
+
lp.height = screenHeight;
|
|
239
|
+
} else {
|
|
240
|
+
lp.width = screenWidth;
|
|
241
|
+
float r = videoHeight / (float) videoWidth;
|
|
242
|
+
lp.height = (int) (lp.width * r);
|
|
243
|
+
}
|
|
244
|
+
mVideoView.setLayoutParams(lp);
|
|
245
|
+
mDuration = mVideoView.getDuration();
|
|
246
|
+
|
|
247
|
+
VideoTrimmerUtil.maxShootDuration = mMaxDuration > 0 ? Math.min(mMaxDuration * 1000L, mDuration) : mDuration;
|
|
248
|
+
|
|
249
|
+
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
|
|
250
|
+
mediaMetadataRetriever.setDataSource(mContext, mSourceUri);
|
|
251
|
+
// take first frame
|
|
252
|
+
Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
|
|
253
|
+
int width = VideoTrimmerUtil.THUMB_HEIGHT * bitmap.getWidth() / bitmap.getHeight();
|
|
254
|
+
VideoTrimmerUtil.mThumbWidth = width;
|
|
255
|
+
|
|
256
|
+
if (!getRestoreState()) {
|
|
257
|
+
seekTo((int) mRedProgressBarPos);
|
|
258
|
+
} else {
|
|
259
|
+
setRestoreState(false);
|
|
260
|
+
seekTo((int) mRedProgressBarPos);
|
|
261
|
+
}
|
|
262
|
+
startShootVideoThumbs(mContext, mSourceUri, mThumbsTotalCount, 0, mDuration);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
private void videoCompleted() {
|
|
266
|
+
seekTo(mLeftProgressPos);
|
|
267
|
+
setPlayPauseViewIcon(false);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private void onVideoReset() {
|
|
271
|
+
mVideoView.pause();
|
|
272
|
+
setPlayPauseViewIcon(false);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
private void playVideoOrPause() {
|
|
276
|
+
// mRedProgressBarPos = mVideoView.getCurrentPosition();
|
|
277
|
+
if (mVideoView.isPlaying()) {
|
|
278
|
+
mVideoView.pause();
|
|
279
|
+
mAnimationHandler.removeCallbacks(mUpdateSeekBarTask);
|
|
280
|
+
// pauseRedProgressAnimation();
|
|
281
|
+
} else {
|
|
282
|
+
mVideoView.start();
|
|
283
|
+
mAnimationHandler.post(mUpdateSeekBarTask);
|
|
284
|
+
// playingRedProgressAnimation();
|
|
285
|
+
}
|
|
286
|
+
setPlayPauseViewIcon(mVideoView.isPlaying());
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
public void onVideoPause() {
|
|
290
|
+
if (mVideoView.isPlaying()) {
|
|
291
|
+
seekTo(mLeftProgressPos);//复位
|
|
292
|
+
mVideoView.pause();
|
|
293
|
+
setPlayPauseViewIcon(false);
|
|
294
|
+
// mRedProgressIcon.setVisibility(GONE);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
public void setOnTrimVideoListener(VideoPlayerListner onTrimVideoListener) {
|
|
299
|
+
mOnTrimVideoListener = onTrimVideoListener;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// private void setUpListeners() {
|
|
303
|
+
//
|
|
304
|
+
// mVideoView.setOnPreparedListener(mp -> {
|
|
305
|
+
// if (mIsPrepared) return;
|
|
306
|
+
// mIsPrepared = true;
|
|
307
|
+
// mDuration = mVideoView.getDuration();
|
|
308
|
+
// mMediaController.setMediaPlayer(mVideoView);
|
|
309
|
+
// mMediaController.setAnchorView(mLinearVideo);
|
|
310
|
+
// mMediaController.setEnabled(true);
|
|
311
|
+
//// mVideoView.start(); // Autoplay video
|
|
312
|
+
// });
|
|
313
|
+
//
|
|
314
|
+
// mVideoView.setOnCompletionListener(mp -> {
|
|
315
|
+
// mVideoView.seekTo((int) mLeftProgressPos);
|
|
316
|
+
// });
|
|
317
|
+
//
|
|
318
|
+
// findViewById(R.id.cancelBtn).setOnClickListener(view -> {
|
|
319
|
+
// mOnTrimVideoListener.onCancel();
|
|
320
|
+
// });
|
|
321
|
+
//
|
|
322
|
+
// mPlayView.setOnClickListener(view -> {
|
|
323
|
+
// playVideoOrPause();
|
|
324
|
+
// });
|
|
325
|
+
// }
|
|
326
|
+
|
|
327
|
+
private void seekTo(long msec) {
|
|
328
|
+
mVideoView.seekTo((int) msec);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private boolean getRestoreState() {
|
|
332
|
+
return isFromRestore;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
public void setRestoreState(boolean fromRestore) {
|
|
336
|
+
isFromRestore = fromRestore;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private void setPlayPauseViewIcon(boolean isPlaying) {
|
|
340
|
+
mPlayView.setImageResource(isPlaying ? R.drawable.ic_video_pause_black : R.drawable.ic_video_play_black);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
private void playingRedProgressAnimation() {
|
|
344
|
+
pauseRedProgressAnimation();
|
|
345
|
+
// playingAnimation();
|
|
346
|
+
mAnimationHandler.post(mAnimationRunnable);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
private void playingAnimation() {
|
|
350
|
+
if (mRedProgressIcon.getVisibility() == View.GONE) {
|
|
351
|
+
mRedProgressIcon.setVisibility(View.VISIBLE);
|
|
352
|
+
}
|
|
353
|
+
final LayoutParams params = (LayoutParams) mRedProgressIcon.getLayoutParams();
|
|
354
|
+
int start = (int) (RECYCLER_VIEW_PADDING + (mRedProgressBarPos - scrollPos) * averagePxMs);
|
|
355
|
+
int end = (int) (RECYCLER_VIEW_PADDING + (mRightProgressPos - scrollPos) * averagePxMs);
|
|
356
|
+
mRedProgressAnimator = ValueAnimator.ofInt(start, end).setDuration((mRightProgressPos - scrollPos) - (mRedProgressBarPos - scrollPos));
|
|
357
|
+
mRedProgressAnimator.setInterpolator(new LinearInterpolator());
|
|
358
|
+
mRedProgressAnimator.addUpdateListener(animation -> {
|
|
359
|
+
params.leftMargin = (int) animation.getAnimatedValue();
|
|
360
|
+
mRedProgressIcon.setLayoutParams(params);
|
|
361
|
+
});
|
|
362
|
+
mRedProgressAnimator.start();
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private void pauseRedProgressAnimation() {
|
|
366
|
+
// mRedProgressIcon.clearAnimation();
|
|
367
|
+
if (mRedProgressAnimator != null && mRedProgressAnimator.isRunning()) {
|
|
368
|
+
mAnimationHandler.removeCallbacks(mAnimationRunnable);
|
|
369
|
+
mRedProgressAnimator.cancel();
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private Runnable mAnimationRunnable = () -> updateVideoProgress();
|
|
374
|
+
|
|
375
|
+
private void updateVideoProgress() {
|
|
376
|
+
long currentPosition = mVideoView.getCurrentPosition();
|
|
377
|
+
if (currentPosition >= mRightProgressPos) {
|
|
378
|
+
mRedProgressBarPos = mLeftProgressPos;
|
|
379
|
+
pauseRedProgressAnimation();
|
|
380
|
+
onVideoPause();
|
|
381
|
+
// Set SeekBar progress to max when video ends
|
|
382
|
+
mSeekBar.setProgress(mSeekBar.getMax());
|
|
383
|
+
} else {
|
|
384
|
+
mAnimationHandler.post(mAnimationRunnable);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
@Override
|
|
389
|
+
protected void onDetachedFromWindow() {
|
|
390
|
+
super.onDetachedFromWindow();
|
|
391
|
+
mContext.getCurrentActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Cancel trim thread execute action when finish
|
|
396
|
+
*/
|
|
397
|
+
@Override public void onDestroy() {
|
|
398
|
+
BackgroundExecutor.cancelAll("", true);
|
|
399
|
+
UiThreadExecutor.cancelAll("");
|
|
400
|
+
mContext.getCurrentActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
private int getScreenWidthInPortraitMode() {
|
|
404
|
+
int screenWidth = DeviceUtil.getDeviceWidth();
|
|
405
|
+
int screenHeight = DeviceUtil.getDeviceHeight();
|
|
406
|
+
|
|
407
|
+
// Check the current orientation
|
|
408
|
+
int currentOrientation = getResources().getConfiguration().orientation;
|
|
409
|
+
|
|
410
|
+
// Swap width and height if the current orientation is landscape
|
|
411
|
+
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
|
|
412
|
+
return screenHeight;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
return screenWidth;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
private void configure(ReadableMap config) {
|
|
419
|
+
if (config.hasKey("maxDuration")) {
|
|
420
|
+
this.mMaxDuration = config.getInt("maxDuration");
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (config.hasKey("cancelButtonText")) {
|
|
424
|
+
ImageView tv = findViewById(R.id.cancelBtn);
|
|
425
|
+
// tv.setText(config.getString("cancelButtonText"));
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
}
|
|
429
|
+
}
|