From cb8f90a5d6a571afed35db3ffde9b8ca3cef0f02 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 15 Jul 2021 11:30:34 +0900 Subject: [PATCH] video: restored overlay hiding on manual play --- lib/theme/durations.dart | 1 + lib/widgets/viewer/entry_viewer_stack.dart | 3 ++- lib/widgets/viewer/overlay/notifications.dart | 6 +++++- lib/widgets/viewer/video_action_delegate.dart | 16 ++++++++++++++++ lib/widgets/viewer/visual/entry_page_view.dart | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/theme/durations.dart b/lib/theme/durations.dart index 1f85b0f8c..135e39dd8 100644 --- a/lib/theme/durations.dart +++ b/lib/theme/durations.dart @@ -60,6 +60,7 @@ class Durations { static const collectionScrollMonitoringTimerDelay = Duration(milliseconds: 100); static const highlightJumpDelay = Duration(milliseconds: 400); static const highlightScrollInitDelay = Duration(milliseconds: 800); + static const videoOverlayHideDelay = Duration(milliseconds: 500); static const videoProgressTimerInterval = Duration(milliseconds: 300); static Duration staggeredAnimationDelay = Durations.staggeredAnimation ~/ 6 * timeDilation; static const doubleBackTimerDelay = Duration(milliseconds: 1000); diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 982e7a315..4ea43fd72 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -129,6 +129,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, @override void dispose() { + _videoActionDelegate.dispose(); _overlayAnimationController.dispose(); _overlayVisible.removeListener(_onOverlayVisibleChange); _verticalPager.removeListener(_onVerticalPageControllerChange); @@ -187,7 +188,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, }, child: NotificationListener( onNotification: (notification) { - _overlayVisible.value = !_overlayVisible.value; + _overlayVisible.value = notification.visible ?? !_overlayVisible.value; return true; }, child: Stack( diff --git a/lib/widgets/viewer/overlay/notifications.dart b/lib/widgets/viewer/overlay/notifications.dart index 0d9f733e7..4b7e26dc3 100644 --- a/lib/widgets/viewer/overlay/notifications.dart +++ b/lib/widgets/viewer/overlay/notifications.dart @@ -1,3 +1,7 @@ import 'package:flutter/material.dart'; -class ToggleOverlayNotification extends Notification {} +class ToggleOverlayNotification extends Notification { + final bool? visible; + + const ToggleOverlayNotification({this.visible}); +} diff --git a/lib/widgets/viewer/video_action_delegate.dart b/lib/widgets/viewer/video_action_delegate.dart index 67cd8f282..9e2178c4f 100644 --- a/lib/widgets/viewer/video_action_delegate.dart +++ b/lib/widgets/viewer/video_action_delegate.dart @@ -16,19 +16,29 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/dialogs/video_speed_dialog.dart'; import 'package:aves/widgets/dialogs/video_stream_selection_dialog.dart'; import 'package:aves/widgets/settings/video/video.dart'; +import 'package:aves/widgets/viewer/overlay/notifications.dart'; import 'package:aves/widgets/viewer/video/controller.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class VideoActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMixin { + Timer? _overlayHidingTimer; final CollectionLens? collection; VideoActionDelegate({ required this.collection, }); + void dispose() { + _stopOverlayHidingTimer(); + } + void onActionSelected(BuildContext context, AvesVideoController controller, VideoAction action) { + // make sure overlay is not disappearing when selecting an action + _stopOverlayHidingTimer(); + const ToggleOverlayNotification(visible: true).dispatch(context); + switch (action) { case VideoAction.captureFrame: _captureFrame(context, controller); @@ -170,6 +180,12 @@ class VideoActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix await controller.pause(); } else { await controller.play(); + // hide overlay + _overlayHidingTimer = Timer(Durations.iconAnimation + Durations.videoOverlayHideDelay, () { + const ToggleOverlayNotification(visible: false).dispatch(context); + }); } } + + void _stopOverlayHidingTimer() => _overlayHidingTimer?.cancel(); } diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index 432657db2..1dd0271eb 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -256,7 +256,7 @@ class _EntryPageViewState extends State { ); } - void _onTap() => ToggleOverlayNotification().dispatch(context); + void _onTap() => const ToggleOverlayNotification().dispatch(context); void _onViewStateChanged(MagnifierState v) { final current = _viewStateNotifier.value;