From 990decff908049ff35f04bfcee25e9b8d2619ce2 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Thu, 18 Jan 2024 15:16:01 +1300 Subject: [PATCH 01/21] video_player Fix pause loop on completed --- packages/video_player/video_player/lib/video_player.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index d79f280ccbd..c0bb906ed7a 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -460,7 +460,9 @@ class VideoPlayerController extends ValueNotifier { // position=value.duration. Instead of setting the values directly, // we use pause() and seekTo() to ensure the platform stops playing // and seeks to the last frame of the video. - pause().then((void pauseResult) => seekTo(value.duration)); + if(value.playing){ + pause().then((void pauseResult) => seekTo(value.duration)); + } value = value.copyWith(isCompleted: true); case VideoEventType.bufferingUpdate: value = value.copyWith(buffered: event.buffered); From cccf9d3bf64382a6db38676e5239c6d0ee97f32b Mon Sep 17 00:00:00 2001 From: toddZeil Date: Thu, 18 Jan 2024 16:19:06 +1300 Subject: [PATCH 02/21] video_player Fix pause infinite loop on completed (fix typo) --- packages/video_player/video_player/lib/video_player.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index c0bb906ed7a..a39102472c7 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -460,7 +460,7 @@ class VideoPlayerController extends ValueNotifier { // position=value.duration. Instead of setting the values directly, // we use pause() and seekTo() to ensure the platform stops playing // and seeks to the last frame of the video. - if(value.playing){ + if (value.isPlaying) { pause().then((void pauseResult) => seekTo(value.duration)); } value = value.copyWith(isCompleted: true); From 546e37f3c232e4aee37d056d743b497810573ef6 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Thu, 18 Jan 2024 16:19:24 +1300 Subject: [PATCH 03/21] Fix test calling twice when not needed --- packages/video_player/video_player/test/video_player_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 820061ebec3..35299916f49 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -1246,7 +1246,7 @@ void main() { bool currentIsCompleted = controller.value.isCompleted; - final void Function() isCompletedTest = expectAsync0(() {}, count: 2); + final void Function() isCompletedTest = expectAsync0(() {}); final void Function() isNoLongerCompletedTest = expectAsync0(() {}); bool hasLooped = false; From 05d84796eb974667de19d65d32e2d52bf122ffbd Mon Sep 17 00:00:00 2001 From: toddZeil Date: Thu, 18 Jan 2024 16:21:24 +1300 Subject: [PATCH 04/21] Update version --- packages/video_player/video_player/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 1b169ff64a4..7b128216f41 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/packages/tree/main/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.8.2 +version: 2.8.3 environment: sdk: ">=3.1.0 <4.0.0" From 3d71c14bbc6f19e2e780c15fb7c33d91fcb1076f Mon Sep 17 00:00:00 2001 From: toddZeil Date: Thu, 18 Jan 2024 16:25:51 +1300 Subject: [PATCH 05/21] Update changelog --- packages/video_player/video_player/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index cee8dabec2f..d551f38296d 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,8 +1,13 @@ ## NEXT +* Description of the change. + +## 2.8.3 + * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this package with iOS 11, but will not receive any further updates to the iOS implementation. +* Fix infinite pause loop caused by on completed to call pause even when video is pause. ## 2.8.2 From 58422632207b3a242b5e1141a9fbb4ca59042153 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Thu, 18 Jan 2024 18:59:26 +1300 Subject: [PATCH 06/21] Update changelog after review --- packages/video_player/video_player/CHANGELOG.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index d551f38296d..081c8c3f6d9 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,13 +1,9 @@ -## NEXT - -* Description of the change. - ## 2.8.3 * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this package with iOS 11, but will not receive any further updates to the iOS implementation. -* Fix infinite pause loop caused by on completed to call pause even when video is pause. +* Fixes infinite pause loop caused by call to pause even when video is already paused. ## 2.8.2 From d02d031f2b2ba1889f7e6cabe9fd487f5e7564fd Mon Sep 17 00:00:00 2001 From: toddZeil Date: Fri, 19 Jan 2024 10:06:41 +1300 Subject: [PATCH 07/21] Fix logic after review --- packages/video_player/video_player/lib/video_player.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index a39102472c7..f54d93e8e50 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -462,6 +462,8 @@ class VideoPlayerController extends ValueNotifier { // and seeks to the last frame of the video. if (value.isPlaying) { pause().then((void pauseResult) => seekTo(value.duration)); + } else if (value.position != value.duration) { + seekTo(value.duration); } value = value.copyWith(isCompleted: true); case VideoEventType.bufferingUpdate: From 7de262660601d3a05fd55f87af8b7cfef9f9ea64 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 24 Jan 2024 14:45:41 +1300 Subject: [PATCH 08/21] Update broken test and add new test as requested --- .../video_player/test/video_player_test.dart | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) 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 35299916f49..65c60825078 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -1246,7 +1246,7 @@ void main() { bool currentIsCompleted = controller.value.isCompleted; - final void Function() isCompletedTest = expectAsync0(() {}); + final void Function() isCompletedTest = expectAsync0(() {}, count: 2); final void Function() isNoLongerCompletedTest = expectAsync0(() {}); bool hasLooped = false; @@ -1267,6 +1267,50 @@ void main() { } }); + controller.value = controller.value.copyWith(isPlaying: true); + fakeVideoEventStream.add(VideoEvent(eventType: VideoEventType.completed)); + }); + + test( + 'isCompleted seeks position to max duration and pauses the video first if is playing', + () async { + final VideoPlayerController controller = VideoPlayerController.networkUrl( + _localhostUri, + videoPlayerOptions: VideoPlayerOptions(), + ); + + await controller.initialize(); + + final StreamController fakeVideoEventStream = + fakeVideoPlayerPlatform.streams[controller.textureId]!; + + bool currentIsCompleted = controller.value.isCompleted; + + final void Function() isCompletedTest = expectAsync0(() {}, count: 2); + final void Function() isNoLongerCompletedTest = expectAsync0(() {}); + bool hasLooped = false; + + controller.addListener(() async { + if (currentIsCompleted != controller.value.isCompleted) { + currentIsCompleted = controller.value.isCompleted; + if (controller.value.isCompleted) { + isCompletedTest(); + expect(controller.value.isPlaying, false); + if (!hasLooped) { + hasLooped = !hasLooped; + fakeVideoEventStream.add(VideoEvent( + eventType: VideoEventType.isPlayingStateUpdate, + isPlaying: true)); + } + } else { + isNoLongerCompletedTest(); + expect(controller.value.isPlaying, true); + fakeVideoEventStream + .add(VideoEvent(eventType: VideoEventType.completed)); + } + } + }); + fakeVideoEventStream.add(VideoEvent(eventType: VideoEventType.completed)); }); From b65c9dc05e3c4edc02690248b8b670fa56f8021a Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 13:42:57 +1300 Subject: [PATCH 09/21] Remove un needed test --- .../video_player/test/video_player_test.dart | 43 ------------------- 1 file changed, 43 deletions(-) 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 65c60825078..9c12db54571 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -1271,49 +1271,6 @@ void main() { fakeVideoEventStream.add(VideoEvent(eventType: VideoEventType.completed)); }); - test( - 'isCompleted seeks position to max duration and pauses the video first if is playing', - () async { - final VideoPlayerController controller = VideoPlayerController.networkUrl( - _localhostUri, - videoPlayerOptions: VideoPlayerOptions(), - ); - - await controller.initialize(); - - final StreamController fakeVideoEventStream = - fakeVideoPlayerPlatform.streams[controller.textureId]!; - - bool currentIsCompleted = controller.value.isCompleted; - - final void Function() isCompletedTest = expectAsync0(() {}, count: 2); - final void Function() isNoLongerCompletedTest = expectAsync0(() {}); - bool hasLooped = false; - - controller.addListener(() async { - if (currentIsCompleted != controller.value.isCompleted) { - currentIsCompleted = controller.value.isCompleted; - if (controller.value.isCompleted) { - isCompletedTest(); - expect(controller.value.isPlaying, false); - if (!hasLooped) { - hasLooped = !hasLooped; - fakeVideoEventStream.add(VideoEvent( - eventType: VideoEventType.isPlayingStateUpdate, - isPlaying: true)); - } - } else { - isNoLongerCompletedTest(); - expect(controller.value.isPlaying, true); - fakeVideoEventStream - .add(VideoEvent(eventType: VideoEventType.completed)); - } - } - }); - - fakeVideoEventStream.add(VideoEvent(eventType: VideoEventType.completed)); - }); - test('isCompleted updates on video seek to end', () async { final VideoPlayerController controller = VideoPlayerController.networkUrl( _localhostUri, From 47de4f945e1deac64664ee137c2d01ae87bb6d5f Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 13:44:13 +1300 Subject: [PATCH 10/21] Remove fix that could cause regression --- packages/video_player/video_player/lib/video_player.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index f54d93e8e50..d79f280ccbd 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -460,11 +460,7 @@ class VideoPlayerController extends ValueNotifier { // position=value.duration. Instead of setting the values directly, // we use pause() and seekTo() to ensure the platform stops playing // and seeks to the last frame of the video. - if (value.isPlaying) { - pause().then((void pauseResult) => seekTo(value.duration)); - } else if (value.position != value.duration) { - seekTo(value.duration); - } + pause().then((void pauseResult) => seekTo(value.duration)); value = value.copyWith(isCompleted: true); case VideoEventType.bufferingUpdate: value = value.copyWith(buffered: event.buffered); From 5b54f4ba70628f0517ef78cfb1e6f3ab9384bc3c Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 13:45:13 +1300 Subject: [PATCH 11/21] Update change logs and versions --- packages/video_player/video_player/CHANGELOG.md | 2 +- packages/video_player/video_player/pubspec.yaml | 2 +- packages/video_player/video_player_web/CHANGELOG.md | 4 ++++ packages/video_player/video_player_web/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 081c8c3f6d9..6a7a7f0b8d2 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -3,7 +3,7 @@ * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this package with iOS 11, but will not receive any further updates to the iOS implementation. -* Fixes infinite pause loop caused by call to pause even when video is already paused. +* Web, Fix infinite pause loop caused by seekTo marking the video as completed when already completed. ## 2.8.2 diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 7b128216f41..508210af5a0 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -28,7 +28,7 @@ dependencies: video_player_android: ^2.3.5 video_player_avfoundation: ^2.5.0 video_player_platform_interface: ">=6.1.0 <7.0.0" - video_player_web: ^2.0.0 + video_player_web: ^2.1.4 dev_dependencies: flutter_test: diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 5c9deb860d1..f2a98c62535 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.4 + +* Fixes infinite pause loop caused by seekTo marking the video as completed when already completed. + ## 2.1.3 * Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index 81ad0e6d1bf..96863577ae0 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_web description: Web platform implementation of video_player. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.1.3 +version: 2.1.4 environment: sdk: ">=3.1.0 <4.0.0" From 0da37dfdebab17289192fc1369b208d64edb46cc Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 13:55:55 +1300 Subject: [PATCH 12/21] Don't seek if already at the position --- .../video_player/video_player_web/lib/src/video_player.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 4adb2e1e866..624226aeb84 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -205,8 +205,14 @@ class VideoPlayer { /// Moves the playback head to a new `position`. /// /// `position` cannot be negative. + /// + /// Does nothing if the new position is the same as the current position. void seekTo(Duration position) { assert(!position.isNegative); + //don't seek if video is already at current postiion + if (position.inMilliseconds == (_videoElement.currentTime * 1000).round()) { + return; + } _videoElement.currentTime = position.inMilliseconds.toDouble() / 1000; } From 5ea068958eb4eb43a4bffcbf01e3fa3ae64310c7 Mon Sep 17 00:00:00 2001 From: ToddZeil <120418414+ToddZeil@users.noreply.github.com> Date: Wed, 14 Feb 2024 15:37:14 +1300 Subject: [PATCH 13/21] Update packages/video_player/video_player_web/lib/src/video_player.dart Co-authored-by: David Iglesias --- .../video_player/video_player_web/lib/src/video_player.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 624226aeb84..87fe063bea6 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -209,7 +209,7 @@ class VideoPlayer { /// Does nothing if the new position is the same as the current position. void seekTo(Duration position) { assert(!position.isNegative); - //don't seek if video is already at current postiion + // Don't seek if video is already at position. if (position.inMilliseconds == (_videoElement.currentTime * 1000).round()) { return; } From 73077fd56e9929eb7e4f18ae3f0d9aa04802954c Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 15:42:45 +1300 Subject: [PATCH 14/21] Don't seek if already in the end position --- packages/video_player/video_player/test/video_player_test.dart | 1 - 1 file changed, 1 deletion(-) 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 9c12db54571..820061ebec3 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -1267,7 +1267,6 @@ void main() { } }); - controller.value = controller.value.copyWith(isPlaying: true); fakeVideoEventStream.add(VideoEvent(eventType: VideoEventType.completed)); }); From b2b97487830e868aa226a9ffc167f271ed263e0e Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 16:42:47 +1300 Subject: [PATCH 15/21] Don't update video_player package --- packages/video_player/video_player/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 6a7a7f0b8d2..851d71e24a6 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.8.3 +## NEXT * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this From 5a826922f16fdef94de01ecb8d6bff4d3f1465f0 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 14 Feb 2024 16:43:16 +1300 Subject: [PATCH 16/21] Update comments and add private helper for milliseconds --- .../video_player_web/lib/src/video_player.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 87fe063bea6..5b96b70a4e2 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -210,7 +210,8 @@ class VideoPlayer { void seekTo(Duration position) { assert(!position.isNegative); // Don't seek if video is already at position. - if (position.inMilliseconds == (_videoElement.currentTime * 1000).round()) { + // As seeking when completed will trigger another completed event ('onEnded'), causing an infinite loop + if (position.inMilliseconds == _getVideoCurrentTimeInMilliseconds()) { return; } @@ -220,7 +221,11 @@ class VideoPlayer { /// Returns the current playback head position as a [Duration]. Duration getPosition() { _sendBufferingRangesUpdate(); - return Duration(milliseconds: (_videoElement.currentTime * 1000).round()); + return Duration(milliseconds: _getVideoCurrentTimeInMilliseconds()); + } + + int _getVideoCurrentTimeInMilliseconds() { + return (_videoElement.currentTime * 1000).round(); } /// Sets options From c4a5c9d3f181588b54f9c9ad900b9835ab7325ac Mon Sep 17 00:00:00 2001 From: toddZeil Date: Fri, 16 Feb 2024 15:04:49 +1300 Subject: [PATCH 17/21] Add extra comments, update function to a get --- .../video_player_web/lib/src/video_player.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 5b96b70a4e2..a9b08683084 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -210,8 +210,9 @@ class VideoPlayer { void seekTo(Duration position) { assert(!position.isNegative); // Don't seek if video is already at position. - // As seeking when completed will trigger another completed event ('onEnded'), causing an infinite loop - if (position.inMilliseconds == _getVideoCurrentTimeInMilliseconds()) { + // As seeking when completed will trigger another completed event ('onEnded') + // to avoid potentially firing extra 'onEnded' events when the video is already over + if (position.inMilliseconds == _videoCurrentTimeInMilliseconds) { return; } @@ -221,12 +222,11 @@ class VideoPlayer { /// Returns the current playback head position as a [Duration]. Duration getPosition() { _sendBufferingRangesUpdate(); - return Duration(milliseconds: _getVideoCurrentTimeInMilliseconds()); + return Duration(milliseconds: _videoCurrentTimeInMilliseconds); } - int _getVideoCurrentTimeInMilliseconds() { - return (_videoElement.currentTime * 1000).round(); - } + int get _videoCurrentTimeInMilliseconds => + (_videoElement.currentTime * 1000).round(); /// Sets options Future setOptions(VideoPlayerWebOptions options) async { From e9d6fbe0c839f14227776e7a5892eb1758235dfb Mon Sep 17 00:00:00 2001 From: toddZeil Date: Tue, 20 Feb 2024 10:18:25 +1300 Subject: [PATCH 18/21] Remove changes to video_player --- packages/video_player/video_player/CHANGELOG.md | 1 - packages/video_player/video_player/pubspec.yaml | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 851d71e24a6..cee8dabec2f 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -3,7 +3,6 @@ * Updates support matrix in README to indicate that iOS 11 is no longer supported. * Clients on versions of Flutter that still support iOS 11 can continue to use this package with iOS 11, but will not receive any further updates to the iOS implementation. -* Web, Fix infinite pause loop caused by seekTo marking the video as completed when already completed. ## 2.8.2 diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 508210af5a0..1b169ff64a4 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/packages/tree/main/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.8.3 +version: 2.8.2 environment: sdk: ">=3.1.0 <4.0.0" @@ -28,7 +28,7 @@ dependencies: video_player_android: ^2.3.5 video_player_avfoundation: ^2.5.0 video_player_platform_interface: ">=6.1.0 <7.0.0" - video_player_web: ^2.1.4 + video_player_web: ^2.0.0 dev_dependencies: flutter_test: From 30162ec78fbd9a7e4da015e57c45ff3de8defdf7 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 21 Feb 2024 11:54:24 +1300 Subject: [PATCH 19/21] Updates after review --- packages/video_player/video_player_web/CHANGELOG.md | 2 +- .../video_player/video_player_web/lib/src/video_player.dart | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 3ac03fd6dc6..52e7e599328 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.1.4 -* Fixes infinite pause loop caused by seekTo marking the video as completed when already completed. +* Fixes infinite pause loop caused by `seekTo` marking the video as completed when already completed. * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index a9b08683084..3bd81897944 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -209,9 +209,9 @@ class VideoPlayer { /// Does nothing if the new position is the same as the current position. void seekTo(Duration position) { assert(!position.isNegative); - // Don't seek if video is already at position. - // As seeking when completed will trigger another completed event ('onEnded') - // to avoid potentially firing extra 'onEnded' events when the video is already over + // Don't seek if video is already at target position + // as seeking when completed will trigger another completed event ('onEnded'). + // This avoids potentially firing extra 'onEnded' events. if (position.inMilliseconds == _videoCurrentTimeInMilliseconds) { return; } From af527eb9cd17678f073aa60e2ebd6b9c36d3a9b1 Mon Sep 17 00:00:00 2001 From: toddZeil Date: Wed, 21 Feb 2024 11:57:31 +1300 Subject: [PATCH 20/21] Update version and changelog --- packages/video_player/video_player_web/CHANGELOG.md | 6 ++++-- packages/video_player/video_player_web/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index 52e7e599328..bdac43ac99a 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,8 +1,10 @@ -## 2.1.4 +## 2.2.1 * Fixes infinite pause loop caused by `seekTo` marking the video as completed when already completed. -* Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. +## 2.2.0 + +* Updates SDK version to Dart `^3.3.0`. Flutter `^3.19.0`. ## 2.1.3 diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index 96863577ae0..034457cbf31 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_web description: Web platform implementation of video_player. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.1.4 +version: 2.2.1 environment: sdk: ">=3.1.0 <4.0.0" From dda2702b59a534af092ae6fc63327807f60453ea Mon Sep 17 00:00:00 2001 From: ToddZeil <120418414+ToddZeil@users.noreply.github.com> Date: Wed, 21 Feb 2024 12:20:57 +1300 Subject: [PATCH 21/21] Update packages/video_player/video_player_web/lib/src/video_player.dart Co-authored-by: David Iglesias --- .../video_player_web/lib/src/video_player.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player_web/lib/src/video_player.dart b/packages/video_player/video_player_web/lib/src/video_player.dart index 3bd81897944..c665b91eed8 100644 --- a/packages/video_player/video_player_web/lib/src/video_player.dart +++ b/packages/video_player/video_player_web/lib/src/video_player.dart @@ -209,9 +209,13 @@ class VideoPlayer { /// Does nothing if the new position is the same as the current position. void seekTo(Duration position) { assert(!position.isNegative); - // Don't seek if video is already at target position - // as seeking when completed will trigger another completed event ('onEnded'). - // This avoids potentially firing extra 'onEnded' events. + // Don't seek if video is already at target position. + // + // This is needed because the core plugin will pause and seek to the end of + // the video when it finishes, and that causes an infinite loop of `ended` + // events on the web. + // + // See: https://github.com/flutter/flutter/issues/77674 if (position.inMilliseconds == _videoCurrentTimeInMilliseconds) { return; }