From 66cad2c0c3c16eee08b779f1c4ac2c5d5cb5eaab Mon Sep 17 00:00:00 2001 From: Melissa Byun Date: Tue, 24 Aug 2021 14:53:47 -0700 Subject: [PATCH 1/4] [video_player] add support for content-uri based videos (android only) --- .../video_player/video_player/CHANGELOG.md | 5 ++++- .../video_player/lib/video_player.dart | 21 +++++++++++++++++++ .../video_player/video_player/pubspec.yaml | 4 ++-- .../video_player/test/video_player_test.dart | 9 ++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 9cb642a4db56..454c7b298ee2 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,6 +1,9 @@ -## 2.1.15 +## 2.1.16 * Ensured seekTo isn't called before video player is initialized. Fixes [#89259](https://github.com/flutter/flutter/issues/89259). + +## 2.1.15 + * Updated Android lint settings. ## 2.1.14 diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index b4c4b2b2a311..685563ae12c3 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -222,6 +222,21 @@ class VideoPlayerController extends ValueNotifier { httpHeaders = const {}, super(VideoPlayerValue(duration: Duration.zero)); + /// Constructs a [VideoPlayerController] playing a video from a contentUri. + /// + /// This will load the video from the input content-URI. + /// This is supported on Android only. + VideoPlayerController.contentUri(Uri contentUri, + {this.closedCaptionFile, this.videoPlayerOptions}) + : assert(defaultTargetPlatform == TargetPlatform.android, + 'VideoPlayerController.contentUri is only supported on Android.'), + dataSource = contentUri.toString(), + dataSourceType = DataSourceType.contentUri, + package = null, + formatHint = null, + httpHeaders = const {}, + super(VideoPlayerValue(duration: Duration.zero)); + /// The URI to the video file. This will be in different formats depending on /// the [DataSourceType] of the original video. final String dataSource; @@ -298,6 +313,12 @@ class VideoPlayerController extends ValueNotifier { uri: dataSource, ); break; + case DataSourceType.contentUri: + dataSourceDescription = DataSource( + sourceType: DataSourceType.contentUri, + uri: dataSource, + ); + break; } if (videoPlayerOptions?.mixWithOthers != null) { diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 7f6f608687cc..0c7b68d0d25f 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.1.15 +version: 2.1.16 environment: sdk: ">=2.12.0 <3.0.0" @@ -24,7 +24,7 @@ dependencies: flutter: sdk: flutter meta: ^1.3.0 - video_player_platform_interface: ^4.1.0 + video_player_platform_interface: ^4.2.0 # The design on https://flutter.dev/go/federated-plugins was to leave # this constraint as "any". We cannot do it right now as it fails pub publish # validation, so we set a ^ constraint. The exact value doesn't matter since 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 ad536f840c1d..5fdc1fbf4574 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -284,6 +284,15 @@ void main() { }); }); + test('contentUri', () async { + final VideoPlayerController controller = + VideoPlayerController.contentUri(Uri.parse('content://video')); + await controller.initialize(); + + expect(fakeVideoPlayerPlatform.dataSourceDescriptions[0].uri, + 'content://video'); + }); + test('dispose', () async { final VideoPlayerController controller = VideoPlayerController.network( 'https://127.0.0.1', From 5bc26958620896642bb801dc396f0c44608437c9 Mon Sep 17 00:00:00 2001 From: Melissa Byun Date: Thu, 2 Sep 2021 17:23:06 -0700 Subject: [PATCH 2/4] [video_player] update video_player/video_player minor version --- packages/video_player/video_player/CHANGELOG.md | 5 +++-- packages/video_player/video_player/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 454c7b298ee2..a82455231ecd 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,9 +1,10 @@ -## 2.1.16 +## 2.2.0 -* Ensured seekTo isn't called before video player is initialized. Fixes [#89259](https://github.com/flutter/flutter/issues/89259). +* Add `contentUri` based VideoPlayerController. ## 2.1.15 +* Ensured seekTo isn't called before video player is initialized. Fixes [#89259](https://github.com/flutter/flutter/issues/89259). * Updated Android lint settings. ## 2.1.14 diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 0c7b68d0d25f..86eee3c9bf42 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.1.16 +version: 2.2.0 environment: sdk: ">=2.12.0 <3.0.0" From 2ed528aaa4b82a3c4a803b98afc78714c822fd3b Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 9 Sep 2021 15:13:31 -0700 Subject: [PATCH 3/4] Add video_player_web --- packages/video_player/video_player_web/CHANGELOG.md | 4 ++++ .../integration_test/video_player_web_test.dart | 11 +++++++++++ .../video_player_web/lib/video_player_web.dart | 1 + packages/video_player/video_player_web/pubspec.yaml | 4 ++-- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_web/CHANGELOG.md b/packages/video_player/video_player_web/CHANGELOG.md index a7a198db21e1..4eb7c9d610b5 100644 --- a/packages/video_player/video_player_web/CHANGELOG.md +++ b/packages/video_player/video_player_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.4 + +* Adopt `video_player_platform_interface` 4.2 and opt out of `contentUri` data source. + ## 2.0.3 * Add `implements` to pubspec. diff --git a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart index d3ad80c890f1..2a830c9c573d 100644 --- a/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart +++ b/packages/video_player/video_player_web/example/integration_test/video_player_web_test.dart @@ -68,6 +68,17 @@ void main() { throwsUnimplementedError); }); + testWidgets('cannot create from content URI', (WidgetTester tester) async { + expect( + VideoPlayerPlatform.instance.create( + DataSource( + sourceType: DataSourceType.contentUri, + uri: 'content://video', + ), + ), + throwsUnimplementedError); + }); + testWidgets('can dispose', (WidgetTester tester) async { expect(VideoPlayerPlatform.instance.dispose(await textureId), completes); }); 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 f9e27d16725a..cc2339697ceb 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 @@ -86,6 +86,7 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { uri = assetUrl; break; case DataSourceType.file: + case DataSourceType.contentUri: return Future.error(UnimplementedError( 'web implementation of video_player cannot play local files')); } diff --git a/packages/video_player/video_player_web/pubspec.yaml b/packages/video_player/video_player_web/pubspec.yaml index c5eb57c1fc6e..b401673c628d 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/plugins/tree/master/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.0.3 +version: 2.0.4 environment: sdk: ">=2.12.0 <3.0.0" @@ -22,7 +22,7 @@ dependencies: flutter_web_plugins: sdk: flutter meta: ^1.3.0 - video_player_platform_interface: ^4.0.0 + video_player_platform_interface: ^4.2.0 dev_dependencies: flutter_test: From 9035c2e503859547a00df98f5ad1cb5ac7f11d0a Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 9 Sep 2021 15:20:03 -0700 Subject: [PATCH 4/4] Fix error message --- .../video_player/video_player_web/lib/video_player_web.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 cc2339697ceb..612d22d2eb3f 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 @@ -86,9 +86,11 @@ class VideoPlayerPlugin extends VideoPlayerPlatform { uri = assetUrl; break; case DataSourceType.file: - case DataSourceType.contentUri: return Future.error(UnimplementedError( 'web implementation of video_player cannot play local files')); + case DataSourceType.contentUri: + return Future.error(UnimplementedError( + 'web implementation of video_player cannot play content uri')); } final _VideoPlayer player = _VideoPlayer(