From 92f7bcca32d8341adefc259dbe1d1c4bd30ea43c Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 2 Jun 2020 19:25:01 -0700 Subject: [PATCH 01/10] [video_player_web] Do not parse URIs to not break blobs. --- .../video_player_web/lib/video_player_web.dart | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index 039c3ce65a7e..4dbfe7a41482 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -66,10 +66,13 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { final int textureId = _textureCounter; _textureCounter++; - Uri uri; + String uri; switch (dataSource.sourceType) { case DataSourceType.network: - uri = Uri.parse(dataSource.uri); + // Validate the incoming uri + Uri.parse(dataSource.uri); + // However, do NOT modify the incoming uri, in case it's a Blob! + uri = dataSource.uri; break; case DataSourceType.asset: String assetUrl = dataSource.asset; @@ -79,7 +82,7 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { // 'webOnlyAssetManager' is only in the web version of dart:ui // ignore: undefined_prefixed_name assetUrl = ui.webOnlyAssetManager.getAssetUrl(assetUrl); - uri = Uri.parse(assetUrl); + uri = assetUrl; break; case DataSourceType.file: return Future.error(UnimplementedError( @@ -145,14 +148,14 @@ class _VideoPlayer { final StreamController eventController = StreamController(); - final Uri uri; + final String uri; final int textureId; VideoElement videoElement; bool isInitialized = false; void initialize() { videoElement = VideoElement() - ..src = uri.toString() + ..src = uri ..autoplay = false ..controls = false ..style.border = 'none'; From 0ff1d974a7e7e4711ae3bf4793cd3cde58989fae Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Thu, 4 Jun 2020 13:42:09 -0700 Subject: [PATCH 02/10] [video_player_web] Allow users to 'mute' videos by setting their volume to 0. This enables autoplay without user interaction in most browsers. --- .../video_player_web/lib/video_player_web.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index 4dbfe7a41482..c8b3c8df85a3 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -160,6 +160,9 @@ class _VideoPlayer { ..controls = false ..style.border = 'none'; + // Allows Safari iOS to play the video inline + videoElement.setAttribute('playsinline', 'true'); + // TODO(hterkelsen): Use initialization parameters once they are available // ignore: undefined_prefixed_name ui.platformViewRegistry.registerViewFactory( @@ -221,6 +224,11 @@ class _VideoPlayer { } void setVolume(double value) { + if (value > 0.0) { + videoElement.muted = false; + } else { + videoElement.muted = true; + } videoElement.volume = value; } From 36edf4c53d435707494d49d8cd7f21115824354e Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 5 Jun 2020 13:47:23 -0700 Subject: [PATCH 03/10] [image_picker] Modify example so videos in web start muted. --- .../image_picker/image_picker/example/lib/main.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/example/lib/main.dart b/packages/image_picker/image_picker/example/lib/main.dart index dff2906edf87..71d50c4e9004 100755 --- a/packages/image_picker/image_picker/example/lib/main.dart +++ b/packages/image_picker/image_picker/example/lib/main.dart @@ -54,10 +54,16 @@ class _MyHomePageState extends State { await _disposeVideoController(); if (kIsWeb) { _controller = VideoPlayerController.network(file.path); - } else { + // In web, most browsers won't honor a programmatic call to .play + // if the video has a sound track (and is not muted). + // Mute the video so it auto-plays in web! + // This is not needed if the call to .play is the result of user + // interaction (clicking on a "play" button, for example). + await _controller.setVolume(0.0); + } else { _controller = VideoPlayerController.file(File(file.path)); + await _controller.setVolume(1.0); } - await _controller.setVolume(1.0); await _controller.initialize(); await _controller.setLooping(true); await _controller.play(); From cbaf030c12dd2bcd2896fcedcfe4565c7d64b293 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 5 Jun 2020 13:47:54 -0700 Subject: [PATCH 04/10] [video_player] Fix aspectRatio calculation when sizes are zero. --- 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 f2f9289c1fda..a2290b2e5916 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -97,7 +97,7 @@ class VideoPlayerValue { /// Returns [size.width] / [size.height] when size is non-null, or `1.0.` when /// size is null or the aspect ratio would be less than or equal to 0.0. double get aspectRatio { - if (size == null) { + if (size == null || size.width == 0 || size.height == 0) { return 1.0; } final double aspectRatio = size.width / size.height; From dcf5fede4c52e1f6ab19f2d246ac0a76233274ca Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 5 Jun 2020 15:30:39 -0700 Subject: [PATCH 05/10] [image_picker] Example. Dispose the video controller after it's really not needed. --- packages/image_picker/image_picker/example/lib/main.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker/example/lib/main.dart b/packages/image_picker/image_picker/example/lib/main.dart index 71d50c4e9004..4b5ae028eb60 100755 --- a/packages/image_picker/image_picker/example/lib/main.dart +++ b/packages/image_picker/image_picker/example/lib/main.dart @@ -42,6 +42,7 @@ class _MyHomePageState extends State { dynamic _pickImageError; bool isVideo = false; VideoPlayerController _controller; + VideoPlayerController _toBeDisposed; String _retrieveDataError; final ImagePicker _picker = ImagePicker(); @@ -120,10 +121,11 @@ class _MyHomePageState extends State { } Future _disposeVideoController() async { - if (_controller != null) { - await _controller.dispose(); - _controller = null; + if (_toBeDisposed != null) { + await _toBeDisposed.dispose(); } + _toBeDisposed = _controller; + _controller = null; } Widget _previewVideo() { From 22f899813bb2cdce062dab606c5e545a09a942c9 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 5 Jun 2020 15:41:02 -0700 Subject: [PATCH 06/10] Update pubspecs and changelogs --- packages/image_picker/image_picker/CHANGELOG.md | 6 ++++++ packages/image_picker/image_picker/pubspec.yaml | 2 +- packages/video_player/video_player/CHANGELOG.md | 4 ++++ packages/video_player/video_player/pubspec.yaml | 2 +- packages/video_player/video_player_web/CHANGELOG.md | 5 +++++ packages/video_player/video_player_web/pubspec.yaml | 2 +- 6 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 6b85f26daf33..0cba0c8d92cb 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.7+3 + +* Fixes to the example app: + * Make videos in web start muted. This allows auto-play across browsers. + * Prevent the app from disposing of video controllers too early. + ## 0.6.7+2 * iOS: Fixes unpresentable album/image picker if window's root view controller is already presenting other view controller. diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 4f52b19c2659..eedecd46e1ee 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker -version: 0.6.7+2 +version: 0.6.7+3 flutter: plugin: diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 9928fe31c5a3..e3f49e736411 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.11+2 + +* Fix aspectRatio calculation when size.width or size.height are zero. + ## 0.10.11+1 * Post-v2 Android embedding cleanups. diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index f967cd07ef7f..03f71bf4f412 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for displaying inline video with other Flutter # 0.10.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.10.11+1 +version: 0.10.11+2 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index cd977c335d62..9c500e951122 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.1.3+2 + +* Allow users to set the 'muted' attribute on video elements by setting their volume to 0. +* Do not parse URIs on 'network' videos to not break blobs (Safari). + ## 0.1.3+1 * Remove Android folder from `video_player_web`. diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index 523d5a79a75b..891430d7483b 100644 --- a/packages/video_player/video_player_web/pubspec.yaml +++ b/packages/video_player/video_player_web/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/v # 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.1.3+1 +version: 0.1.3+2 flutter: plugin: From c9eede9d9d88e49b79c7886c31f4da32bd2d70a3 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 5 Jun 2020 15:54:10 -0700 Subject: [PATCH 07/10] dartfmt -w . --- packages/image_picker/image_picker/example/lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/example/lib/main.dart b/packages/image_picker/image_picker/example/lib/main.dart index 4b5ae028eb60..ece8c45d9c8e 100755 --- a/packages/image_picker/image_picker/example/lib/main.dart +++ b/packages/image_picker/image_picker/example/lib/main.dart @@ -61,7 +61,7 @@ class _MyHomePageState extends State { // This is not needed if the call to .play is the result of user // interaction (clicking on a "play" button, for example). await _controller.setVolume(0.0); - } else { + } else { _controller = VideoPlayerController.file(File(file.path)); await _controller.setVolume(1.0); } From 85e1f6baf6d8d73da343a69fd14023f3f1b03686 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 9 Jun 2020 12:15:52 -0700 Subject: [PATCH 08/10] Add aspectRatio unit test. --- .../video_player/test/video_player_test.dart | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) 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 ac8459d0c9e9..ae236def4e57 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -517,6 +517,48 @@ void main() { expect(exactCopy.toString(), original.toString()); }); + + group('aspectRatio', () { + test('640x480 -> 4:3', () { + final value = VideoPlayerValue( + size: Size(640, 480), + duration: Duration(seconds: 1), + ); + expect(value.aspectRatio, 4 / 3); + }); + + test('null size -> 1.0', () { + final value = VideoPlayerValue( + size: null, + duration: Duration(seconds: 1), + ); + expect(value.aspectRatio, 1.0); + }); + + test('height = 0 -> 1.0', () { + final value = VideoPlayerValue( + size: Size(640, 0), + duration: Duration(seconds: 1), + ); + expect(value.aspectRatio, 1.0); + }); + + test('width = 0 -> 1.0', () { + final value = VideoPlayerValue( + size: Size(0, 480), + duration: Duration(seconds: 1), + ); + expect(value.aspectRatio, 1.0); + }); + + test('negative aspect ratio -> 1.0', () { + final value = VideoPlayerValue( + size: Size(640, -480), + duration: Duration(seconds: 1), + ); + expect(value.aspectRatio, 1.0); + }); + }); }); test('VideoProgressColors', () { From 74de2857177546dd74ccd62b837e6b924e569ca3 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Wed, 1 Jul 2020 13:54:24 -0700 Subject: [PATCH 09/10] [video_player_web] Do not try to validate URIs, browsers handle it. --- .../video_player/video_player_web/lib/video_player_web.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index c8b3c8df85a3..5fc562fb2c63 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -69,9 +69,8 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { String uri; switch (dataSource.sourceType) { case DataSourceType.network: - // Validate the incoming uri - Uri.parse(dataSource.uri); - // However, do NOT modify the incoming uri, in case it's a Blob! + // Do NOT modify the incoming uri, it can be a Blob, and Safari doesn't + // like blobs that have changed. uri = dataSource.uri; break; case DataSourceType.asset: From 7e9e3f847e7c84d320c4337e5f77e73bfedf8e3f Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Wed, 1 Jul 2020 14:10:54 -0700 Subject: [PATCH 10/10] [video_player_web] Link to 'muted' API issue. --- packages/video_player/video_player_web/lib/video_player_web.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/video_player/video_player_web/lib/video_player_web.dart b/packages/video_player/video_player_web/lib/video_player_web.dart index 5fc562fb2c63..3a849f45e0c1 100644 --- a/packages/video_player/video_player_web/lib/video_player_web.dart +++ b/packages/video_player/video_player_web/lib/video_player_web.dart @@ -223,6 +223,7 @@ class _VideoPlayer { } void setVolume(double value) { + // TODO: Do we need to expose a "muted" API? https://github.com/flutter/flutter/issues/60721 if (value > 0.0) { videoElement.muted = false; } else {