From 8784426c9ead28edca9b0181ca44d210215687d1 Mon Sep 17 00:00:00 2001 From: Marty Fuhry Date: Tue, 5 Mar 2024 14:21:26 -0500 Subject: [PATCH] fixing issues with sync between controls --- .../asset_viewer/hooks/chewiew_controller_hook.dart | 4 +++- .../providers/video_player_controls_provider.dart | 8 ++++++++ .../ui/custom_video_player_controls.dart | 7 ++++++- .../modules/asset_viewer/views/gallery_viewer.dart | 2 +- .../asset_viewer/views/video_viewer_page.dart | 13 +++++++++---- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/mobile/lib/modules/asset_viewer/hooks/chewiew_controller_hook.dart b/mobile/lib/modules/asset_viewer/hooks/chewiew_controller_hook.dart index ca015e1816..2192963fa1 100644 --- a/mobile/lib/modules/asset_viewer/hooks/chewiew_controller_hook.dart +++ b/mobile/lib/modules/asset_viewer/hooks/chewiew_controller_hook.dart @@ -31,6 +31,7 @@ ChewieController? useChewieController( }) { return use( _ChewieControllerHook( + keys: [asset], asset: asset, placeholder: placeholder, showOptions: showOptions, @@ -66,6 +67,7 @@ class _ChewieControllerHook extends Hook { final VoidCallback? onVideoEnded; const _ChewieControllerHook({ + super.keys, required this.asset, this.controlsSafeAreaMinimum = const EdgeInsets.only( bottom: 100, @@ -94,7 +96,7 @@ class _ChewieControllerHookState VideoPlayerController? videoPlayerController; @override - void initHook() async { + void initHook() { super.initHook(); _initialize().whenComplete(() => setState(() {})); } diff --git a/mobile/lib/modules/asset_viewer/providers/video_player_controls_provider.dart b/mobile/lib/modules/asset_viewer/providers/video_player_controls_provider.dart index 0821600a10..d935358936 100644 --- a/mobile/lib/modules/asset_viewer/providers/video_player_controls_provider.dart +++ b/mobile/lib/modules/asset_viewer/providers/video_player_controls_provider.dart @@ -35,6 +35,14 @@ class VideoPlayerControls extends StateNotifier { state = value; } + void reset() { + state = VideoPlaybackControls( + position: 0, + pause: false, + mute: false, + ); + } + double get position => state.position; bool get mute => state.mute; diff --git a/mobile/lib/modules/asset_viewer/ui/custom_video_player_controls.dart b/mobile/lib/modules/asset_viewer/ui/custom_video_player_controls.dart index 683c255b67..0e8f14301a 100644 --- a/mobile/lib/modules/asset_viewer/ui/custom_video_player_controls.dart +++ b/mobile/lib/modules/asset_viewer/ui/custom_video_player_controls.dart @@ -61,7 +61,12 @@ class CustomVideoPlayerControls extends HookConsumerWidget { /// Toggles between playing and pausing depending on the state of the video void togglePlay() { showControlsAndStartHideTimer(); - ref.read(videoPlayerControlsProvider.notifier).togglePlay(); + final state = ref.read(videoPlaybackValueProvider).state; + if (state == VideoPlaybackState.playing) { + ref.read(videoPlayerControlsProvider.notifier).pause(); + } else { + ref.read(videoPlayerControlsProvider.notifier).play(); + } } return GestureDetector( diff --git a/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart b/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart index b06c383e36..c465ff8701 100644 --- a/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart +++ b/mobile/lib/modules/asset_viewer/views/gallery_viewer.dart @@ -446,7 +446,7 @@ class GalleryViewerPage extends HookConsumerWidget { child: VideoViewerPage( key: ValueKey(a), asset: a, - isMotionVideo: isPlayingVideo.value, + isMotionVideo: a.livePhotoVideoId != null, placeholder: Image( image: provider, fit: BoxFit.contain, diff --git a/mobile/lib/modules/asset_viewer/views/video_viewer_page.dart b/mobile/lib/modules/asset_viewer/views/video_viewer_page.dart index a164f242c5..41417decb2 100644 --- a/mobile/lib/modules/asset_viewer/views/video_viewer_page.dart +++ b/mobile/lib/modules/asset_viewer/views/video_viewer_page.dart @@ -96,8 +96,12 @@ class VideoViewerPage extends HookConsumerWidget { // Enable the WakeLock while the video is playing if (state == VideoPlaybackState.playing) { + // Sync with the controls playing + ref.read(videoPlayerControlsProvider.notifier).play(); WakelockPlus.enable(); } else { + // Sync with the controls pause + ref.read(videoPlayerControlsProvider.notifier).pause(); WakelockPlus.disable(); } } @@ -113,9 +117,10 @@ class VideoViewerPage extends HookConsumerWidget { // Hide the controls // Done in a microtask to avoid setting the state while the widget is building if (!isMotionVideo) { - Future.microtask( - () => ref.read(showControlsProvider.notifier).show = false, - ); + Future.microtask(() { + ref.read(showControlsProvider.notifier).show = false; + ref.read(videoPlayerControlsProvider.notifier).reset(); + }); } final video = controller.videoPlayerController.value; @@ -127,8 +132,8 @@ class VideoViewerPage extends HookConsumerWidget { controller.videoPlayerController.addListener(updateVideoPlayback); return () { // Removes listener when we dispose - controller.pause(); controller.videoPlayerController.removeListener(updateVideoPlayback); + controller.pause(); }; }, [controller],