From af758d4e8516b83015515a87adbef413bb7fbdbe Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 15:39:09 +0530 Subject: [PATCH] [mob][photos] Make dragging of seek bar interactive, both in the seek bar widget and in the video --- .../seek_bar.dart | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index 84b5ddf1e2..de21ea4308 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -2,6 +2,7 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/utils/debouncer.dart"; class SeekBar extends StatefulWidget { final NativeVideoPlayerController controller; @@ -15,7 +16,10 @@ class SeekBar extends StatefulWidget { class _SeekBarState extends State with SingleTickerProviderStateMixin { late final AnimationController _animationController; double _prevPositionFraction = 0.0; - + final _debouncer = Debouncer( + const Duration(milliseconds: 100), + executionInterval: const Duration(milliseconds: 325), + ); @override void initState() { super.initState(); @@ -66,14 +70,18 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { min: 0.0, max: 1.0, value: _animationController.value, - onChanged: (value) {}, + onChanged: (value) { + setState(() { + _animationController.value = value; + }); + _seekTo(value); + }, divisions: 4500, onChangeEnd: (value) { - widget.controller.seekTo((value * widget.duration!).round()); - _animationController.animateTo( - value, - duration: const Duration(microseconds: 0), - ); + setState(() { + _animationController.value = value; + }); + _seekTo(value); }, allowedInteraction: SliderInteraction.tapAndSlide, ), @@ -82,6 +90,14 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { ); } + void _seekTo(double value) { + _debouncer.run(() async { + unawaited( + widget.controller.seekTo((value * widget.duration!).round()), + ); + }); + } + void _startMovingSeekbar() { //Video starts playing after a slight delay. This delay is to ensure that //the seek bar animation starts after the video starts playing. @@ -119,7 +135,7 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { //To immediately set the position to 0 when the ends when playing in loop if (_prevPositionFraction == 1.0 && target == 0.0) { unawaited( - _animationController.animateTo(0, duration: const Duration(seconds: 0)), + _animationController.animateTo(0, duration: Duration.zero), ); }