From b224f2fd692a4ef5f1ed352d6b665261b32a9b1a Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 9 Nov 2021 12:43:07 -0800 Subject: [PATCH] [video_player] Don't restart when scrubbing to end (#4488) --- .../video_player/video_player/CHANGELOG.md | 5 ++ .../video_player/lib/video_player.dart | 3 +- .../video_player/video_player/pubspec.yaml | 2 +- .../video_player/test/video_player_test.dart | 54 +++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 9eb9d24679d..b0db4dcc990 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.2.7 + +* Fixes a regression where dragging a [VideoProgressIndicator] while playing + would restart playback from the start of the video. + ## 2.2.6 * Initialize player when size and duration become available on iOS diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index fe3437593a8..ff727f1432c 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -784,7 +784,8 @@ class _VideoScrubberState extends State<_VideoScrubber> { seekToRelativePosition(details.globalPosition); }, onHorizontalDragEnd: (DragEndDetails details) { - if (_controllerWasPlaying) { + if (_controllerWasPlaying && + controller.value.position != controller.value.duration) { controller.play(); } }, diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index c002ed859f2..f0d5951b140 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter widgets on Android, iOS, and web. repository: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.2.6 +version: 2.2.7 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart index a929c6827fd..08fd9dc604f 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -478,6 +478,60 @@ void main() { }); }); + group('scrubbing', () { + testWidgets('restarts on release if already playing', + (WidgetTester tester) async { + final VideoPlayerController controller = VideoPlayerController.network( + 'https://127.0.0.1', + ); + await controller.initialize(); + final progressWidget = + VideoProgressIndicator(controller, allowScrubbing: true); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: progressWidget, + )); + + await controller.play(); + expect(controller.value.isPlaying, isTrue); + + final Rect progressRect = tester.getRect(find.byWidget(progressWidget)); + await tester.dragFrom(progressRect.center, Offset(1.0, 0.0)); + await tester.pumpAndSettle(); + + expect(controller.value.position, lessThan(controller.value.duration)); + expect(controller.value.isPlaying, isTrue); + + await controller.pause(); + }); + + testWidgets('does not restart when dragging to end', + (WidgetTester tester) async { + final VideoPlayerController controller = VideoPlayerController.network( + 'https://127.0.0.1', + ); + await controller.initialize(); + final progressWidget = + VideoProgressIndicator(controller, allowScrubbing: true); + + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: progressWidget, + )); + + await controller.play(); + expect(controller.value.isPlaying, isTrue); + + final Rect progressRect = tester.getRect(find.byWidget(progressWidget)); + await tester.dragFrom(progressRect.center, progressRect.centerRight); + await tester.pumpAndSettle(); + + expect(controller.value.position, controller.value.duration); + expect(controller.value.isPlaying, isFalse); + }); + }); + group('caption', () { test('works when seeking', () async { final VideoPlayerController controller = VideoPlayerController.network(