From 3b7f200e324f7d506b620bbe118e50c815b2fb4f Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 22 Feb 2023 20:08:57 +0200 Subject: [PATCH 1/9] Recreating PR from flutter/plugins --- .../video_player/video_player/CHANGELOG.md | 3 +- .../video_player/lib/video_player.dart | 9 +- .../video_player/video_player/pubspec.yaml | 2 +- .../video_player/test/video_player_test.dart | 16 ++++ .../video_player_android/CHANGELOG.md | 7 +- .../plugins/videoplayer/VideoPlayer.java | 49 +++++------ .../plugins/videoplayer/VideoPlayerTest.java | 88 ++++++++++++++++++- .../lib/src/android_video_player.dart | 1 + .../video_player_android/pubspec.yaml | 2 +- .../test/android_video_player_test.dart | 12 +++ 10 files changed, 153 insertions(+), 36 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index eed3b6bc2346..744894a4596e 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 2.5.2 * Updates minimum Flutter version to 3.0. +* Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. ## 2.5.1 diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 5720e2d9d136..d0fe1002ca7b 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -230,7 +230,7 @@ class VideoPlayerController extends ValueNotifier { /// null. /// **Android only**: The [formatHint] option allows the caller to override /// the video format detection code. - /// [httpHeaders] option allows to specify HTTP headers + /// [httpHeaders] option allows to specify HTTP headers. /// for the request to the [dataSource]. VideoPlayerController.network( this.dataSource, { @@ -246,14 +246,16 @@ class VideoPlayerController extends ValueNotifier { /// Constructs a [VideoPlayerController] playing a video from a file. /// /// This will load the file from a file:// URI constructed from [file]'s path. + /// [httpHeaders] option allows to specify HTTP headers, mainly used for hls files like (m3u8) VideoPlayerController.file(File file, - {Future? closedCaptionFile, this.videoPlayerOptions}) + {Future? closedCaptionFile, + this.videoPlayerOptions, + this.httpHeaders = const {}}) : _closedCaptionFileFuture = closedCaptionFile, dataSource = Uri.file(file.absolute.path).toString(), dataSourceType = DataSourceType.file, package = null, formatHint = null, - httpHeaders = const {}, super(VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a contentUri. @@ -344,6 +346,7 @@ class VideoPlayerController extends ValueNotifier { dataSourceDescription = DataSource( sourceType: DataSourceType.file, uri: dataSource, + httpHeaders: httpHeaders, ); break; case DataSourceType.contentUri: diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index d75456ace469..ad3704e6045a 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/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.5.1 +version: 2.5.2 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 663fc9f8e897..73218f7a5d07 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -358,6 +358,22 @@ void main() { reason: 'Actual string: $uri'); }, skip: kIsWeb /* Web does not support file assets. */); + test('file with headers (m3u8)', () async { + final VideoPlayerController controller = VideoPlayerController.file( + File('a.avi'), + httpHeaders: {'Authorization': 'Bearer token'}, + ); + await controller.initialize(); + + final String uri = fakeVideoPlayerPlatform.dataSources[0].uri!; + expect(uri.startsWith('file:///'), true, reason: 'Actual string: $uri'); + expect(uri.endsWith('/a.avi'), true, reason: 'Actual string: $uri'); + + expect( + fakeVideoPlayerPlatform.dataSources[0].httpHeaders, + {'Authorization': 'Bearer token'}, + ); + }, skip: kIsWeb /* Web does not support file assets. */); test('successful initialize on controller with error clears error', () async { final VideoPlayerController controller = VideoPlayerController.network( diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 56024c4ba233..0e8142368fc6 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,6 +1,9 @@ -## NEXT + +## 2.3.11 * Updates minimum Flutter version to 3.0. +* Adds option to configure the User-Agent in the HTTP headers. + ## 2.3.10 @@ -12,6 +15,8 @@ * Fixes violations of new analysis option use_named_constants. * Removes an unnecessary override in example code. + + ## 2.3.9 * Updates ExoPlayer to 2.18.1. diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index e130c995aa2a..0d2d11488e11 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -56,10 +56,14 @@ final class VideoPlayer { private final EventChannel eventChannel; + private final String USER_AGENT = "User-Agent"; + @VisibleForTesting boolean isInitialized = false; private final VideoPlayerOptions options; + private DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory(); + VideoPlayer( Context context, EventChannel eventChannel, @@ -73,23 +77,11 @@ final class VideoPlayer { this.options = options; ExoPlayer exoPlayer = new ExoPlayer.Builder(context).build(); - Uri uri = Uri.parse(dataSource); - DataSource.Factory dataSourceFactory; - if (isHTTP(uri)) { - DefaultHttpDataSource.Factory httpDataSourceFactory = - new DefaultHttpDataSource.Factory() - .setUserAgent("ExoPlayer") - .setAllowCrossProtocolRedirects(true); - - if (httpHeaders != null && !httpHeaders.isEmpty()) { - httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - } - dataSourceFactory = httpDataSourceFactory; - } else { - dataSourceFactory = new DefaultDataSource.Factory(context); - } + buildHttpDataSourceFactory(httpHeaders); + DataSource.Factory dataSourceFactory = + new DefaultDataSource.Factory(context, httpDataSourceFactory); MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); @@ -106,20 +98,29 @@ final class VideoPlayer { EventChannel eventChannel, TextureRegistry.SurfaceTextureEntry textureEntry, VideoPlayerOptions options, - QueuingEventSink eventSink) { + QueuingEventSink eventSink, + DefaultHttpDataSource.Factory httpDataSourceFactory) { this.eventChannel = eventChannel; this.textureEntry = textureEntry; this.options = options; + this.httpDataSourceFactory = httpDataSourceFactory; setUpVideoPlayer(exoPlayer, eventSink); } - private static boolean isHTTP(Uri uri) { - if (uri == null || uri.getScheme() == null) { - return false; + @VisibleForTesting + public void buildHttpDataSourceFactory(@NonNull Map httpHeaders) { + final boolean httpHeadersNotEmpty = httpHeaders != null && !httpHeaders.isEmpty(); + final String userAgent = + httpHeadersNotEmpty && httpHeaders.containsKey(USER_AGENT) + ? httpHeaders.get(USER_AGENT) + : "ExoPlayer"; + + httpDataSourceFactory.setUserAgent(userAgent).setAllowCrossProtocolRedirects(true); + + if (httpHeadersNotEmpty) { + httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); } - String scheme = uri.getScheme(); - return scheme.equals("http") || scheme.equals("https"); } private MediaSource buildMediaSource( @@ -149,13 +150,11 @@ private MediaSource buildMediaSource( switch (type) { case C.CONTENT_TYPE_SS: return new SsMediaSource.Factory( - new DefaultSsChunkSource.Factory(mediaDataSourceFactory), - new DefaultDataSource.Factory(context, mediaDataSourceFactory)) + new DefaultSsChunkSource.Factory(mediaDataSourceFactory), mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_DASH: return new DashMediaSource.Factory( - new DefaultDashChunkSource.Factory(mediaDataSourceFactory), - new DefaultDataSource.Factory(context, mediaDataSourceFactory)) + new DefaultDashChunkSource.Factory(mediaDataSourceFactory), mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_HLS: return new HlsMediaSource.Factory(mediaDataSourceFactory) diff --git a/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java b/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java index 194f7905b63a..f86b83666667 100644 --- a/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java +++ b/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java @@ -5,15 +5,20 @@ package io.flutter.plugins.videoplayer; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import io.flutter.plugin.common.EventChannel; import io.flutter.view.TextureRegistry; import java.util.HashMap; +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -29,6 +34,7 @@ public class VideoPlayerTest { private TextureRegistry.SurfaceTextureEntry fakeSurfaceTextureEntry; private VideoPlayerOptions fakeVideoPlayerOptions; private QueuingEventSink fakeEventSink; + private DefaultHttpDataSource.Factory httpDataSourceFactorySpy; @Captor private ArgumentCaptor> eventCaptor; @@ -41,6 +47,76 @@ public void before() { fakeSurfaceTextureEntry = mock(TextureRegistry.SurfaceTextureEntry.class); fakeVideoPlayerOptions = mock(VideoPlayerOptions.class); fakeEventSink = mock(QueuingEventSink.class); + httpDataSourceFactorySpy = spy(new DefaultHttpDataSource.Factory()); + } + + @Test + public void videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNull() { + VideoPlayer videoPlayer = + new VideoPlayer( + fakeExoPlayer, + fakeEventChannel, + fakeSurfaceTextureEntry, + fakeVideoPlayerOptions, + fakeEventSink, + httpDataSourceFactorySpy); + + videoPlayer.buildHttpDataSourceFactory(new HashMap<>()); + + verify(httpDataSourceFactorySpy).setUserAgent("ExoPlayer"); + verify(httpDataSourceFactorySpy).setAllowCrossProtocolRedirects(true); + verify(httpDataSourceFactorySpy, never()).setDefaultRequestProperties(any()); + } + + @Test + public void + videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNonNullAndUserAgentSpecified() { + VideoPlayer videoPlayer = + new VideoPlayer( + fakeExoPlayer, + fakeEventChannel, + fakeSurfaceTextureEntry, + fakeVideoPlayerOptions, + fakeEventSink, + httpDataSourceFactorySpy); + Map httpHeaders = + new HashMap() { + { + put("header", "value"); + put("User-Agent", "userAgent"); + } + }; + + videoPlayer.buildHttpDataSourceFactory(httpHeaders); + + verify(httpDataSourceFactorySpy).setUserAgent("userAgent"); + verify(httpDataSourceFactorySpy).setAllowCrossProtocolRedirects(true); + verify(httpDataSourceFactorySpy).setDefaultRequestProperties(httpHeaders); + } + + @Test + public void + videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNonNullAndUserAgentNotSpecified() { + VideoPlayer videoPlayer = + new VideoPlayer( + fakeExoPlayer, + fakeEventChannel, + fakeSurfaceTextureEntry, + fakeVideoPlayerOptions, + fakeEventSink, + httpDataSourceFactorySpy); + Map httpHeaders = + new HashMap() { + { + put("header", "value"); + } + }; + + videoPlayer.buildHttpDataSourceFactory(httpHeaders); + + verify(httpDataSourceFactorySpy).setUserAgent("ExoPlayer"); + verify(httpDataSourceFactorySpy).setAllowCrossProtocolRedirects(true); + verify(httpDataSourceFactorySpy).setDefaultRequestProperties(httpHeaders); } @Test @@ -51,7 +127,8 @@ public void sendInitializedSendsExpectedEvent_90RotationDegrees() { fakeEventChannel, fakeSurfaceTextureEntry, fakeVideoPlayerOptions, - fakeEventSink); + fakeEventSink, + httpDataSourceFactorySpy); Format testFormat = new Format.Builder().setWidth(100).setHeight(200).setRotationDegrees(90).build(); @@ -79,7 +156,8 @@ public void sendInitializedSendsExpectedEvent_270RotationDegrees() { fakeEventChannel, fakeSurfaceTextureEntry, fakeVideoPlayerOptions, - fakeEventSink); + fakeEventSink, + httpDataSourceFactorySpy); Format testFormat = new Format.Builder().setWidth(100).setHeight(200).setRotationDegrees(270).build(); @@ -107,7 +185,8 @@ public void sendInitializedSendsExpectedEvent_0RotationDegrees() { fakeEventChannel, fakeSurfaceTextureEntry, fakeVideoPlayerOptions, - fakeEventSink); + fakeEventSink, + httpDataSourceFactorySpy); Format testFormat = new Format.Builder().setWidth(100).setHeight(200).setRotationDegrees(0).build(); @@ -135,7 +214,8 @@ public void sendInitializedSendsExpectedEvent_180RotationDegrees() { fakeEventChannel, fakeSurfaceTextureEntry, fakeVideoPlayerOptions, - fakeEventSink); + fakeEventSink, + httpDataSourceFactorySpy); Format testFormat = new Format.Builder().setWidth(100).setHeight(200).setRotationDegrees(180).build(); diff --git a/packages/video_player/video_player_android/lib/src/android_video_player.dart b/packages/video_player/video_player_android/lib/src/android_video_player.dart index cee6d7d38f66..c8a2b7adbcbd 100644 --- a/packages/video_player/video_player_android/lib/src/android_video_player.dart +++ b/packages/video_player/video_player_android/lib/src/android_video_player.dart @@ -49,6 +49,7 @@ class AndroidVideoPlayer extends VideoPlayerPlatform { break; case DataSourceType.file: uri = dataSource.uri; + httpHeaders = dataSource.httpHeaders; break; case DataSourceType.contentUri: uri = dataSource.uri; diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 3f46ec8a4d79..fd368fb35588 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_android description: Android implementation of the video_player plugin. repository: https://github.com/flutter/plugins/tree/main/packages/video_player/video_player_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.3.10 +version: 2.3.11 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/video_player/video_player_android/test/android_video_player_test.dart b/packages/video_player/video_player_android/test/android_video_player_test.dart index 6aa24e5c1808..00feb2743966 100644 --- a/packages/video_player/video_player_android/test/android_video_player_test.dart +++ b/packages/video_player/video_player_android/test/android_video_player_test.dart @@ -176,6 +176,18 @@ void main() { expect(textureId, 3); }); + test('create with file (some headers)', () async { + final int? textureId = await player.create(DataSource( + sourceType: DataSourceType.file, + uri: 'someUri', + httpHeaders: {'Authorization': 'Bearer token'}, + )); + expect(log.log.last, 'create'); + expect(log.createMessage?.uri, 'someUri'); + expect(log.createMessage?.httpHeaders, + {'Authorization': 'Bearer token'}); + expect(textureId, 3); + }); test('setLooping', () async { await player.setLooping(1, true); expect(log.log.last, 'setLooping'); From 9c74855925c561e78f5d452b4fc4961506ba1676 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Mon, 27 Feb 2023 19:25:44 +0200 Subject: [PATCH 2/9] pump versions for video_player and video_player_android --- packages/video_player/video_player/CHANGELOG.md | 5 ++++- packages/video_player/video_player/pubspec.yaml | 2 +- packages/video_player/video_player_android/CHANGELOG.md | 7 ++++++- packages/video_player/video_player_android/pubspec.yaml | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 802f640e3e19..0e910999ea01 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,8 +1,11 @@ +## 2.5.3 + +* Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. + ## 2.5.2 * Updates links for the merge of flutter/plugins into flutter/packages. * Updates minimum Flutter version to 3.0. -* Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. ## 2.5.1 diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 229af6295a67..6519b109e272 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.5.2 +version: 2.5.3 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 9d07f52d2d04..81d1f5f728fd 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,8 +1,13 @@ +## 2.3.12 + +* Adds option to configure the User-Agent in the HTTP headers. + + ## 2.3.11 * Updates links for the merge of flutter/plugins into flutter/packages. * Updates minimum Flutter version to 3.0. -* Adds option to configure the User-Agent in the HTTP headers. + ## 2.3.10 diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 9d9fc02e2e92..7bf682706137 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_android description: Android implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.3.11 +version: 2.3.12 environment: sdk: ">=2.14.0 <3.0.0" From fe1c4f72e03e0164dc110e63d90c6f658ebd882b Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Thu, 2 Mar 2023 10:41:43 +0200 Subject: [PATCH 3/9] fixed styling and added period --- packages/video_player/video_player/lib/video_player.dart | 2 +- packages/video_player/video_player_android/CHANGELOG.md | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index d0fe1002ca7b..ee711f32d8ae 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -246,7 +246,7 @@ class VideoPlayerController extends ValueNotifier { /// Constructs a [VideoPlayerController] playing a video from a file. /// /// This will load the file from a file:// URI constructed from [file]'s path. - /// [httpHeaders] option allows to specify HTTP headers, mainly used for hls files like (m3u8) + /// [httpHeaders] option allows to specify HTTP headers, mainly used for hls files like (m3u8). VideoPlayerController.file(File file, {Future? closedCaptionFile, this.videoPlayerOptions, diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 81d1f5f728fd..31747434d058 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -2,14 +2,11 @@ * Adds option to configure the User-Agent in the HTTP headers. - ## 2.3.11 * Updates links for the merge of flutter/plugins into flutter/packages. * Updates minimum Flutter version to 3.0. - - ## 2.3.10 * Adds compatibilty with version 6.0 of the platform interface. @@ -20,8 +17,6 @@ * Fixes violations of new analysis option use_named_constants. * Removes an unnecessary override in example code. - - ## 2.3.9 * Updates ExoPlayer to 2.18.1. From 6d7dcb14774574784879458eb8aae1f81edcc056 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 8 Mar 2023 23:49:05 +0200 Subject: [PATCH 4/9] review comments --- packages/video_player/video_player/CHANGELOG.md | 3 ++- packages/video_player/video_player_android/CHANGELOG.md | 3 ++- .../java/io/flutter/plugins/videoplayer/VideoPlayer.java | 2 +- .../io/flutter/plugins/videoplayer/VideoPlayerTest.java | 6 +++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 0e910999ea01..ae07f437bf26 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,6 +1,7 @@ -## 2.5.3 +## 2.6.0 * Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. +* Adds option to configure the User-Agent in the HTTP headers. ## 2.5.2 diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 31747434d058..4d2884f0af49 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## 2.3.12 +## 2.4.0 +* Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. * Adds option to configure the User-Agent in the HTTP headers. ## 2.3.11 diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index 0d2d11488e11..1077e8447146 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -56,7 +56,7 @@ final class VideoPlayer { private final EventChannel eventChannel; - private final String USER_AGENT = "User-Agent"; + private static final String USER_AGENT = "User-Agent"; @VisibleForTesting boolean isInitialized = false; diff --git a/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java b/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java index f86b83666667..5a646d8d41c3 100644 --- a/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java +++ b/packages/video_player/video_player_android/android/src/test/java/io/flutter/plugins/videoplayer/VideoPlayerTest.java @@ -51,7 +51,7 @@ public void before() { } @Test - public void videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNull() { + public void videoPlayer_buildsHttpDataSourceFactoryProperlyWhenHttpHeadersNull() { VideoPlayer videoPlayer = new VideoPlayer( fakeExoPlayer, @@ -70,7 +70,7 @@ public void videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNull() @Test public void - videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNonNullAndUserAgentSpecified() { + videoPlayer_buildsHttpDataSourceFactoryProperlyWhenHttpHeadersNonNullAndUserAgentSpecified() { VideoPlayer videoPlayer = new VideoPlayer( fakeExoPlayer, @@ -96,7 +96,7 @@ public void videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNull() @Test public void - videoPlayer_BuildsHttpDataSourceFactoryProperlyWhenHttpHeadersNonNullAndUserAgentNotSpecified() { + videoPlayer_buildsHttpDataSourceFactoryProperlyWhenHttpHeadersNonNullAndUserAgentNotSpecified() { VideoPlayer videoPlayer = new VideoPlayer( fakeExoPlayer, From a8dc752b374b258edaec6061f82d214e9a63d384 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 8 Mar 2023 23:49:49 +0200 Subject: [PATCH 5/9] pubspec versions --- packages/video_player/video_player/pubspec.yaml | 2 +- packages/video_player/video_player_android/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 6519b109e272..2b6cfea75e96 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.5.3 +version: 2.6.0 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 7bf682706137..f82d904c0e4a 100644 --- a/packages/video_player/video_player_android/pubspec.yaml +++ b/packages/video_player/video_player_android/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_android description: Android implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.3.12 +version: 2.4.0 environment: sdk: ">=2.14.0 <3.0.0" From 6715afa6a923c50632759ead9b9dbd1df3d95755 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 8 Mar 2023 23:55:16 +0200 Subject: [PATCH 6/9] removed nonull --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index 1077e8447146..699a37cb8eb8 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -109,7 +109,7 @@ final class VideoPlayer { } @VisibleForTesting - public void buildHttpDataSourceFactory(@NonNull Map httpHeaders) { + public void buildHttpDataSourceFactory(Map httpHeaders) { final boolean httpHeadersNotEmpty = httpHeaders != null && !httpHeaders.isEmpty(); final String userAgent = httpHeadersNotEmpty && httpHeaders.containsKey(USER_AGENT) From 0a7d3088c380d4f7b6bbf341e17ed59216ff190b Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 8 Mar 2023 23:55:49 +0200 Subject: [PATCH 7/9] fixed nonull review --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java index 699a37cb8eb8..2aed171033ab 100644 --- a/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java +++ b/packages/video_player/video_player_android/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java @@ -109,8 +109,8 @@ final class VideoPlayer { } @VisibleForTesting - public void buildHttpDataSourceFactory(Map httpHeaders) { - final boolean httpHeadersNotEmpty = httpHeaders != null && !httpHeaders.isEmpty(); + public void buildHttpDataSourceFactory(@NonNull Map httpHeaders) { + final boolean httpHeadersNotEmpty = !httpHeaders.isEmpty(); final String userAgent = httpHeadersNotEmpty && httpHeaders.containsKey(USER_AGENT) ? httpHeaders.get(USER_AGENT) From 482201a00ebc82ae89cc4d49f273a3e2ba324886 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Thu, 9 Mar 2023 00:00:43 +0200 Subject: [PATCH 8/9] added ##next to the new version --- packages/video_player/video_player/CHANGELOG.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index a7e3a3f1ed45..1f7c8122fa92 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,11 +1,8 @@ -## NEXT - -* Aligns Dart and Flutter SDK constraints. - ## 2.6.0 * Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. * Adds option to configure the User-Agent in the HTTP headers. +* Aligns Dart and Flutter SDK constraints. ## 2.5.3 From 3ed1bfa7fe2e844dc9b6577fbd7f3fc7f4921897 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Thu, 9 Mar 2023 00:15:54 +0200 Subject: [PATCH 9/9] change logs fixes --- packages/video_player/video_player/CHANGELOG.md | 1 - packages/video_player/video_player_android/CHANGELOG.md | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 1f7c8122fa92..67c9fc4fce09 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,7 +1,6 @@ ## 2.6.0 * Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. -* Adds option to configure the User-Agent in the HTTP headers. * Aligns Dart and Flutter SDK constraints. ## 2.5.3 diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 4a83ec53b0ff..86c83e5ec809 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,7 +1,6 @@ ## 2.4.0 -* Adds option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. -* Adds option to configure the User-Agent in the HTTP headers. +* Allows setting the ExoPlayer user agent by passing a User-Agent HTTP header. ## 2.3.12