From f31ecb00ffd497844b190e7e8e90a7daba34051e Mon Sep 17 00:00:00 2001 From: zezo Date: Sun, 6 Mar 2022 14:55:29 +0200 Subject: [PATCH 01/46] Upgraded to exoPlayer 2.17.0 note: onPlayerError in listener override had to be removed so i think its not working and the details that i found from release notes has been added as a comment to help in that matter --- .../video_player_android/android/build.gradle | 8 ++--- .../plugins/videoplayer/VideoPlayer.java | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/video_player/video_player_android/android/build.gradle b/packages/video_player/video_player_android/android/build.gradle index 6e6e8c792150..e565a9364bd8 100644 --- a/packages/video_player/video_player_android/android/build.gradle +++ b/packages/video_player/video_player_android/android/build.gradle @@ -43,10 +43,10 @@ android { } dependencies { - implementation 'com.google.android.exoplayer:exoplayer-core:2.14.1' - implementation 'com.google.android.exoplayer:exoplayer-hls:2.14.1' - implementation 'com.google.android.exoplayer:exoplayer-dash:2.14.1' - implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.14.1' + implementation 'com.google.android.exoplayer:exoplayer-core:2.17.0' + implementation 'com.google.android.exoplayer:exoplayer-hls:2.17.0' + implementation 'com.google.android.exoplayer:exoplayer-dash:2.17.0' + implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.17.0' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-inline:3.9.0' } 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 33593267338c..3fec89ae0241 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 @@ -18,7 +18,7 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Listener; -import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; @@ -28,7 +28,7 @@ import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource; import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.util.Util; import io.flutter.plugin.common.EventChannel; @@ -45,7 +45,7 @@ final class VideoPlayer { private static final String FORMAT_HLS = "hls"; private static final String FORMAT_OTHER = "other"; - private SimpleExoPlayer exoPlayer; + private ExoPlayer exoPlayer; private Surface surface; @@ -71,7 +71,7 @@ final class VideoPlayer { this.textureEntry = textureEntry; this.options = options; - exoPlayer = new SimpleExoPlayer.Builder(context).build(); + exoPlayer = new ExoPlayer.Builder(context).build(); Uri uri = Uri.parse(dataSource); @@ -87,7 +87,7 @@ final class VideoPlayer { } dataSourceFactory = httpDataSourceFactory; } else { - dataSourceFactory = new DefaultDataSourceFactory(context, "ExoPlayer"); + dataSourceFactory = new DefaultDataSource.Factory(context); } MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); @@ -133,12 +133,12 @@ private MediaSource buildMediaSource( case C.TYPE_SS: return new SsMediaSource.Factory( new DefaultSsChunkSource.Factory(mediaDataSourceFactory), - new DefaultDataSourceFactory(context, null, mediaDataSourceFactory)) + new DefaultDataSource.Factory(context, mediaDataSourceFactory)) .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_DASH: return new DashMediaSource.Factory( new DefaultDashChunkSource.Factory(mediaDataSourceFactory), - new DefaultDataSourceFactory(context, null, mediaDataSourceFactory)) + new DefaultDataSource.Factory(context, mediaDataSourceFactory)) .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_HLS: return new HlsMediaSource.Factory(mediaDataSourceFactory) @@ -206,14 +206,24 @@ public void onPlaybackStateChanged(final int playbackState) { } } - @Override + //error: method does not override or implement a method from a supertype @Override + + //Based on the release notes of version 2.15.0 + //Make Player depend on the new PlaybackException class instead of ExoPlaybackException: + //Player.getPlayerError now returns a PlaybackException. + //Player.Listener.onPlayerError now receives a PlaybackException. + //Add a new listener method Player.Listener.onPlayerErrorChanged, which is equivalent to onPlayerError except that it is also called when the player error becomes null. + + //@Override public void onPlayerError(final ExoPlaybackException error) { setBuffering(false); if (eventSink != null) { eventSink.error("VideoError", "Video player had error " + error, null); } } + }); + } void sendBufferingUpdate() { @@ -224,9 +234,8 @@ void sendBufferingUpdate() { event.put("values", Collections.singletonList(range)); eventSink.success(event); } - @SuppressWarnings("deprecation") - private static void setAudioAttributes(SimpleExoPlayer exoPlayer, boolean isMixMode) { + private static void setAudioAttributes(ExoPlayer exoPlayer, boolean isMixMode) { exoPlayer.setAudioAttributes( new AudioAttributes.Builder().setContentType(C.CONTENT_TYPE_MOVIE).build(), !isMixMode); } From e708902b3ac5945d6b66018714f87aeffdfe43cd Mon Sep 17 00:00:00 2001 From: zezo Date: Sun, 6 Mar 2022 22:23:52 +0200 Subject: [PATCH 02/46] fixed (onPlayerError override not working) --- .../flutter/plugins/videoplayer/VideoPlayer.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 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 3fec89ae0241..999a8e3240dd 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 @@ -13,6 +13,7 @@ import androidx.annotation.NonNull; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackParameters; @@ -206,22 +207,16 @@ public void onPlaybackStateChanged(final int playbackState) { } } - //error: method does not override or implement a method from a supertype @Override - //Based on the release notes of version 2.15.0 - //Make Player depend on the new PlaybackException class instead of ExoPlaybackException: - //Player.getPlayerError now returns a PlaybackException. - //Player.Listener.onPlayerError now receives a PlaybackException. - //Add a new listener method Player.Listener.onPlayerErrorChanged, which is equivalent to onPlayerError except that it is also called when the player error becomes null. - - //@Override - public void onPlayerError(final ExoPlaybackException error) { + @Override + public void onPlayerError(final PlaybackException error) { setBuffering(false); if (eventSink != null) { eventSink.error("VideoError", "Video player had error " + error, null); } } + }); } @@ -234,7 +229,7 @@ void sendBufferingUpdate() { event.put("values", Collections.singletonList(range)); eventSink.success(event); } - @SuppressWarnings("deprecation") + private static void setAudioAttributes(ExoPlayer exoPlayer, boolean isMixMode) { exoPlayer.setAudioAttributes( new AudioAttributes.Builder().setContentType(C.CONTENT_TYPE_MOVIE).build(), !isMixMode); From a5f8e6f4890b3bce035475fceaf39c1fd420a6c4 Mon Sep 17 00:00:00 2001 From: zezo Date: Tue, 8 Mar 2022 19:48:02 +0200 Subject: [PATCH 03/46] formatted code --- .../io/flutter/plugins/videoplayer/VideoPlayer.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 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 999a8e3240dd..dc7c88144583 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 @@ -12,14 +12,13 @@ import android.view.Surface; import androidx.annotation.NonNull; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Listener; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; @@ -75,7 +74,6 @@ final class VideoPlayer { exoPlayer = new ExoPlayer.Builder(context).build(); Uri uri = Uri.parse(dataSource); - DataSource.Factory dataSourceFactory; if (isHTTP(uri)) { DefaultHttpDataSource.Factory httpDataSourceFactory = @@ -108,6 +106,7 @@ private static boolean isHTTP(Uri uri) { private MediaSource buildMediaSource( Uri uri, DataSource.Factory mediaDataSourceFactory, String formatHint, Context context) { + int type; if (formatHint == null) { type = Util.inferContentType(uri.getLastPathSegment()); @@ -207,7 +206,6 @@ public void onPlaybackStateChanged(final int playbackState) { } } - @Override public void onPlayerError(final PlaybackException error) { setBuffering(false); @@ -215,10 +213,7 @@ public void onPlayerError(final PlaybackException error) { eventSink.error("VideoError", "Video player had error " + error, null); } } - - }); - } void sendBufferingUpdate() { From c859b17b4ab0b6419083c92540909c7ba7122f38 Mon Sep 17 00:00:00 2001 From: zezo Date: Tue, 8 Mar 2022 19:53:51 +0200 Subject: [PATCH 04/46] changed changelog and pubspec --- packages/video_player/video_player_android/CHANGELOG.md | 3 +++ packages/video_player/video_player_android/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index ec526ee1c7c9..5342f5c414f3 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.3.1 + +* Updates exoplayer to ^2.17.0. ## 2.3.0 * Updates Pigeon to ^1.0.16. diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index c40d5185e854..434d285e660f 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/master/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.0 +version: 2.3.1 environment: sdk: ">=2.14.0 <3.0.0" From 1b7a12765192b0f4896e09ca25c70b3edfac526a Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Thu, 10 Mar 2022 13:28:06 -0800 Subject: [PATCH 05/46] Fix CHANGELOG --- packages/video_player/video_player_android/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 5342f5c414f3..17a773404768 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,6 +1,7 @@ ## 2.3.1 -* Updates exoplayer to ^2.17.0. +* Updates ExoPlayer to 2.17.0. + ## 2.3.0 * Updates Pigeon to ^1.0.16. From 012c42f2f5b0e4392bef823defc6f0ad767d24ac Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Wed, 23 Mar 2022 06:50:15 -0700 Subject: [PATCH 06/46] Update version --- packages/video_player/video_player_android/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 15c063f83d40..aa288ed71eac 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/master/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.1 +version: 2.3.2 environment: sdk: ">=2.14.0 <3.0.0" From a23cc1185015a8ac946001151bd86a621d5295ee Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 11:46:05 +0200 Subject: [PATCH 07/46] added http headers to file constuctor --- packages/video_player/video_player/lib/video_player.dart | 5 +++-- .../video_player_android/lib/src/android_video_player.dart | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index b77c530b5831..c2f9cf59b49f 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -237,12 +237,12 @@ class VideoPlayerController extends ValueNotifier { /// This will load the file from the file-URI given by: /// `'file://${file.path}'`. VideoPlayerController.file(File file, - {this.closedCaptionFile, this.videoPlayerOptions}) + {this.closedCaptionFile, this.videoPlayerOptions,this.httpHeaders = const {}}) : dataSource = 'file://${file.path}', dataSourceType = DataSourceType.file, package = null, formatHint = null, - httpHeaders = const {}, + super(VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a contentUri. @@ -338,6 +338,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_android/lib/src/android_video_player.dart b/packages/video_player/video_player_android/lib/src/android_video_player.dart index 31d0744e51dc..94e55407c6ec 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 @@ -50,6 +50,7 @@ class AndroidVideoPlayer extends VideoPlayerPlatform { break; case DataSourceType.file: uri = dataSource.uri; + httpHeaders = dataSource.httpHeaders; break; case DataSourceType.contentUri: uri = dataSource.uri; From d38bddcc388781936d51c5db8b92600096a11341 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 12:43:56 +0200 Subject: [PATCH 08/46] removed if condition --- .../java/io/flutter/plugins/videoplayer/VideoPlayer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 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 dc7c88144583..59cc62e1fcb6 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 @@ -75,7 +75,7 @@ final class VideoPlayer { Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - if (isHTTP(uri)) { + //if (isHTTP(uri)) { DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") @@ -85,9 +85,9 @@ final class VideoPlayer { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); } dataSourceFactory = httpDataSourceFactory; - } else { - dataSourceFactory = new DefaultDataSource.Factory(context); - } + //} else { + // dataSourceFactory = new DefaultDataSource.Factory(context); + //} MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.setMediaSource(mediaSource); From 00d26c0adb8bfbffff69fe372499f5bbdaaf12f3 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 13:06:03 +0200 Subject: [PATCH 09/46] versions updates,formating --- .../video_player/video_player/CHANGELOG.md | 4 ++++ .../video_player/lib/video_player.dart | 5 ++-- .../video_player/video_player/pubspec.yaml | 2 +- .../video_player_android/CHANGELOG.md | 4 ++++ .../plugins/videoplayer/VideoPlayer.java | 24 +++++++++---------- .../video_player_android/pubspec.yaml | 2 +- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 2b0ffadaecdf..4c78733f43ea 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.4.6 + +* VideoPlayerController.file added http headers,to fix m3u8 access + ## 2.4.5 * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231). diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 3d87dd8646d6..162fbba1bc59 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -248,12 +248,13 @@ class VideoPlayerController extends ValueNotifier { /// This will load the file from the file-URI given by: /// `'file://${file.path}'`. VideoPlayerController.file(File file, - {this.closedCaptionFile, this.videoPlayerOptions,this.httpHeaders = const {}}) + {this.closedCaptionFile, + this.videoPlayerOptions, + this.httpHeaders = const {}}) : dataSource = 'file://${file.path}', dataSourceType = DataSourceType.file, package = null, formatHint = null, - super(VideoPlayerValue(duration: Duration.zero)); /// Constructs a [VideoPlayerController] playing a video from a contentUri. diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index bb0e8a8ec581..c9d5fc5ec572 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.4.5 +version: 2.4.6 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 fb34655e50dc..a747569cc00d 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.9 + +* made DefaultHttpDataSource the default + ## 2.3.8 * Updates ExoPlayer to 2.18.0. 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 a794be799ecf..24180c7bca64 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 @@ -76,19 +76,17 @@ final class VideoPlayer { 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); - //} + + DefaultHttpDataSource.Factory httpDataSourceFactory = + new DefaultHttpDataSource.Factory() + .setUserAgent("ExoPlayer") + .setAllowCrossProtocolRedirects(true); + + if (httpHeaders != null && !httpHeaders.isEmpty()) { + httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); + } + dataSourceFactory = httpDataSourceFactory; + MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 056221a006d3..9039a2d8e90f 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.8 +version: 2.3.9 environment: sdk: ">=2.14.0 <3.0.0" From cbfb811d5f07b0fd91b27007248cd672b939369b Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 13:09:03 +0200 Subject: [PATCH 10/46] fixed missing value in constructor --- packages/video_player/video_player/lib/video_player.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 162fbba1bc59..6d73ffee31e3 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -248,10 +248,11 @@ class VideoPlayerController extends ValueNotifier { /// This will load the file from the file-URI given by: /// `'file://${file.path}'`. VideoPlayerController.file(File file, - {this.closedCaptionFile, + {Future? closedCaptionFile, this.videoPlayerOptions, this.httpHeaders = const {}}) - : dataSource = 'file://${file.path}', + : _closedCaptionFileFuture = closedCaptionFile, + dataSource = 'file://${file.path}', dataSourceType = DataSourceType.file, package = null, formatHint = null, From 51659d1bf3029a00ea039d20f9da1ab355a598bb Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 13:49:13 +0200 Subject: [PATCH 11/46] added print to test value --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 4 +++- 1 file changed, 3 insertions(+), 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 24180c7bca64..73859a687213 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 @@ -55,7 +55,8 @@ final class VideoPlayer { private QueuingEventSink eventSink; private final EventChannel eventChannel; - + private static final String TAG = "MyActivity"; + @VisibleForTesting boolean isInitialized = false; private final VideoPlayerOptions options; @@ -84,6 +85,7 @@ final class VideoPlayer { if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); + Log.i(TAG, "http headers in player java " + httpHeaders); } dataSourceFactory = httpDataSourceFactory; From 2dba163b2f2e569cf97172d4dd3efb51a5e60ffc Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 13:51:24 +0200 Subject: [PATCH 12/46] testing prints --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 2 ++ 1 file changed, 2 insertions(+) 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 73859a687213..911e4a11cf96 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 @@ -86,6 +86,8 @@ final class VideoPlayer { if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); Log.i(TAG, "http headers in player java " + httpHeaders); + }else{ + Log.i(TAG, "http headers in player are null "); } dataSourceFactory = httpDataSourceFactory; From 99f86bb9b2cc3289c328051f774c1b2559cb03f4 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 13:56:06 +0200 Subject: [PATCH 13/46] new print --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 3 ++- 1 file changed, 2 insertions(+), 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 911e4a11cf96..6eb7acd5eb1d 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 @@ -85,7 +85,8 @@ final class VideoPlayer { if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - Log.i(TAG, "http headers in player java " + httpHeaders); + Log.i(TAG, "http headers in player java "); + Log.i(TAG,httpHeaders); }else{ Log.i(TAG, "http headers in player are null "); } From bd4c6cef62c13686c27cf09b578d2a32c351310f Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:03:06 +0200 Subject: [PATCH 14/46] importing log --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 1 + 1 file changed, 1 insertion(+) 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 6eb7acd5eb1d..70d80acaff85 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 @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import android.util.Log; final class VideoPlayer { private static final String FORMAT_SS = "ss"; From 22c0d39ebfb177a818966782d796b62a8bb6a0bc Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:10:17 +0200 Subject: [PATCH 15/46] to string added --- .../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 70d80acaff85..665f7946c03f 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 @@ -87,7 +87,7 @@ final class VideoPlayer { if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); Log.i(TAG, "http headers in player java "); - Log.i(TAG,httpHeaders); + Log.i(TAG,httpHeaders.toString()); }else{ Log.i(TAG, "http headers in player are null "); } From a8ff4f50dc47af9fb756c8b762f9474fc12ecd81 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:17:59 +0200 Subject: [PATCH 16/46] testing new logic --- .../io/flutter/plugins/videoplayer/VideoPlayer.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 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 665f7946c03f..74b7234136ca 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 @@ -78,7 +78,7 @@ final class VideoPlayer { Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - + if (isHTTP(uri)) { DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") @@ -92,8 +92,14 @@ final class VideoPlayer { Log.i(TAG, "http headers in player are null "); } dataSourceFactory = httpDataSourceFactory; - - + } else { + dataSourceFactory = new DefaultDataSource.Factory(context); + } + if (httpHeaders != null && !httpHeaders.isEmpty()) { + httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); + Log.i(TAG, "http headers in player java "); + Log.i(TAG,httpHeaders.toString()); + } MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.setMediaSource(mediaSource); From f8499c2c03ad67c847479eb210844e32c32aa973 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:19:58 +0200 Subject: [PATCH 17/46] removed unused code --- .../io/flutter/plugins/videoplayer/VideoPlayer.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 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 74b7234136ca..4dbd3afd1533 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 @@ -83,20 +83,12 @@ final class VideoPlayer { new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); - - if (httpHeaders != null && !httpHeaders.isEmpty()) { - httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - Log.i(TAG, "http headers in player java "); - Log.i(TAG,httpHeaders.toString()); - }else{ - Log.i(TAG, "http headers in player are null "); - } - dataSourceFactory = httpDataSourceFactory; } else { dataSourceFactory = new DefaultDataSource.Factory(context); } + if (httpHeaders != null && !httpHeaders.isEmpty()) { - httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); + dataSourceFactory.setDefaultRequestProperties(httpHeaders); Log.i(TAG, "http headers in player java "); Log.i(TAG,httpHeaders.toString()); } From daf919fda43e4885396535a6529459e153c015ae Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:30:14 +0200 Subject: [PATCH 18/46] trying new logic --- .../io/flutter/plugins/videoplayer/VideoPlayer.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 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 4dbd3afd1533..362caee3d425 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 @@ -78,20 +78,20 @@ final class VideoPlayer { Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - if (isHTTP(uri)) { + DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); - } else { - dataSourceFactory = new DefaultDataSource.Factory(context); - } - if (httpHeaders != null && !httpHeaders.isEmpty()) { - dataSourceFactory.setDefaultRequestProperties(httpHeaders); + httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); Log.i(TAG, "http headers in player java "); Log.i(TAG,httpHeaders.toString()); } + + dataSourceFactory = new DefaultDataSource.Factory(context,httpDataSourceFactory); + + MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.setMediaSource(mediaSource); From 95bb7527be2f7247b5e7c6861e99e722b0e5410d Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:52:55 +0200 Subject: [PATCH 19/46] removed new keyword --- .../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 362caee3d425..d678918b9d26 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 @@ -89,7 +89,7 @@ final class VideoPlayer { Log.i(TAG,httpHeaders.toString()); } - dataSourceFactory = new DefaultDataSource.Factory(context,httpDataSourceFactory); + dataSourceFactory = DefaultDataSource.Factory(context,httpDataSourceFactory); MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); From f5288dacf9ae043b9d7757f265f4d9bf3b462641 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 14:59:08 +0200 Subject: [PATCH 20/46] new logic applied --- .../java/io/flutter/plugins/videoplayer/VideoPlayer.java | 9 +++------ 1 file changed, 3 insertions(+), 6 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 d678918b9d26..bfc8f1f158cc 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 @@ -76,7 +76,6 @@ final class VideoPlayer { exoPlayer = new ExoPlayer.Builder(context).build(); - Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; DefaultHttpDataSource.Factory httpDataSourceFactory = @@ -85,11 +84,9 @@ final class VideoPlayer { .setAllowCrossProtocolRedirects(true); if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - Log.i(TAG, "http headers in player java "); - Log.i(TAG,httpHeaders.toString()); } - dataSourceFactory = DefaultDataSource.Factory(context,httpDataSourceFactory); + dataSourceFactory =new DefaultDataSource.Factory(context,httpDataSourceFactory); MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); @@ -152,12 +149,12 @@ private MediaSource buildMediaSource( case C.CONTENT_TYPE_SS: return new SsMediaSource.Factory( new DefaultSsChunkSource.Factory(mediaDataSourceFactory), - new DefaultDataSource.Factory(context, mediaDataSourceFactory)) + mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_DASH: return new DashMediaSource.Factory( new DefaultDashChunkSource.Factory(mediaDataSourceFactory), - new DefaultDataSource.Factory(context, mediaDataSourceFactory)) + mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_HLS: return new HlsMediaSource.Factory(mediaDataSourceFactory) From cae65443a1a15cd38a822d8f88dc096a6378b6dc Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 15:02:32 +0200 Subject: [PATCH 21/46] uri added again --- .../main/java/io/flutter/plugins/videoplayer/VideoPlayer.java | 4 +++- 1 file changed, 3 insertions(+), 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 bfc8f1f158cc..6e573d80f62e 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 @@ -75,6 +75,8 @@ final class VideoPlayer { this.options = options; exoPlayer = new ExoPlayer.Builder(context).build(); + + Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; @@ -82,13 +84,13 @@ final class VideoPlayer { new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); + if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); } dataSourceFactory =new DefaultDataSource.Factory(context,httpDataSourceFactory); - MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.setMediaSource(mediaSource); From c333d4322fe0a281a7512b98bf49574e7085dc33 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 17:55:06 +0200 Subject: [PATCH 22/46] added option to allow diffrent user agent --- .../plugins/videoplayer/VideoPlayer.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 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 6e573d80f62e..1c42ebd3b7d5 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,8 +56,8 @@ final class VideoPlayer { private QueuingEventSink eventSink; private final EventChannel eventChannel; - private static final String TAG = "MyActivity"; - + private const val USER_AGENT = "User-Agent"; + @VisibleForTesting boolean isInitialized = false; private final VideoPlayerOptions options; @@ -75,21 +75,31 @@ final class VideoPlayer { this.options = options; exoPlayer = new ExoPlayer.Builder(context).build(); - + Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - - DefaultHttpDataSource.Factory httpDataSourceFactory = + DefaultHttpDataSource.Factory httpDataSourceFactory; + if (httpHeaders != null && !httpHeaders.isEmpty()) { + if(httpHeaders.containsKey(USER_AGENT)){ + httpDataSourceFactory = + new DefaultHttpDataSource.Factory() + .setUserAgent(httpHeaders[USER_AGENT]) + .setAllowCrossProtocolRedirects(true); + }else{ + httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); + } - if (httpHeaders != null && !httpHeaders.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); + dataSourceFactory =new DefaultDataSource.Factory(context,httpDataSourceFactory); + }else{ + dataSourceFactory =new DefaultDataSource.Factory(context); } - dataSourceFactory =new DefaultDataSource.Factory(context,httpDataSourceFactory); + MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); From 5eb2a37bbe30f615daa52aaa01a3c7bcf52d021b Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 17:58:13 +0200 Subject: [PATCH 23/46] wrong declration fixed --- .../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 1c42ebd3b7d5..57667cee850c 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 QueuingEventSink eventSink; private final EventChannel eventChannel; - private const val USER_AGENT = "User-Agent"; + private final USER_AGENT = "User-Agent"; @VisibleForTesting boolean isInitialized = false; From d164e2d8e1183e2f6cd53427fd089647532e73c7 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 18:00:19 +0200 Subject: [PATCH 24/46] string for user agent --- .../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 57667cee850c..dde121208f66 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 QueuingEventSink eventSink; private final EventChannel eventChannel; - private final USER_AGENT = "User-Agent"; + private final String USER_AGENT = "User-Agent"; @VisibleForTesting boolean isInitialized = false; From 03e8e6b7ba5bca93d59a3f644eb2086a34121f02 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 18:09:14 +0200 Subject: [PATCH 25/46] fixed map error --- .../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 dde121208f66..cd4a77f1fe34 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 @@ -84,7 +84,7 @@ final class VideoPlayer { if(httpHeaders.containsKey(USER_AGENT)){ httpDataSourceFactory = new DefaultHttpDataSource.Factory() - .setUserAgent(httpHeaders[USER_AGENT]) + .setUserAgent(httpHeaders.get(USER_AGENT)) .setAllowCrossProtocolRedirects(true); }else{ httpDataSourceFactory = From fa5c66010b8f93ce9501245d253bda30dff0e3fd Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 18:18:32 +0200 Subject: [PATCH 26/46] formating and changelog changes --- .../video_player/lib/video_player.dart | 2 +- .../video_player_android/CHANGELOG.md | 5 +- .../plugins/videoplayer/VideoPlayer.java | 51 ++++++++++--------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 6d73ffee31e3..7ea7e3d5f8b5 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 (User-Agent can be defined too in the headers) /// for the request to the [dataSource]. VideoPlayerController.network( this.dataSource, { diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index a747569cc00d..91934b353dcc 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,7 +1,8 @@ ## 2.3.9 -* made DefaultHttpDataSource the default - +* Made DefaultHttpDataSource the default +* Made passing the user-agent in http headers changes the default exo player agent + ## 2.3.8 * Updates ExoPlayer to 2.18.0. 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 cd4a77f1fe34..d4a312907dfd 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,9 +56,11 @@ final class VideoPlayer { private QueuingEventSink eventSink; private final EventChannel eventChannel; + private final String USER_AGENT = "User-Agent"; - @VisibleForTesting boolean isInitialized = false; + @VisibleForTesting + boolean isInitialized = false; private final VideoPlayerOptions options; @@ -81,26 +83,22 @@ final class VideoPlayer { DataSource.Factory dataSourceFactory; DefaultHttpDataSource.Factory httpDataSourceFactory; if (httpHeaders != null && !httpHeaders.isEmpty()) { - if(httpHeaders.containsKey(USER_AGENT)){ - httpDataSourceFactory = - new DefaultHttpDataSource.Factory() + if (httpHeaders.containsKey(USER_AGENT)) { + httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent(httpHeaders.get(USER_AGENT)) .setAllowCrossProtocolRedirects(true); - }else{ - httpDataSourceFactory = - new DefaultHttpDataSource.Factory() + } else { + httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); - } + } httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - dataSourceFactory =new DefaultDataSource.Factory(context,httpDataSourceFactory); - }else{ - dataSourceFactory =new DefaultDataSource.Factory(context); + dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); + } else { + dataSourceFactory = new DefaultDataSource.Factory(context); } - - MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.setMediaSource(mediaSource); @@ -160,13 +158,13 @@ private MediaSource buildMediaSource( switch (type) { case C.CONTENT_TYPE_SS: return new SsMediaSource.Factory( - new DefaultSsChunkSource.Factory(mediaDataSourceFactory), - mediaDataSourceFactory) + new DefaultSsChunkSource.Factory(mediaDataSourceFactory), + mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_DASH: return new DashMediaSource.Factory( - new DefaultDashChunkSource.Factory(mediaDataSourceFactory), - mediaDataSourceFactory) + new DefaultDashChunkSource.Factory(mediaDataSourceFactory), + mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_HLS: return new HlsMediaSource.Factory(mediaDataSourceFactory) @@ -174,10 +172,9 @@ private MediaSource buildMediaSource( case C.CONTENT_TYPE_OTHER: return new ProgressiveMediaSource.Factory(mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); - default: - { - throw new IllegalStateException("Unsupported type: " + type); - } + default: { + throw new IllegalStateException("Unsupported type: " + type); + } } } @@ -250,7 +247,8 @@ void sendBufferingUpdate() { Map event = new HashMap<>(); event.put("event", "bufferingUpdate"); List range = Arrays.asList(0, exoPlayer.getBufferedPosition()); - // iOS supports a list of buffered ranges, so here is a list with a single range. + // iOS supports a list of buffered ranges, so here is a list with a single + // range. event.put("values", Collections.singletonList(range)); eventSink.success(event); } @@ -279,7 +277,8 @@ void setVolume(double value) { } void setPlaybackSpeed(double value) { - // We do not need to consider pitch and skipSilence for now as we do not handle them and + // We do not need to consider pitch and skipSilence for now as we do not handle + // them and // therefore never diverge from the default values. final PlaybackParameters playbackParameters = new PlaybackParameters(((float) value)); @@ -315,9 +314,11 @@ void sendInitialized() { event.put("width", width); event.put("height", height); - // Rotating the video with ExoPlayer does not seem to be possible with a Surface, + // Rotating the video with ExoPlayer does not seem to be possible with a + // Surface, // so inform the Flutter code that the widget needs to be rotated to prevent - // upside-down playback for videos with rotationDegrees of 180 (other orientations work + // upside-down playback for videos with rotationDegrees of 180 (other + // orientations work // correctly without correction). if (rotationDegrees == 180) { event.put("rotationCorrection", rotationDegrees); From 385c87950a491c6e8c761f4ce8bc39dae636a6be Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 6 Aug 2022 20:32:26 +0200 Subject: [PATCH 27/46] goes to normal httpDataSourceFactory incase no http header is defined --- .../java/io/flutter/plugins/videoplayer/VideoPlayer.java | 5 ++++- 1 file changed, 4 insertions(+), 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 d4a312907dfd..3560126c0675 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 @@ -96,7 +96,10 @@ final class VideoPlayer { httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); } else { - dataSourceFactory = new DefaultDataSource.Factory(context); + httpDataSourceFactory = new DefaultHttpDataSource.Factory() + .setUserAgent("ExoPlayer") + .setAllowCrossProtocolRedirects(true); + dataSourceFactory = new DefaultDataSource.Factory(context,httpDataSourceFactory); } MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); From 6c3caf077be59b50f8c45890289e649ff4f5a4f1 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 3 Sep 2022 19:46:03 +0200 Subject: [PATCH 28/46] added tests --- .../test/image_picker_test.mocks.dart | 4 ++-- .../video_player/video_player/CHANGELOG.md | 8 +++++--- .../video_player/video_player/pubspec.yaml | 2 +- .../video_player/test/video_player_test.dart | 13 +++++++++++++ .../video_player_android/CHANGELOG.md | 10 +++++----- .../video_player_android/pubspec.yaml | 2 +- .../test/android_video_player_test.dart | 12 ++++++++++++ .../test/android_webview_test.mocks.dart | 4 ++-- .../webview_android_widget_test.mocks.dart | 4 ++-- script/tool/test/common/file_utils_test.dart | 3 +-- .../common/package_looping_command_test.dart | 19 ++++++++----------- .../tool/test/common/plugin_utils_test.dart | 9 ++++++--- 12 files changed, 58 insertions(+), 32 deletions(-) diff --git a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart index a79d076dd42c..641a104a33c5 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart @@ -22,8 +22,8 @@ import 'package:mockito/mockito.dart' as _i1; class _FakeLostData_0 extends _i1.Fake implements _i2.LostData {} -class _FakeLostDataResponse_1 extends _i1.Fake - implements _i2.LostDataResponse {} +class _FakeLostDataResponse_1 extends _i1.Fake implements _i2.LostDataResponse { +} /// A class which mocks [ImagePickerPlatform]. /// diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index f3c4106a7422..ac0cd6f67978 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.4.8 + +* VideoPlayerController.file added http headers,to fix m3u8 access + + ## 2.4.7 * Updates README via code excerpts. @@ -7,10 +12,7 @@ * Fixes avoid_redundant_argument_values lint warnings and minor typos. -## 2.4.6 -* VideoPlayerController.file added http headers,to fix m3u8 access - ## 2.4.5 * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231). diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 7e2df60d3cdd..1f5fed29c01f 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.4.7 +version: 2.4.8 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 e7b3e1de7e63..569b1af34af5 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -344,6 +344,19 @@ void main() { expect(fakeVideoPlayerPlatform.dataSources[0].uri, 'file://a.avi'); }); + test('file with headers (m3u8)', () async { + final VideoPlayerController controller = VideoPlayerController.file( + File('a.avi'), + httpHeaders: {'Authorization': 'Bearer token'}, + ); + await controller.initialize(); + + expect(fakeVideoPlayerPlatform.dataSources[0].uri, 'file://a.avi'); + expect( + fakeVideoPlayerPlatform.dataSources[0].httpHeaders, + {'Authorization': 'Bearer token'}, + ); + }); 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 01932b26d4ae..a7015a35658b 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -3,15 +3,15 @@ * Updates minimum Flutter version to 2.10. * Fixes violations of new analysis option use_named_constants. -## 2.3.9 +## 2.4.0 -* Updates ExoPlayer to 2.18.1. -* Fixes avoid_redundant_argument_values lint warnings and minor typos. +* Made DefaultHttpDataSource the default +* Made passing the user-agent in http headers changes the default exo player agent ## 2.3.9 -* Made DefaultHttpDataSource the default -* Made passing the user-agent in http headers changes the default exo player agent +* Updates ExoPlayer to 2.18.1. +* Fixes avoid_redundant_argument_values lint warnings and minor typos. ## 2.3.8 diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 1df1deeebf22..40cbfba7f0b7 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.9 +version: 2.4.0 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 fad9617ddad9..053ac216238e 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'); diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart index 6afda598d93b..3a4043c22864 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart @@ -22,8 +22,8 @@ import 'test_android_webview.pigeon.dart' as _i5; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -class _FakeDownloadListener_0 extends _i1.Fake - implements _i2.DownloadListener {} +class _FakeDownloadListener_0 extends _i1.Fake implements _i2.DownloadListener { +} class _FakeJavaScriptChannel_1 extends _i1.Fake implements _i2.JavaScriptChannel {} diff --git a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart index e17b31b3d857..04c2d778ed19 100644 --- a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart @@ -28,8 +28,8 @@ class _FakeWebStorage_1 extends _i1.Fake implements _i2.WebStorage {} class _FakeWebView_2 extends _i1.Fake implements _i2.WebView {} -class _FakeDownloadListener_3 extends _i1.Fake - implements _i2.DownloadListener {} +class _FakeDownloadListener_3 extends _i1.Fake implements _i2.DownloadListener { +} class _FakeJavascriptChannelRegistry_4 extends _i1.Fake implements _i3.JavascriptChannelRegistry {} diff --git a/script/tool/test/common/file_utils_test.dart b/script/tool/test/common/file_utils_test.dart index 79b804e31ea5..34449737a1f4 100644 --- a/script/tool/test/common/file_utils_test.dart +++ b/script/tool/test/common/file_utils_test.dart @@ -9,8 +9,7 @@ import 'package:test/test.dart'; void main() { test('works on Posix', () async { - final FileSystem fileSystem = - MemoryFileSystem(); + final FileSystem fileSystem = MemoryFileSystem(); final Directory base = fileSystem.directory('/').childDirectory('base'); final File file = diff --git a/script/tool/test/common/package_looping_command_test.dart b/script/tool/test/common/package_looping_command_test.dart index 7e9f63cb0344..011f7ca8d6bc 100644 --- a/script/tool/test/common/package_looping_command_test.dart +++ b/script/tool/test/common/package_looping_command_test.dart @@ -373,9 +373,10 @@ void main() { test('skips unsupported Dart versions when requested', () async { final RepositoryPackage excluded = createFakePackage( - 'excluded_package', packagesDir, dartConstraint: '>=2.17.0 <3.0.0'); - final RepositoryPackage included = createFakePackage( - 'a_package', packagesDir); + 'excluded_package', packagesDir, + dartConstraint: '>=2.17.0 <3.0.0'); + final RepositoryPackage included = + createFakePackage('a_package', packagesDir); final TestPackageLoopingCommand command = createTestCommand( packageLoopingType: PackageLoopingType.includeAllSubpackages, @@ -406,8 +407,7 @@ void main() { createFakePlugin('package_a', packagesDir); createFakePackage('package_b', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command); const String separator = @@ -440,8 +440,7 @@ void main() { createFakePlugin('package_a', packagesDir); createFakePackage('package_b', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command, arguments: ['--log-timing']); @@ -783,8 +782,7 @@ void main() { createFakePackage('package_f', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command); expect( @@ -809,8 +807,7 @@ void main() { test('prints exclusions as skips in long-form run summary', () async { createFakePackage('package_a', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command, arguments: ['--exclude=package_a']); diff --git a/script/tool/test/common/plugin_utils_test.dart b/script/tool/test/common/plugin_utils_test.dart index 415b1db8932a..ff2ff6a39531 100644 --- a/script/tool/test/common/plugin_utils_test.dart +++ b/script/tool/test/common/plugin_utils_test.dart @@ -223,9 +223,12 @@ void main() { 'plugin', packagesDir, platformSupport: { - platformLinux: const PlatformDetails(PlatformSupport.inline, hasDartCode: true), - platformMacOS: const PlatformDetails(PlatformSupport.inline, hasDartCode: true), - platformWindows: const PlatformDetails(PlatformSupport.inline, hasDartCode: true), + platformLinux: + const PlatformDetails(PlatformSupport.inline, hasDartCode: true), + platformMacOS: + const PlatformDetails(PlatformSupport.inline, hasDartCode: true), + platformWindows: + const PlatformDetails(PlatformSupport.inline, hasDartCode: true), }, ); From 892c51c96f7a5e207f5f8b3da5cd56c165fa7253 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 3 Sep 2022 19:56:18 +0200 Subject: [PATCH 29/46] formatting --- .../plugins/videoplayer/VideoPlayer.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 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 3560126c0675..e4231cbbb715 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 @@ -39,7 +39,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import android.util.Log; final class VideoPlayer { private static final String FORMAT_SS = "ss"; @@ -59,8 +58,7 @@ final class VideoPlayer { private final String USER_AGENT = "User-Agent"; - @VisibleForTesting - boolean isInitialized = false; + @VisibleForTesting boolean isInitialized = false; private final VideoPlayerOptions options; @@ -84,22 +82,25 @@ final class VideoPlayer { DefaultHttpDataSource.Factory httpDataSourceFactory; if (httpHeaders != null && !httpHeaders.isEmpty()) { if (httpHeaders.containsKey(USER_AGENT)) { - httpDataSourceFactory = new DefaultHttpDataSource.Factory() - .setUserAgent(httpHeaders.get(USER_AGENT)) - .setAllowCrossProtocolRedirects(true); + httpDataSourceFactory = + new DefaultHttpDataSource.Factory() + .setUserAgent(httpHeaders.get(USER_AGENT)) + .setAllowCrossProtocolRedirects(true); } else { - httpDataSourceFactory = new DefaultHttpDataSource.Factory() - .setUserAgent("ExoPlayer") - .setAllowCrossProtocolRedirects(true); + httpDataSourceFactory = + new DefaultHttpDataSource.Factory() + .setUserAgent("ExoPlayer") + .setAllowCrossProtocolRedirects(true); } httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); } else { - httpDataSourceFactory = new DefaultHttpDataSource.Factory() - .setUserAgent("ExoPlayer") - .setAllowCrossProtocolRedirects(true); - dataSourceFactory = new DefaultDataSource.Factory(context,httpDataSourceFactory); + httpDataSourceFactory = + new DefaultHttpDataSource.Factory() + .setUserAgent("ExoPlayer") + .setAllowCrossProtocolRedirects(true); + dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); } MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); @@ -161,13 +162,11 @@ private MediaSource buildMediaSource( switch (type) { case C.CONTENT_TYPE_SS: return new SsMediaSource.Factory( - new DefaultSsChunkSource.Factory(mediaDataSourceFactory), - mediaDataSourceFactory) + new DefaultSsChunkSource.Factory(mediaDataSourceFactory), mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_DASH: return new DashMediaSource.Factory( - new DefaultDashChunkSource.Factory(mediaDataSourceFactory), - mediaDataSourceFactory) + new DefaultDashChunkSource.Factory(mediaDataSourceFactory), mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); case C.CONTENT_TYPE_HLS: return new HlsMediaSource.Factory(mediaDataSourceFactory) @@ -175,9 +174,10 @@ private MediaSource buildMediaSource( case C.CONTENT_TYPE_OTHER: return new ProgressiveMediaSource.Factory(mediaDataSourceFactory) .createMediaSource(MediaItem.fromUri(uri)); - default: { - throw new IllegalStateException("Unsupported type: " + type); - } + default: + { + throw new IllegalStateException("Unsupported type: " + type); + } } } From 801f15bd2e05f466821227bbc747de324d8487e4 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 19 Oct 2022 22:36:16 +0200 Subject: [PATCH 30/46] Update packages/video_player/video_player/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- 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 ac0cd6f67978..85d4c2add8fa 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.4.8 -* VideoPlayerController.file added http headers,to fix m3u8 access +* Added option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. ## 2.4.7 From f247b0d15372d23799a41d82511a9ae7afea990f Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 19 Oct 2022 22:36:29 +0200 Subject: [PATCH 31/46] Update packages/video_player/video_player/lib/video_player.dart Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- 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 d1f81584e176..fddc33a4401e 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 (User-Agent can be defined too in the headers) + /// [httpHeaders] option allows to specify HTTP headers and optionally, the User-Agent /// for the request to the [dataSource]. VideoPlayerController.network( this.dataSource, { From 9946c860a6135f41bf427a8b809f58acdb0d09dd Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 19 Oct 2022 22:36:42 +0200 Subject: [PATCH 32/46] Update packages/video_player/video_player_android/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- packages/video_player/video_player_android/CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index a7015a35658b..cec7030427d4 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -5,8 +5,7 @@ ## 2.4.0 -* Made DefaultHttpDataSource the default -* Made passing the user-agent in http headers changes the default exo player agent +* Added option to configure the User-Agent in the HTTP headers for the ExoPlayer agent. ## 2.3.9 From 019a6b77adf97dd86b3ae7a90cc531d6aefd7261 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 19 Oct 2022 22:48:03 +0200 Subject: [PATCH 33/46] formatting/ and comments --- .../video_player_android/CHANGELOG.md | 2 +- .../plugins/videoplayer/VideoPlayer.java | 22 ++++++++----------- .../video_player_android/pubspec.yaml | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index cec7030427d4..5d76748fe1ed 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -3,7 +3,7 @@ * Updates minimum Flutter version to 2.10. * Fixes violations of new analysis option use_named_constants. -## 2.4.0 +## 2.3.10 * Added option to configure the User-Agent in the HTTP headers for the ExoPlayer agent. 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 e4231cbbb715..a84316ed7dd7 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 @@ -74,35 +74,31 @@ final class VideoPlayer { this.textureEntry = textureEntry; this.options = options; - exoPlayer = new ExoPlayer.Builder(context).build(); + ExoPlayer exoPlayer = new ExoPlayer.Builder(context).build(); Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; + httpDataSourceFactory = + new DefaultHttpDataSource.Factory() + .setUserAgent("ExoPlayer") + .setAllowCrossProtocolRedirects(true); + DefaultHttpDataSource.Factory httpDataSourceFactory; + if (httpHeaders != null && !httpHeaders.isEmpty()) { if (httpHeaders.containsKey(USER_AGENT)) { httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent(httpHeaders.get(USER_AGENT)) .setAllowCrossProtocolRedirects(true); - } else { - httpDataSourceFactory = - new DefaultHttpDataSource.Factory() - .setUserAgent("ExoPlayer") - .setAllowCrossProtocolRedirects(true); } httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); - } else { - httpDataSourceFactory = - new DefaultHttpDataSource.Factory() - .setUserAgent("ExoPlayer") - .setAllowCrossProtocolRedirects(true); - dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); } + dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); + MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.setMediaSource(mediaSource); diff --git a/packages/video_player/video_player_android/pubspec.yaml b/packages/video_player/video_player_android/pubspec.yaml index 40cbfba7f0b7..4b202f11e31a 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.4.0 +version: 2.3.10 environment: sdk: ">=2.14.0 <3.0.0" From 11c4b4e88ad26d5015b7421b84bbf96f3a4d331a Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Thu, 20 Oct 2022 11:32:34 +0200 Subject: [PATCH 34/46] fixed error --- .../java/io/flutter/plugins/videoplayer/VideoPlayer.java | 7 +++---- 1 file changed, 3 insertions(+), 4 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 a84316ed7dd7..a198be7eb4a0 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 @@ -79,13 +79,12 @@ final class VideoPlayer { Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - httpDataSourceFactory = - new DefaultHttpDataSource.Factory() + + + DefaultHttpDataSource.Factory httpDataSourceFactory= new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); - DefaultHttpDataSource.Factory httpDataSourceFactory; - if (httpHeaders != null && !httpHeaders.isEmpty()) { if (httpHeaders.containsKey(USER_AGENT)) { httpDataSourceFactory = From 49eed6a9528c40514dff9c5a15dc3b1b3df89656 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 19 Dec 2022 16:17:10 -0800 Subject: [PATCH 35/46] Formatting --- .../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 a198be7eb4a0..c9b840d838c8 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 @@ -79,9 +79,9 @@ final class VideoPlayer { Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - - DefaultHttpDataSource.Factory httpDataSourceFactory= new DefaultHttpDataSource.Factory() + DefaultHttpDataSource.Factory httpDataSourceFactory = + new DefaultHttpDataSource.Factory() .setUserAgent("ExoPlayer") .setAllowCrossProtocolRedirects(true); From 46120a90ad3a4612c378aef2e7df39f8235c1cfe Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 19 Dec 2022 16:30:28 -0800 Subject: [PATCH 36/46] Fix merge --- packages/video_player/video_player/CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 3fe2056bd25b..5a0413ef5296 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,8 +1,7 @@ ## 2.4.11 * Added option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. - -======= + ## 2.4.10 * Adds compatibilty with version 6.0 of the platform interface. From e15b3a52ffc8acc1bc900dccf54a934d7032d510 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 19 Dec 2022 16:33:22 -0800 Subject: [PATCH 37/46] Undo formatting changes --- .../image_picker/test/image_picker_test.mocks.dart | 4 ++-- script/tool/test/common/file_utils_test.dart | 3 ++- script/tool/test/common/plugin_utils_test.dart | 9 +++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart index f6750fb31552..f749b538665b 100644 --- a/packages/image_picker/image_picker/test/image_picker_test.mocks.dart +++ b/packages/image_picker/image_picker/test/image_picker_test.mocks.dart @@ -22,8 +22,8 @@ import 'package:mockito/mockito.dart' as _i1; class _FakeLostData_0 extends _i1.Fake implements _i2.LostData {} -class _FakeLostDataResponse_1 extends _i1.Fake implements _i2.LostDataResponse { -} +class _FakeLostDataResponse_1 extends _i1.Fake + implements _i2.LostDataResponse {} /// A class which mocks [ImagePickerPlatform]. /// diff --git a/script/tool/test/common/file_utils_test.dart b/script/tool/test/common/file_utils_test.dart index 34449737a1f4..79b804e31ea5 100644 --- a/script/tool/test/common/file_utils_test.dart +++ b/script/tool/test/common/file_utils_test.dart @@ -9,7 +9,8 @@ import 'package:test/test.dart'; void main() { test('works on Posix', () async { - final FileSystem fileSystem = MemoryFileSystem(); + final FileSystem fileSystem = + MemoryFileSystem(); final Directory base = fileSystem.directory('/').childDirectory('base'); final File file = diff --git a/script/tool/test/common/plugin_utils_test.dart b/script/tool/test/common/plugin_utils_test.dart index ff2ff6a39531..415b1db8932a 100644 --- a/script/tool/test/common/plugin_utils_test.dart +++ b/script/tool/test/common/plugin_utils_test.dart @@ -223,12 +223,9 @@ void main() { 'plugin', packagesDir, platformSupport: { - platformLinux: - const PlatformDetails(PlatformSupport.inline, hasDartCode: true), - platformMacOS: - const PlatformDetails(PlatformSupport.inline, hasDartCode: true), - platformWindows: - const PlatformDetails(PlatformSupport.inline, hasDartCode: true), + platformLinux: const PlatformDetails(PlatformSupport.inline, hasDartCode: true), + platformMacOS: const PlatformDetails(PlatformSupport.inline, hasDartCode: true), + platformWindows: const PlatformDetails(PlatformSupport.inline, hasDartCode: true), }, ); From c1732d524b666e9821b6daf1a449eb1265f53495 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Mon, 19 Dec 2022 16:35:27 -0800 Subject: [PATCH 38/46] Undo webview change --- .../webview_android_widget_test.mocks.dart | 565 ------------------ 1 file changed, 565 deletions(-) delete mode 100644 packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart diff --git a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart deleted file mode 100644 index 04c2d778ed19..000000000000 --- a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart +++ /dev/null @@ -1,565 +0,0 @@ -// Mocks generated by Mockito 5.2.0 from annotations -// in webview_flutter_android/test/webview_android_widget_test.dart. -// Do not manually edit this file. - -import 'dart:async' as _i4; -import 'dart:typed_data' as _i5; -import 'dart:ui' as _i6; - -import 'package:mockito/mockito.dart' as _i1; -import 'package:webview_flutter_android/src/android_webview.dart' as _i2; -import 'package:webview_flutter_android/webview_android_widget.dart' as _i7; -import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart' - as _i3; - -// ignore_for_file: type=lint -// ignore_for_file: avoid_redundant_argument_values -// ignore_for_file: avoid_setters_without_getters -// ignore_for_file: comment_references -// ignore_for_file: implementation_imports -// ignore_for_file: invalid_use_of_visible_for_testing_member -// ignore_for_file: prefer_const_constructors -// ignore_for_file: unnecessary_parenthesis -// ignore_for_file: camel_case_types - -class _FakeWebSettings_0 extends _i1.Fake implements _i2.WebSettings {} - -class _FakeWebStorage_1 extends _i1.Fake implements _i2.WebStorage {} - -class _FakeWebView_2 extends _i1.Fake implements _i2.WebView {} - -class _FakeDownloadListener_3 extends _i1.Fake implements _i2.DownloadListener { -} - -class _FakeJavascriptChannelRegistry_4 extends _i1.Fake - implements _i3.JavascriptChannelRegistry {} - -class _FakeJavaScriptChannel_5 extends _i1.Fake - implements _i2.JavaScriptChannel {} - -class _FakeWebChromeClient_6 extends _i1.Fake implements _i2.WebChromeClient {} - -class _FakeWebViewClient_7 extends _i1.Fake implements _i2.WebViewClient {} - -/// A class which mocks [FlutterAssetManager]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockFlutterAssetManager extends _i1.Mock - implements _i2.FlutterAssetManager { - MockFlutterAssetManager() { - _i1.throwOnMissingStub(this); - } - - @override - _i4.Future> list(String? path) => - (super.noSuchMethod(Invocation.method(#list, [path]), - returnValue: Future>.value([])) - as _i4.Future>); - @override - _i4.Future getAssetFilePathByName(String? name) => - (super.noSuchMethod(Invocation.method(#getAssetFilePathByName, [name]), - returnValue: Future.value('')) as _i4.Future); -} - -/// A class which mocks [WebSettings]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebSettings extends _i1.Mock implements _i2.WebSettings { - MockWebSettings() { - _i1.throwOnMissingStub(this); - } - - @override - _i4.Future setDomStorageEnabled(bool? flag) => - (super.noSuchMethod(Invocation.method(#setDomStorageEnabled, [flag]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setJavaScriptCanOpenWindowsAutomatically(bool? flag) => - (super.noSuchMethod( - Invocation.method(#setJavaScriptCanOpenWindowsAutomatically, [flag]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setSupportMultipleWindows(bool? support) => (super - .noSuchMethod(Invocation.method(#setSupportMultipleWindows, [support]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setJavaScriptEnabled(bool? flag) => - (super.noSuchMethod(Invocation.method(#setJavaScriptEnabled, [flag]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setUserAgentString(String? userAgentString) => (super - .noSuchMethod(Invocation.method(#setUserAgentString, [userAgentString]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setMediaPlaybackRequiresUserGesture(bool? require) => - (super.noSuchMethod( - Invocation.method(#setMediaPlaybackRequiresUserGesture, [require]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setSupportZoom(bool? support) => - (super.noSuchMethod(Invocation.method(#setSupportZoom, [support]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setLoadWithOverviewMode(bool? overview) => (super - .noSuchMethod(Invocation.method(#setLoadWithOverviewMode, [overview]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setUseWideViewPort(bool? use) => - (super.noSuchMethod(Invocation.method(#setUseWideViewPort, [use]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setDisplayZoomControls(bool? enabled) => - (super.noSuchMethod(Invocation.method(#setDisplayZoomControls, [enabled]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setBuiltInZoomControls(bool? enabled) => - (super.noSuchMethod(Invocation.method(#setBuiltInZoomControls, [enabled]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setAllowFileAccess(bool? enabled) => - (super.noSuchMethod(Invocation.method(#setAllowFileAccess, [enabled]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i2.WebSettings copy() => (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeWebSettings_0()) as _i2.WebSettings); -} - -/// A class which mocks [WebStorage]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebStorage extends _i1.Mock implements _i2.WebStorage { - MockWebStorage() { - _i1.throwOnMissingStub(this); - } - - @override - _i4.Future deleteAllData() => - (super.noSuchMethod(Invocation.method(#deleteAllData, []), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i2.WebStorage copy() => (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeWebStorage_1()) as _i2.WebStorage); -} - -/// A class which mocks [WebView]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebView extends _i1.Mock implements _i2.WebView { - MockWebView() { - _i1.throwOnMissingStub(this); - } - - @override - bool get useHybridComposition => - (super.noSuchMethod(Invocation.getter(#useHybridComposition), - returnValue: false) as bool); - @override - _i2.WebSettings get settings => - (super.noSuchMethod(Invocation.getter(#settings), - returnValue: _FakeWebSettings_0()) as _i2.WebSettings); - @override - _i4.Future loadData( - {String? data, String? mimeType, String? encoding}) => - (super.noSuchMethod( - Invocation.method(#loadData, [], - {#data: data, #mimeType: mimeType, #encoding: encoding}), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future loadDataWithBaseUrl( - {String? baseUrl, - String? data, - String? mimeType, - String? encoding, - String? historyUrl}) => - (super.noSuchMethod( - Invocation.method(#loadDataWithBaseUrl, [], { - #baseUrl: baseUrl, - #data: data, - #mimeType: mimeType, - #encoding: encoding, - #historyUrl: historyUrl - }), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future loadUrl(String? url, Map? headers) => - (super.noSuchMethod(Invocation.method(#loadUrl, [url, headers]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future postUrl(String? url, _i5.Uint8List? data) => - (super.noSuchMethod(Invocation.method(#postUrl, [url, data]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future getUrl() => - (super.noSuchMethod(Invocation.method(#getUrl, []), - returnValue: Future.value()) as _i4.Future); - @override - _i4.Future canGoBack() => - (super.noSuchMethod(Invocation.method(#canGoBack, []), - returnValue: Future.value(false)) as _i4.Future); - @override - _i4.Future canGoForward() => - (super.noSuchMethod(Invocation.method(#canGoForward, []), - returnValue: Future.value(false)) as _i4.Future); - @override - _i4.Future goBack() => - (super.noSuchMethod(Invocation.method(#goBack, []), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future goForward() => - (super.noSuchMethod(Invocation.method(#goForward, []), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future reload() => - (super.noSuchMethod(Invocation.method(#reload, []), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future clearCache(bool? includeDiskFiles) => - (super.noSuchMethod(Invocation.method(#clearCache, [includeDiskFiles]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future evaluateJavascript(String? javascriptString) => (super - .noSuchMethod(Invocation.method(#evaluateJavascript, [javascriptString]), - returnValue: Future.value()) as _i4.Future); - @override - _i4.Future getTitle() => - (super.noSuchMethod(Invocation.method(#getTitle, []), - returnValue: Future.value()) as _i4.Future); - @override - _i4.Future scrollTo(int? x, int? y) => - (super.noSuchMethod(Invocation.method(#scrollTo, [x, y]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future scrollBy(int? x, int? y) => - (super.noSuchMethod(Invocation.method(#scrollBy, [x, y]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future getScrollX() => - (super.noSuchMethod(Invocation.method(#getScrollX, []), - returnValue: Future.value(0)) as _i4.Future); - @override - _i4.Future getScrollY() => - (super.noSuchMethod(Invocation.method(#getScrollY, []), - returnValue: Future.value(0)) as _i4.Future); - @override - _i4.Future setWebViewClient(_i2.WebViewClient? webViewClient) => - (super.noSuchMethod(Invocation.method(#setWebViewClient, [webViewClient]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future addJavaScriptChannel( - _i2.JavaScriptChannel? javaScriptChannel) => - (super.noSuchMethod( - Invocation.method(#addJavaScriptChannel, [javaScriptChannel]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future removeJavaScriptChannel( - _i2.JavaScriptChannel? javaScriptChannel) => - (super.noSuchMethod( - Invocation.method(#removeJavaScriptChannel, [javaScriptChannel]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setDownloadListener(_i2.DownloadListener? listener) => - (super.noSuchMethod(Invocation.method(#setDownloadListener, [listener]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setWebChromeClient(_i2.WebChromeClient? client) => - (super.noSuchMethod(Invocation.method(#setWebChromeClient, [client]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future setBackgroundColor(_i6.Color? color) => - (super.noSuchMethod(Invocation.method(#setBackgroundColor, [color]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i4.Future release() => - (super.noSuchMethod(Invocation.method(#release, []), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); - @override - _i2.WebView copy() => (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeWebView_2()) as _i2.WebView); -} - -/// A class which mocks [WebResourceRequest]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebResourceRequest extends _i1.Mock - implements _i2.WebResourceRequest { - MockWebResourceRequest() { - _i1.throwOnMissingStub(this); - } - - @override - String get url => - (super.noSuchMethod(Invocation.getter(#url), returnValue: '') as String); - @override - bool get isForMainFrame => (super - .noSuchMethod(Invocation.getter(#isForMainFrame), returnValue: false) - as bool); - @override - bool get hasGesture => - (super.noSuchMethod(Invocation.getter(#hasGesture), returnValue: false) - as bool); - @override - String get method => - (super.noSuchMethod(Invocation.getter(#method), returnValue: '') - as String); - @override - Map get requestHeaders => - (super.noSuchMethod(Invocation.getter(#requestHeaders), - returnValue: {}) as Map); -} - -/// A class which mocks [WebViewAndroidDownloadListener]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewAndroidDownloadListener extends _i1.Mock - implements _i7.WebViewAndroidDownloadListener { - MockWebViewAndroidDownloadListener() { - _i1.throwOnMissingStub(this); - } - - @override - _i4.Future Function(String, Map?) get loadUrl => - (super.noSuchMethod(Invocation.getter(#loadUrl), - returnValue: (String url, Map? headers) => - Future.value()) as _i4.Future Function( - String, Map?)); - @override - void onDownloadStart(String? url, String? userAgent, - String? contentDisposition, String? mimetype, int? contentLength) => - super.noSuchMethod( - Invocation.method(#onDownloadStart, - [url, userAgent, contentDisposition, mimetype, contentLength]), - returnValueForMissingStub: null); - @override - _i2.DownloadListener copy() => - (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeDownloadListener_3()) as _i2.DownloadListener); -} - -/// A class which mocks [WebViewAndroidJavaScriptChannel]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewAndroidJavaScriptChannel extends _i1.Mock - implements _i7.WebViewAndroidJavaScriptChannel { - MockWebViewAndroidJavaScriptChannel() { - _i1.throwOnMissingStub(this); - } - - @override - _i3.JavascriptChannelRegistry get javascriptChannelRegistry => - (super.noSuchMethod(Invocation.getter(#javascriptChannelRegistry), - returnValue: _FakeJavascriptChannelRegistry_4()) - as _i3.JavascriptChannelRegistry); - @override - String get channelName => - (super.noSuchMethod(Invocation.getter(#channelName), returnValue: '') - as String); - @override - void postMessage(String? message) => - super.noSuchMethod(Invocation.method(#postMessage, [message]), - returnValueForMissingStub: null); - @override - _i2.JavaScriptChannel copy() => - (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeJavaScriptChannel_5()) as _i2.JavaScriptChannel); -} - -/// A class which mocks [WebViewAndroidWebChromeClient]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewAndroidWebChromeClient extends _i1.Mock - implements _i7.WebViewAndroidWebChromeClient { - MockWebViewAndroidWebChromeClient() { - _i1.throwOnMissingStub(this); - } - - @override - void onProgressChanged(_i2.WebView? webView, int? progress) => super - .noSuchMethod(Invocation.method(#onProgressChanged, [webView, progress]), - returnValueForMissingStub: null); - @override - _i2.WebChromeClient copy() => - (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeWebChromeClient_6()) as _i2.WebChromeClient); -} - -/// A class which mocks [WebViewAndroidWebViewClient]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewAndroidWebViewClient extends _i1.Mock - implements _i7.WebViewAndroidWebViewClient { - MockWebViewAndroidWebViewClient() { - _i1.throwOnMissingStub(this); - } - - @override - void Function(String) get onPageStartedCallback => - (super.noSuchMethod(Invocation.getter(#onPageStartedCallback), - returnValue: (String url) {}) as void Function(String)); - @override - void Function(String) get onPageFinishedCallback => - (super.noSuchMethod(Invocation.getter(#onPageFinishedCallback), - returnValue: (String url) {}) as void Function(String)); - @override - void Function(_i3.WebResourceError) get onWebResourceErrorCallback => - (super.noSuchMethod(Invocation.getter(#onWebResourceErrorCallback), - returnValue: (_i3.WebResourceError error) {}) - as void Function(_i3.WebResourceError)); - @override - set onWebResourceErrorCallback( - void Function(_i3.WebResourceError)? _onWebResourceErrorCallback) => - super.noSuchMethod( - Invocation.setter( - #onWebResourceErrorCallback, _onWebResourceErrorCallback), - returnValueForMissingStub: null); - @override - bool get handlesNavigation => - (super.noSuchMethod(Invocation.getter(#handlesNavigation), - returnValue: false) as bool); - @override - bool get shouldOverrideUrlLoading => - (super.noSuchMethod(Invocation.getter(#shouldOverrideUrlLoading), - returnValue: false) as bool); - @override - void onPageStarted(_i2.WebView? webView, String? url) => - super.noSuchMethod(Invocation.method(#onPageStarted, [webView, url]), - returnValueForMissingStub: null); - @override - void onPageFinished(_i2.WebView? webView, String? url) => - super.noSuchMethod(Invocation.method(#onPageFinished, [webView, url]), - returnValueForMissingStub: null); - @override - void onReceivedError(_i2.WebView? webView, int? errorCode, - String? description, String? failingUrl) => - super.noSuchMethod( - Invocation.method( - #onReceivedError, [webView, errorCode, description, failingUrl]), - returnValueForMissingStub: null); - @override - void onReceivedRequestError(_i2.WebView? webView, - _i2.WebResourceRequest? request, _i2.WebResourceError? error) => - super.noSuchMethod( - Invocation.method(#onReceivedRequestError, [webView, request, error]), - returnValueForMissingStub: null); - @override - void urlLoading(_i2.WebView? webView, String? url) => - super.noSuchMethod(Invocation.method(#urlLoading, [webView, url]), - returnValueForMissingStub: null); - @override - void requestLoading(_i2.WebView? webView, _i2.WebResourceRequest? request) => - super.noSuchMethod(Invocation.method(#requestLoading, [webView, request]), - returnValueForMissingStub: null); - @override - _i2.WebViewClient copy() => (super.noSuchMethod(Invocation.method(#copy, []), - returnValue: _FakeWebViewClient_7()) as _i2.WebViewClient); -} - -/// A class which mocks [JavascriptChannelRegistry]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockJavascriptChannelRegistry extends _i1.Mock - implements _i3.JavascriptChannelRegistry { - MockJavascriptChannelRegistry() { - _i1.throwOnMissingStub(this); - } - - @override - Map get channels => - (super.noSuchMethod(Invocation.getter(#channels), - returnValue: {}) - as Map); - @override - void onJavascriptChannelMessage(String? channel, String? message) => - super.noSuchMethod( - Invocation.method(#onJavascriptChannelMessage, [channel, message]), - returnValueForMissingStub: null); - @override - void updateJavascriptChannelsFromSet(Set<_i3.JavascriptChannel>? channels) => - super.noSuchMethod( - Invocation.method(#updateJavascriptChannelsFromSet, [channels]), - returnValueForMissingStub: null); -} - -/// A class which mocks [WebViewPlatformCallbacksHandler]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewPlatformCallbacksHandler extends _i1.Mock - implements _i3.WebViewPlatformCallbacksHandler { - MockWebViewPlatformCallbacksHandler() { - _i1.throwOnMissingStub(this); - } - - @override - _i4.FutureOr onNavigationRequest({String? url, bool? isForMainFrame}) => - (super.noSuchMethod( - Invocation.method(#onNavigationRequest, [], - {#url: url, #isForMainFrame: isForMainFrame}), - returnValue: Future.value(false)) as _i4.FutureOr); - @override - void onPageStarted(String? url) => - super.noSuchMethod(Invocation.method(#onPageStarted, [url]), - returnValueForMissingStub: null); - @override - void onPageFinished(String? url) => - super.noSuchMethod(Invocation.method(#onPageFinished, [url]), - returnValueForMissingStub: null); - @override - void onProgress(int? progress) => - super.noSuchMethod(Invocation.method(#onProgress, [progress]), - returnValueForMissingStub: null); - @override - void onWebResourceError(_i3.WebResourceError? error) => - super.noSuchMethod(Invocation.method(#onWebResourceError, [error]), - returnValueForMissingStub: null); -} - -/// A class which mocks [WebViewProxy]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockWebViewProxy extends _i1.Mock implements _i7.WebViewProxy { - MockWebViewProxy() { - _i1.throwOnMissingStub(this); - } - - @override - _i2.WebView createWebView({bool? useHybridComposition}) => - (super.noSuchMethod( - Invocation.method(#createWebView, [], - {#useHybridComposition: useHybridComposition}), - returnValue: _FakeWebView_2()) as _i2.WebView); - @override - _i4.Future setWebContentsDebuggingEnabled(bool? enabled) => - (super.noSuchMethod( - Invocation.method(#setWebContentsDebuggingEnabled, [enabled]), - returnValue: Future.value(), - returnValueForMissingStub: Future.value()) as _i4.Future); -} From 1f0c7027a0a6195e3481e7df363a21fc66eb5b08 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 25 Jan 2023 10:45:55 -0800 Subject: [PATCH 39/46] Undo formatting changees for clarity --- packages/video_player/video_player/CHANGELOG.md | 1 - .../io/flutter/plugins/videoplayer/VideoPlayer.java | 13 ++++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index dc90ac6e63fe..64135fac4a50 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -33,7 +33,6 @@ * Fixes avoid_redundant_argument_values lint warnings and minor typos. - ## 2.4.5 * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231). 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 c9b840d838c8..6bc4d3b5547b 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 @@ -131,7 +131,6 @@ private static boolean isHTTP(Uri uri) { private MediaSource buildMediaSource( Uri uri, DataSource.Factory mediaDataSourceFactory, String formatHint, Context context) { - int type; if (formatHint == null) { type = Util.inferContentType(uri); @@ -245,8 +244,7 @@ void sendBufferingUpdate() { Map event = new HashMap<>(); event.put("event", "bufferingUpdate"); List range = Arrays.asList(0, exoPlayer.getBufferedPosition()); - // iOS supports a list of buffered ranges, so here is a list with a single - // range. + // iOS supports a list of buffered ranges, so here is a list with a single range. event.put("values", Collections.singletonList(range)); eventSink.success(event); } @@ -275,8 +273,7 @@ void setVolume(double value) { } void setPlaybackSpeed(double value) { - // We do not need to consider pitch and skipSilence for now as we do not handle - // them and + // We do not need to consider pitch and skipSilence for now as we do not handle them and // therefore never diverge from the default values. final PlaybackParameters playbackParameters = new PlaybackParameters(((float) value)); @@ -312,11 +309,9 @@ void sendInitialized() { event.put("width", width); event.put("height", height); - // Rotating the video with ExoPlayer does not seem to be possible with a - // Surface, + // Rotating the video with ExoPlayer does not seem to be possible with a Surface, // so inform the Flutter code that the widget needs to be rotated to prevent - // upside-down playback for videos with rotationDegrees of 180 (other - // orientations work + // upside-down playback for videos with rotationDegrees of 180 (other orientations work // correctly without correction). if (rotationDegrees == 180) { event.put("rotationCorrection", rotationDegrees); From 315d460d9e47643a15bf4a581f1da3f50e83fa47 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 25 Jan 2023 14:03:02 -0800 Subject: [PATCH 40/46] Add tests --- .../plugins/videoplayer/VideoPlayer.java | 46 +++++----- .../plugins/videoplayer/VideoPlayerTest.java | 88 ++++++++++++++++++- 2 files changed, 104 insertions(+), 30 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 6bc4d3b5547b..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 @@ -62,6 +62,8 @@ final class VideoPlayer { private final VideoPlayerOptions options; + private DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory(); + VideoPlayer( Context context, EventChannel eventChannel, @@ -75,28 +77,11 @@ final class VideoPlayer { this.options = options; ExoPlayer exoPlayer = new ExoPlayer.Builder(context).build(); - Uri uri = Uri.parse(dataSource); - DataSource.Factory dataSourceFactory; - - DefaultHttpDataSource.Factory httpDataSourceFactory = - new DefaultHttpDataSource.Factory() - .setUserAgent("ExoPlayer") - .setAllowCrossProtocolRedirects(true); - - if (httpHeaders != null && !httpHeaders.isEmpty()) { - if (httpHeaders.containsKey(USER_AGENT)) { - httpDataSourceFactory = - new DefaultHttpDataSource.Factory() - .setUserAgent(httpHeaders.get(USER_AGENT)) - .setAllowCrossProtocolRedirects(true); - } - - httpDataSourceFactory.setDefaultRequestProperties(httpHeaders); - } - - dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); + buildHttpDataSourceFactory(httpHeaders); + DataSource.Factory dataSourceFactory = + new DefaultDataSource.Factory(context, httpDataSourceFactory); MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); @@ -113,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( 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(); From abb90379439d582d4bd71d53173149638df8992a Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Fri, 27 Jan 2023 20:03:44 +0200 Subject: [PATCH 41/46] fixed dart test --- .../video_player/video_player/test/video_player_test.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 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 7bffdb41ba48..2ff082ee662c 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -365,12 +365,15 @@ void main() { ); await controller.initialize(); - expect(fakeVideoPlayerPlatform.dataSources[0].uri, 'file://a.avi'); + 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( From cb6e378458c3c341d5aeaa4e27a575d2fcbc3a51 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Fri, 27 Jan 2023 20:57:44 +0200 Subject: [PATCH 42/46] formatting --- .../video_player/video_player/test/video_player_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 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 2ff082ee662c..73218f7a5d07 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -365,10 +365,10 @@ void main() { ); await controller.initialize(); - final String uri = fakeVideoPlayerPlatform.dataSources[0].uri!; + 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'}, From 1d15a23d3823830417c566aa5306c3652c62acbd Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 28 Jan 2023 00:20:45 +0200 Subject: [PATCH 43/46] updated change logs --- packages/video_player/video_player/CHANGELOG.md | 2 +- packages/video_player/video_player/lib/video_player.dart | 3 ++- packages/video_player/video_player_android/CHANGELOG.md | 8 ++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 64135fac4a50..744894a4596e 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,7 +1,7 @@ ## 2.5.2 * Updates minimum Flutter version to 3.0. -* Added option to configure HTTP headers via `VideoPlayerController` to fix access to M3U8 files on Android. +* 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 ca81008c4bbb..31858d354921 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 and optionally, the User-Agent + /// [httpHeaders] option allows to specify HTTP headers. /// for the request to the [dataSource]. VideoPlayerController.network( this.dataSource, { @@ -246,6 +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) 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 d6c09a367509..3b96f24af564 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,6 +1,12 @@ ## NEXT * Updates minimum Flutter version to 3.0. + + +## 2.3.11 + +* Adds option to configure the User-Agent in the HTTP headers. + ## 2.3.10 @@ -12,9 +18,7 @@ * Fixes violations of new analysis option use_named_constants. * Removes an unnecessary override in example code. -## 2.3.10 -* Added option to configure the User-Agent in the HTTP headers for the ExoPlayer agent. ## 2.3.9 From 55923d935e1fcbddfa45d56c1b9f5c789789af41 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 28 Jan 2023 00:21:07 +0200 Subject: [PATCH 44/46] updated version --- packages/video_player/video_player_android/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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" From 4ce6747cfd3a2ab04d98acf7d69572656ec594e9 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 1 Feb 2023 23:11:10 +0200 Subject: [PATCH 45/46] removed next since new version exists --- packages/video_player/video_player_android/CHANGELOG.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 3b96f24af564..aae23997baeb 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,10 +1,6 @@ -## NEXT -* Updates minimum Flutter version to 3.0. - - ## 2.3.11 - +* Updates minimum Flutter version to 3.0. * Adds option to configure the User-Agent in the HTTP headers. From bac9c7530507f24a530da9e71d5d4f24dd6a1f76 Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Wed, 1 Feb 2023 23:11:24 +0200 Subject: [PATCH 46/46] fixed spacing --- packages/video_player/video_player_android/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index aae23997baeb..0e8142368fc6 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.11 + * Updates minimum Flutter version to 3.0. * Adds option to configure the User-Agent in the HTTP headers.