From e8cf60c6e078b16b9ec30251a7917cd6ee2a1d31 Mon Sep 17 00:00:00 2001 From: Kudo Chien Date: Sat, 1 Oct 2022 00:24:28 +0800 Subject: [PATCH 1/3] [av] upgrade exoplayer --- android/expoview/build.gradle | 2 +- .../av/SharedCookiesDataSourceFactory.kt | 1 + packages/expo-av/android/build.gradle | 4 +- .../av/player/SimpleExoPlayerData.java | 59 ++++++++----------- .../CustomHeadersOkHttpDataSourceFactory.java | 47 --------------- .../CustomHeadersOkHttpDataSourceFactory.kt | 12 ++-- 6 files changed, 34 insertions(+), 91 deletions(-) delete mode 100644 packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java rename {android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av => packages/expo-av/android/src/main/java/expo/modules/av/player/datasource}/CustomHeadersOkHttpDataSourceFactory.kt (76%) diff --git a/android/expoview/build.gradle b/android/expoview/build.gradle index a0eda0263f7cf..a1475f25b65f3 100644 --- a/android/expoview/build.gradle +++ b/android/expoview/build.gradle @@ -406,7 +406,7 @@ dependencies { // expo-av // See explanation in expo-av/build.gradle - api 'com.google.android.exoplayer:extension-okhttp:2.13.3' + api 'com.google.android.exoplayer:extension-okhttp:2.18.1' // expo-application api 'com.android.installreferrer:installreferrer:1.0' diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt b/android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt index 6a51a40817bee..601e31c4cf3e8 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt +++ b/android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt @@ -5,6 +5,7 @@ import com.facebook.react.modules.network.NetworkingModule import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory import com.google.android.exoplayer2.upstream.TransferListener +import expo.modules.av.player.datasource.CustomHeadersOkHttpDataSourceFactory class SharedCookiesDataSourceFactory( reactApplicationContext: ReactContext, diff --git a/packages/expo-av/android/build.gradle b/packages/expo-av/android/build.gradle index b78d285aa0183..359df90643773 100644 --- a/packages/expo-av/android/build.gradle +++ b/packages/expo-av/android/build.gradle @@ -151,8 +151,8 @@ dependencies { extractHeaders 'com.facebook.fbjni:fbjni:0.2.2:headers' extractJNI 'com.facebook.fbjni:fbjni:0.2.2' - api 'com.google.android.exoplayer:exoplayer:2.13.3' - api 'com.google.android.exoplayer:extension-okhttp:2.13.3' + api 'com.google.android.exoplayer:exoplayer:2.18.1' + api 'com.google.android.exoplayer:extension-okhttp:2.18.1' api "com.squareup.okhttp3:okhttp:3.14.9" api "com.squareup.okhttp3:okhttp-urlconnection:3.14.9" diff --git a/packages/expo-av/android/src/main/java/expo/modules/av/player/SimpleExoPlayerData.java b/packages/expo-av/android/src/main/java/expo/modules/av/player/SimpleExoPlayerData.java index 8f1b9ed478f6e..672871d458693 100644 --- a/packages/expo-av/android/src/main/java/expo/modules/av/player/SimpleExoPlayerData.java +++ b/packages/expo-av/android/src/main/java/expo/modules/av/player/SimpleExoPlayerData.java @@ -13,16 +13,16 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; 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.SimpleExoPlayer; -import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceEventListener; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -37,7 +37,7 @@ import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.upstream.RawResourceDataSource; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoListener; +import com.google.android.exoplayer2.video.VideoSize; import java.io.IOException; import java.util.Map; @@ -47,7 +47,7 @@ import expo.modules.av.player.datasource.DataSourceFactoryProvider; class SimpleExoPlayerData extends PlayerData - implements Player.EventListener, MediaSourceEventListener, VideoListener { + implements Player.Listener, MediaSourceEventListener { private static final String IMPLEMENTATION_NAME = "SimpleExoPlayer"; private static final String TAG = SimpleExoPlayerData.class.getSimpleName(); @@ -92,7 +92,6 @@ public void load(final Bundle status, final LoadCompletionListener loadCompletio .build(); mSimpleExoPlayer.addListener(this); - mSimpleExoPlayer.addVideoListener(this); // Produces DataSource instances through which media data is loaded. final DataSource.Factory dataSourceFactory = mAVModule.getModuleRegistry() @@ -263,7 +262,7 @@ public void updateVolumeMuteAndDuck() { // endregion - // region ExoPlayer.EventListener + // region Player.Listener @Override public void onLoadingChanged(final boolean isLoading) { @@ -275,11 +274,6 @@ public void onLoadingChanged(final boolean isLoading) { public void onPlaybackParametersChanged(PlaybackParameters parameters) { } - @Override - public void onSeekProcessed() { - - } - @Override public void onRepeatModeChanged(int repeatMode) { } @@ -312,7 +306,7 @@ public void onPlayerStateChanged(final boolean playWhenReady, final int playback } @Override - public void onPlayerError(final ExoPlaybackException error) { + public void onPlayerError(PlaybackException error) { onFatalError(error.getCause()); } @@ -325,11 +319,27 @@ public void onPositionDiscontinuity(int reason) { // Source: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Timeline.Period.html // So I guess it's safe to say that when a period transition happens, // media file transition happens, so we just finished playing one. - if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) { + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { callStatusUpdateListenerWithDidJustFinish(); } } + @Override + public void onVideoSizeChanged(VideoSize videoSize) { + mVideoWidthHeight = new Pair<>(videoSize.width, videoSize.height); + if (mFirstFrameRendered && mVideoSizeUpdateListener != null) { + mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); + } + } + + @Override + public void onRenderedFirstFrame() { + if (!mFirstFrameRendered && mVideoWidthHeight != null && mVideoSizeUpdateListener != null) { + mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); + } + mFirstFrameRendered = true; + } + // endregion // region MediaSourceEventListener @@ -363,27 +373,6 @@ private void onFatalError(final Throwable error) { // endregion - // region VideoListener - - @Override - public void onVideoSizeChanged(final int width, final int height, final int unAppliedRotationDegrees, final float pixelWidthHeightRatio) { - // TODO other params? - mVideoWidthHeight = new Pair<>(width, height); - if (mFirstFrameRendered && mVideoSizeUpdateListener != null) { - mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); - } - } - - @Override - public void onRenderedFirstFrame() { - if (!mFirstFrameRendered && mVideoWidthHeight != null && mVideoSizeUpdateListener != null) { - mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); - } - mFirstFrameRendered = true; - } - - // endregion - private MediaSource buildMediaSource(@NonNull Uri uri, String overrideExtension, DataSource.Factory factory) { try { if (uri.getScheme() == null) { @@ -405,7 +394,7 @@ private MediaSource buildMediaSource(@NonNull Uri uri, String overrideExtension, case C.TYPE_HLS: return new HlsMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_OTHER: - return new ExtractorMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); + return new ProgressiveMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); default: { throw new IllegalStateException("Content of this type is unsupported at the moment. Unsupported type: " + type); } diff --git a/packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java b/packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java deleted file mode 100644 index d127b7fd543d2..0000000000000 --- a/packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package expo.modules.av.player.datasource; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.HttpDataSource; -import com.google.android.exoplayer2.upstream.TransferListener; - -import java.util.Map; - -import okhttp3.CacheControl; -import okhttp3.Call; - -// Mainly a copy of com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory, -// because it's declared as final :( -public class CustomHeadersOkHttpDataSourceFactory extends HttpDataSource.BaseFactory { - @NonNull - private final Call.Factory mCallFactory; - @Nullable - private final String mUserAgent; - @Nullable - private final CacheControl mCacheControl; - - public CustomHeadersOkHttpDataSourceFactory(@NonNull Call.Factory callFactory, @Nullable String userAgent, @Nullable Map requestHeaders) { - super(); - mCallFactory = callFactory; - mUserAgent = userAgent; - mCacheControl = null; - updateRequestProperties(getDefaultRequestProperties(), requestHeaders); - } - - protected void updateRequestProperties(HttpDataSource.RequestProperties requestProperties, @Nullable Map requestHeaders) { - if (requestHeaders != null) { - for (Map.Entry headerEntry : requestHeaders.entrySet()) { - if (headerEntry.getValue() instanceof String) { - requestProperties.set(headerEntry.getKey(), (String) headerEntry.getValue()); - } - } - } - } - - protected OkHttpDataSource createDataSourceInternal(HttpDataSource.RequestProperties defaultRequestProperties) { - return new OkHttpDataSource(mCallFactory, mUserAgent, mCacheControl, defaultRequestProperties); - } -} diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt b/packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt similarity index 76% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt rename to packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt index 0dd7f1f832c1e..f6045994473f3 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt +++ b/packages/expo-av/android/src/main/java/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt @@ -1,5 +1,6 @@ -package versioned.host.exp.exponent.modules.universal.av +package expo.modules.av.player.datasource +import androidx.collection.ArrayMap import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory import com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource @@ -15,16 +16,15 @@ class CustomHeadersOkHttpDataSourceFactory( ) : BaseFactory() { private val cacheControl: CacheControl? = null - private fun updateRequestProperties( - requestProperties: RequestProperties, - requestHeaders: Map? - ) { + private fun updateRequestProperties(requestHeaders: Map?) { if (requestHeaders != null) { + val requestProperties = ArrayMap() for ((key, value) in requestHeaders) { if (value is String) { requestProperties[key] = value } } + setDefaultRequestProperties(requestProperties) } } @@ -33,6 +33,6 @@ class CustomHeadersOkHttpDataSourceFactory( } init { - updateRequestProperties(defaultRequestProperties, requestHeaders) + updateRequestProperties(requestHeaders) } } From 9adb4a9a889ac253e78cad889078271fe6520721 Mon Sep 17 00:00:00 2001 From: Kudo Chien Date: Sat, 1 Oct 2022 01:26:47 +0800 Subject: [PATCH 2/3] [android] backport to versioned code --- .../expoview-abi45_0_0/build.gradle | 2 +- .../av/player/SimpleExoPlayerData.java | 59 ++++++++----------- .../CustomHeadersOkHttpDataSourceFactory.java | 47 --------------- .../CustomHeadersOkHttpDataSourceFactory.kt | 12 ++-- .../av/SharedCookiesDataSourceFactory.kt | 1 + .../expoview-abi46_0_0/build.gradle | 2 +- .../av/player/SimpleExoPlayerData.java | 59 ++++++++----------- .../CustomHeadersOkHttpDataSourceFactory.java | 47 --------------- .../CustomHeadersOkHttpDataSourceFactory.kt | 12 ++-- .../av/SharedCookiesDataSourceFactory.kt | 1 + 10 files changed, 64 insertions(+), 178 deletions(-) delete mode 100644 android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java rename android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/{host/exp/exponent/modules/universal/av => expo/modules/av/player/datasource}/CustomHeadersOkHttpDataSourceFactory.kt (76%) delete mode 100644 android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java rename android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/{host/exp/exponent/modules/universal/av => expo/modules/av/player/datasource}/CustomHeadersOkHttpDataSourceFactory.kt (76%) diff --git a/android/versioned-abis/expoview-abi45_0_0/build.gradle b/android/versioned-abis/expoview-abi45_0_0/build.gradle index af36e999a8ab8..7ec94d6493201 100644 --- a/android/versioned-abis/expoview-abi45_0_0/build.gradle +++ b/android/versioned-abis/expoview-abi45_0_0/build.gradle @@ -191,7 +191,7 @@ dependencies { // expo-av // See explanation in expo-av/build.gradle - api 'com.google.android.exoplayer:extension-okhttp:2.13.3' + api 'com.google.android.exoplayer:extension-okhttp:2.18.1' // expo-application api 'com.android.installreferrer:installreferrer:1.0' diff --git a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/SimpleExoPlayerData.java b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/SimpleExoPlayerData.java index 6c803fa7c63e9..7b97200d521c9 100644 --- a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/SimpleExoPlayerData.java +++ b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/SimpleExoPlayerData.java @@ -13,16 +13,16 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; 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.SimpleExoPlayer; -import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceEventListener; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -37,7 +37,7 @@ import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.upstream.RawResourceDataSource; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoListener; +import com.google.android.exoplayer2.video.VideoSize; import java.io.IOException; import java.util.Map; @@ -47,7 +47,7 @@ import abi45_0_0.expo.modules.av.player.datasource.DataSourceFactoryProvider; class SimpleExoPlayerData extends PlayerData - implements Player.EventListener, MediaSourceEventListener, VideoListener { + implements Player.Listener, MediaSourceEventListener { private static final String IMPLEMENTATION_NAME = "SimpleExoPlayer"; private static final String TAG = SimpleExoPlayerData.class.getSimpleName(); @@ -92,7 +92,6 @@ public void load(final Bundle status, final LoadCompletionListener loadCompletio .build(); mSimpleExoPlayer.addListener(this); - mSimpleExoPlayer.addVideoListener(this); // Produces DataSource instances through which media data is loaded. final DataSource.Factory dataSourceFactory = mAVModule.getModuleRegistry() @@ -263,7 +262,7 @@ public void updateVolumeMuteAndDuck() { // endregion - // region ExoPlayer.EventListener + // region Player.Listener @Override public void onLoadingChanged(final boolean isLoading) { @@ -275,11 +274,6 @@ public void onLoadingChanged(final boolean isLoading) { public void onPlaybackParametersChanged(PlaybackParameters parameters) { } - @Override - public void onSeekProcessed() { - - } - @Override public void onRepeatModeChanged(int repeatMode) { } @@ -312,7 +306,7 @@ public void onPlayerStateChanged(final boolean playWhenReady, final int playback } @Override - public void onPlayerError(final ExoPlaybackException error) { + public void onPlayerError(PlaybackException error) { onFatalError(error.getCause()); } @@ -325,11 +319,27 @@ public void onPositionDiscontinuity(int reason) { // Source: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Timeline.Period.html // So I guess it's safe to say that when a period transition happens, // media file transition happens, so we just finished playing one. - if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) { + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { callStatusUpdateListenerWithDidJustFinish(); } } + @Override + public void onVideoSizeChanged(VideoSize videoSize) { + mVideoWidthHeight = new Pair<>(videoSize.width, videoSize.height); + if (mFirstFrameRendered && mVideoSizeUpdateListener != null) { + mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); + } + } + + @Override + public void onRenderedFirstFrame() { + if (!mFirstFrameRendered && mVideoWidthHeight != null && mVideoSizeUpdateListener != null) { + mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); + } + mFirstFrameRendered = true; + } + // endregion // region MediaSourceEventListener @@ -363,27 +373,6 @@ private void onFatalError(final Throwable error) { // endregion - // region VideoListener - - @Override - public void onVideoSizeChanged(final int width, final int height, final int unAppliedRotationDegrees, final float pixelWidthHeightRatio) { - // TODO other params? - mVideoWidthHeight = new Pair<>(width, height); - if (mFirstFrameRendered && mVideoSizeUpdateListener != null) { - mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); - } - } - - @Override - public void onRenderedFirstFrame() { - if (!mFirstFrameRendered && mVideoWidthHeight != null && mVideoSizeUpdateListener != null) { - mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); - } - mFirstFrameRendered = true; - } - - // endregion - private MediaSource buildMediaSource(@NonNull Uri uri, String overrideExtension, DataSource.Factory factory) { try { if (uri.getScheme() == null) { @@ -405,7 +394,7 @@ private MediaSource buildMediaSource(@NonNull Uri uri, String overrideExtension, case C.TYPE_HLS: return new HlsMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_OTHER: - return new ExtractorMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); + return new ProgressiveMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); default: { throw new IllegalStateException("Content of this type is unsupported at the moment. Unsupported type: " + type); } diff --git a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java deleted file mode 100644 index 3f52a35b786e5..0000000000000 --- a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package abi45_0_0.expo.modules.av.player.datasource; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.HttpDataSource; -import com.google.android.exoplayer2.upstream.TransferListener; - -import java.util.Map; - -import okhttp3.CacheControl; -import okhttp3.Call; - -// Mainly a copy of com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory, -// because it's declared as final :( -public class CustomHeadersOkHttpDataSourceFactory extends HttpDataSource.BaseFactory { - @NonNull - private final Call.Factory mCallFactory; - @Nullable - private final String mUserAgent; - @Nullable - private final CacheControl mCacheControl; - - public CustomHeadersOkHttpDataSourceFactory(@NonNull Call.Factory callFactory, @Nullable String userAgent, @Nullable Map requestHeaders) { - super(); - mCallFactory = callFactory; - mUserAgent = userAgent; - mCacheControl = null; - updateRequestProperties(getDefaultRequestProperties(), requestHeaders); - } - - protected void updateRequestProperties(HttpDataSource.RequestProperties requestProperties, @Nullable Map requestHeaders) { - if (requestHeaders != null) { - for (Map.Entry headerEntry : requestHeaders.entrySet()) { - if (headerEntry.getValue() instanceof String) { - requestProperties.set(headerEntry.getKey(), (String) headerEntry.getValue()); - } - } - } - } - - protected OkHttpDataSource createDataSourceInternal(HttpDataSource.RequestProperties defaultRequestProperties) { - return new OkHttpDataSource(mCallFactory, mUserAgent, mCacheControl, defaultRequestProperties); - } -} diff --git a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt similarity index 76% rename from android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt rename to android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt index a492a170d06ea..14f12787e6c2d 100644 --- a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt +++ b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt @@ -1,5 +1,6 @@ -package abi45_0_0.host.exp.exponent.modules.universal.av +package abi45_0_0.expo.modules.av.player.datasource +import androidx.collection.ArrayMap import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory import com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource @@ -15,16 +16,15 @@ class CustomHeadersOkHttpDataSourceFactory( ) : BaseFactory() { private val cacheControl: CacheControl? = null - private fun updateRequestProperties( - requestProperties: RequestProperties, - requestHeaders: Map? - ) { + private fun updateRequestProperties(requestHeaders: Map?) { if (requestHeaders != null) { + val requestProperties = ArrayMap() for ((key, value) in requestHeaders) { if (value is String) { requestProperties[key] = value } } + setDefaultRequestProperties(requestProperties) } } @@ -33,6 +33,6 @@ class CustomHeadersOkHttpDataSourceFactory( } init { - updateRequestProperties(defaultRequestProperties, requestHeaders) + updateRequestProperties(requestHeaders) } } diff --git a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt index 3a43d09af8a4a..8bda76d3eb61f 100644 --- a/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt +++ b/android/versioned-abis/expoview-abi45_0_0/src/main/java/abi45_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt @@ -2,6 +2,7 @@ package abi45_0_0.host.exp.exponent.modules.universal.av import abi45_0_0.com.facebook.react.bridge.ReactContext import abi45_0_0.com.facebook.react.modules.network.NetworkingModule +import abi45_0_0.expo.modules.av.player.datasource.CustomHeadersOkHttpDataSourceFactory import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory import com.google.android.exoplayer2.upstream.TransferListener diff --git a/android/versioned-abis/expoview-abi46_0_0/build.gradle b/android/versioned-abis/expoview-abi46_0_0/build.gradle index 4d796643851bb..c4ca05e8342c1 100644 --- a/android/versioned-abis/expoview-abi46_0_0/build.gradle +++ b/android/versioned-abis/expoview-abi46_0_0/build.gradle @@ -181,7 +181,7 @@ dependencies { // expo-av // See explanation in expo-av/build.gradle - api 'com.google.android.exoplayer:extension-okhttp:2.13.3' + api 'com.google.android.exoplayer:extension-okhttp:2.18.1' // expo-application api 'com.android.installreferrer:installreferrer:1.0' diff --git a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/SimpleExoPlayerData.java b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/SimpleExoPlayerData.java index 4beafc5b3b193..05b3fe64a5d6c 100644 --- a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/SimpleExoPlayerData.java +++ b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/SimpleExoPlayerData.java @@ -13,16 +13,16 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; 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.SimpleExoPlayer; -import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceEventListener; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -37,7 +37,7 @@ import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.upstream.RawResourceDataSource; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoListener; +import com.google.android.exoplayer2.video.VideoSize; import java.io.IOException; import java.util.Map; @@ -47,7 +47,7 @@ import abi46_0_0.expo.modules.av.player.datasource.DataSourceFactoryProvider; class SimpleExoPlayerData extends PlayerData - implements Player.EventListener, MediaSourceEventListener, VideoListener { + implements Player.Listener, MediaSourceEventListener { private static final String IMPLEMENTATION_NAME = "SimpleExoPlayer"; private static final String TAG = SimpleExoPlayerData.class.getSimpleName(); @@ -92,7 +92,6 @@ public void load(final Bundle status, final LoadCompletionListener loadCompletio .build(); mSimpleExoPlayer.addListener(this); - mSimpleExoPlayer.addVideoListener(this); // Produces DataSource instances through which media data is loaded. final DataSource.Factory dataSourceFactory = mAVModule.getModuleRegistry() @@ -263,7 +262,7 @@ public void updateVolumeMuteAndDuck() { // endregion - // region ExoPlayer.EventListener + // region Player.Listener @Override public void onLoadingChanged(final boolean isLoading) { @@ -275,11 +274,6 @@ public void onLoadingChanged(final boolean isLoading) { public void onPlaybackParametersChanged(PlaybackParameters parameters) { } - @Override - public void onSeekProcessed() { - - } - @Override public void onRepeatModeChanged(int repeatMode) { } @@ -312,7 +306,7 @@ public void onPlayerStateChanged(final boolean playWhenReady, final int playback } @Override - public void onPlayerError(final ExoPlaybackException error) { + public void onPlayerError(PlaybackException error) { onFatalError(error.getCause()); } @@ -325,11 +319,27 @@ public void onPositionDiscontinuity(int reason) { // Source: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Timeline.Period.html // So I guess it's safe to say that when a period transition happens, // media file transition happens, so we just finished playing one. - if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) { + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { callStatusUpdateListenerWithDidJustFinish(); } } + @Override + public void onVideoSizeChanged(VideoSize videoSize) { + mVideoWidthHeight = new Pair<>(videoSize.width, videoSize.height); + if (mFirstFrameRendered && mVideoSizeUpdateListener != null) { + mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); + } + } + + @Override + public void onRenderedFirstFrame() { + if (!mFirstFrameRendered && mVideoWidthHeight != null && mVideoSizeUpdateListener != null) { + mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); + } + mFirstFrameRendered = true; + } + // endregion // region MediaSourceEventListener @@ -363,27 +373,6 @@ private void onFatalError(final Throwable error) { // endregion - // region VideoListener - - @Override - public void onVideoSizeChanged(final int width, final int height, final int unAppliedRotationDegrees, final float pixelWidthHeightRatio) { - // TODO other params? - mVideoWidthHeight = new Pair<>(width, height); - if (mFirstFrameRendered && mVideoSizeUpdateListener != null) { - mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); - } - } - - @Override - public void onRenderedFirstFrame() { - if (!mFirstFrameRendered && mVideoWidthHeight != null && mVideoSizeUpdateListener != null) { - mVideoSizeUpdateListener.onVideoSizeUpdate(mVideoWidthHeight); - } - mFirstFrameRendered = true; - } - - // endregion - private MediaSource buildMediaSource(@NonNull Uri uri, String overrideExtension, DataSource.Factory factory) { try { if (uri.getScheme() == null) { @@ -405,7 +394,7 @@ private MediaSource buildMediaSource(@NonNull Uri uri, String overrideExtension, case C.TYPE_HLS: return new HlsMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_OTHER: - return new ExtractorMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); + return new ProgressiveMediaSource.Factory(factory).createMediaSource(MediaItem.fromUri(uri)); default: { throw new IllegalStateException("Content of this type is unsupported at the moment. Unsupported type: " + type); } diff --git a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java deleted file mode 100644 index f9aaae73860f0..0000000000000 --- a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package abi46_0_0.expo.modules.av.player.datasource; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.HttpDataSource; -import com.google.android.exoplayer2.upstream.TransferListener; - -import java.util.Map; - -import okhttp3.CacheControl; -import okhttp3.Call; - -// Mainly a copy of com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory, -// because it's declared as final :( -public class CustomHeadersOkHttpDataSourceFactory extends HttpDataSource.BaseFactory { - @NonNull - private final Call.Factory mCallFactory; - @Nullable - private final String mUserAgent; - @Nullable - private final CacheControl mCacheControl; - - public CustomHeadersOkHttpDataSourceFactory(@NonNull Call.Factory callFactory, @Nullable String userAgent, @Nullable Map requestHeaders) { - super(); - mCallFactory = callFactory; - mUserAgent = userAgent; - mCacheControl = null; - updateRequestProperties(getDefaultRequestProperties(), requestHeaders); - } - - protected void updateRequestProperties(HttpDataSource.RequestProperties requestProperties, @Nullable Map requestHeaders) { - if (requestHeaders != null) { - for (Map.Entry headerEntry : requestHeaders.entrySet()) { - if (headerEntry.getValue() instanceof String) { - requestProperties.set(headerEntry.getKey(), (String) headerEntry.getValue()); - } - } - } - } - - protected OkHttpDataSource createDataSourceInternal(HttpDataSource.RequestProperties defaultRequestProperties) { - return new OkHttpDataSource(mCallFactory, mUserAgent, mCacheControl, defaultRequestProperties); - } -} diff --git a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt similarity index 76% rename from android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt rename to android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt index d1481b565a191..aa078928889fb 100644 --- a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/CustomHeadersOkHttpDataSourceFactory.kt +++ b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/expo/modules/av/player/datasource/CustomHeadersOkHttpDataSourceFactory.kt @@ -1,5 +1,6 @@ -package abi46_0_0.host.exp.exponent.modules.universal.av +package abi46_0_0.expo.modules.av.player.datasource +import androidx.collection.ArrayMap import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory import com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource @@ -15,16 +16,15 @@ class CustomHeadersOkHttpDataSourceFactory( ) : BaseFactory() { private val cacheControl: CacheControl? = null - private fun updateRequestProperties( - requestProperties: RequestProperties, - requestHeaders: Map? - ) { + private fun updateRequestProperties(requestHeaders: Map?) { if (requestHeaders != null) { + val requestProperties = ArrayMap() for ((key, value) in requestHeaders) { if (value is String) { requestProperties[key] = value } } + setDefaultRequestProperties(requestProperties) } } @@ -33,6 +33,6 @@ class CustomHeadersOkHttpDataSourceFactory( } init { - updateRequestProperties(defaultRequestProperties, requestHeaders) + updateRequestProperties(requestHeaders) } } diff --git a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt index 584bb452f0bb9..1fb365a7365a1 100644 --- a/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt +++ b/android/versioned-abis/expoview-abi46_0_0/src/main/java/abi46_0_0/host/exp/exponent/modules/universal/av/SharedCookiesDataSourceFactory.kt @@ -2,6 +2,7 @@ package abi46_0_0.host.exp.exponent.modules.universal.av import abi46_0_0.com.facebook.react.bridge.ReactContext import abi46_0_0.com.facebook.react.modules.network.NetworkingModule +import abi46_0_0.expo.modules.av.player.datasource.CustomHeadersOkHttpDataSourceFactory import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory import com.google.android.exoplayer2.upstream.TransferListener From 3ad991a47aebfe9e3a8f45a0981827ad4c5ea11b Mon Sep 17 00:00:00 2001 From: Kudo Chien Date: Sat, 1 Oct 2022 01:36:10 +0800 Subject: [PATCH 3/3] update changelog --- packages/expo-av/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/expo-av/CHANGELOG.md b/packages/expo-av/CHANGELOG.md index 2fea019fff112..a4a7f9eb6b597 100644 --- a/packages/expo-av/CHANGELOG.md +++ b/packages/expo-av/CHANGELOG.md @@ -22,6 +22,10 @@ - Drop `@expo/config-plugins` dependency in favor of peer dependency on `expo`. ([#18595](https://github.com/expo/expo/pull/18595) by [@EvanBacon](https://github.com/EvanBacon)) - Remove unnecessary CocoaPods dependency on `ReactCommon` and `React-runtimeexecutor`. ([#19067](https://github.com/expo/expo/pull/19067) by [@tsapeta](https://github.com/tsapeta)) +### 📚 3rd party library updates + +- Upgraded ExoPlayer dependencies to 2.18.1 on Android. ([#19332](https://github.com/expo/expo/pull/19332) by [@kudo](https://github.com/kudo)) + ## 12.0.2 — 2022-07-18 ### 🐛 Bug fixes