From 04f67e4adcced2bb6e3ebf63605bc49e7518b783 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 7 Sep 2020 18:17:21 +0100 Subject: [PATCH] Simplify DefaultMediaSourceFactory ad configuration - Use a setter, which is consistent with how other optional components are passed. - Remove nesting where a provider provides another provider. Since AdSupportProvider then only provides one thing, it can be renamed to AdsLoaderProvider, which more clearly expresses what it provides. PiperOrigin-RevId: 330396334 --- .../android/exoplayer2/demo/DemoUtil.java | 11 +- .../exoplayer2/demo/PlayerActivity.java | 56 ++++---- .../demo/SampleChooserActivity.java | 5 +- .../exoplayer2/ext/ima/ImaPlaybackTest.java | 3 +- .../exoplayer2/ext/media2/PlayerTestRule.java | 2 +- .../google/android/exoplayer2/ExoPlayer.java | 2 +- .../android/exoplayer2/ExoPlayerFactory.java | 4 +- .../android/exoplayer2/MetadataRetriever.java | 6 +- .../android/exoplayer2/SimpleExoPlayer.java | 2 +- .../exoplayer2/offline/DownloadHelper.java | 2 +- .../source/DefaultMediaSourceFactory.java | 135 ++++++++---------- .../source/DefaultMediaSourceFactoryTest.java | 60 +++----- .../dash/DefaultMediaSourceFactoryTest.java | 11 +- .../hls/DefaultMediaSourceFactoryTest.java | 11 +- .../DefaultMediaSourceFactoryTest.java | 13 +- 15 files changed, 142 insertions(+), 181 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java index 669e09ed70..c3621879c5 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java @@ -50,6 +50,7 @@ public final class DemoUtil { private static final String DOWNLOAD_TRACKER_ACTION_FILE = "tracked_actions"; private static final String DOWNLOAD_CONTENT_DIRECTORY = "downloads"; + private static @MonotonicNonNull String userAgent; private static DataSource.@MonotonicNonNull Factory dataSourceFactory; private static HttpDataSource.@MonotonicNonNull Factory httpDataSourceFactory; private static @MonotonicNonNull DatabaseProvider databaseProvider; @@ -77,17 +78,23 @@ public final class DemoUtil { .setExtensionRendererMode(extensionRendererMode); } + public static synchronized String getUserAgent(Context context) { + if (userAgent == null) { + userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); + } + return userAgent; + } + public static synchronized HttpDataSource.Factory getHttpDataSourceFactory(Context context) { if (httpDataSourceFactory == null) { context = context.getApplicationContext(); CronetEngineWrapper cronetEngineWrapper = new CronetEngineWrapper(context); - String userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); httpDataSourceFactory = new CronetDataSourceFactory( cronetEngineWrapper, Executors.newSingleThreadExecutor(), /* transferListener= */ null, - userAgent); + getUserAgent(context)); } return httpDataSourceFactory; } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 370db4ac70..c9af9f77bb 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -47,6 +47,7 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryExcep import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.source.BehindLiveWindowException; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; +import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; @@ -285,16 +286,18 @@ public class PlayerActivity extends AppCompatActivity intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false); RenderersFactory renderersFactory = DemoUtil.buildRenderersFactory(/* context= */ this, preferExtensionDecoders); + MediaSourceFactory mediaSourceFactory = + new DefaultMediaSourceFactory(dataSourceFactory) + .setDrmUserAgent(DemoUtil.getUserAgent(this)) + .setAdsLoaderProvider(this::getAdsLoader) + .setAdViewProvider(playerView); trackSelector = new DefaultTrackSelector(/* context= */ this); trackSelector.setParameters(trackSelectorParameters); lastSeenTrackGroupArray = null; - player = new SimpleExoPlayer.Builder(/* context= */ this, renderersFactory) - .setMediaSourceFactory( - DefaultMediaSourceFactory.newInstance( - /* context= */ this, dataSourceFactory, new AdSupportProvider())) + .setMediaSourceFactory(mediaSourceFactory) .setTrackSelector(trackSelector) .build(); player.addListener(new PlayerEventListener()); @@ -361,6 +364,24 @@ public class PlayerActivity extends AppCompatActivity return mediaItems; } + private AdsLoader getAdsLoader(Uri adTagUri) { + if (mediaItems.size() > 1) { + showToast(R.string.unsupported_ads_in_playlist); + releaseAdsLoader(); + return null; + } + if (!adTagUri.equals(loadedAdTagUri)) { + releaseAdsLoader(); + loadedAdTagUri = adTagUri; + } + // The ads loader is reused for multiple playbacks, so that ad playback can resume. + if (adsLoader == null) { + adsLoader = new ImaAdsLoader(/* context= */ PlayerActivity.this, adTagUri); + } + adsLoader.setPlayer(player); + return adsLoader; + } + protected void releasePlayer() { if (player != null) { updateTrackSelectorParameters(); @@ -517,33 +538,6 @@ public class PlayerActivity extends AppCompatActivity } } - private class AdSupportProvider implements DefaultMediaSourceFactory.AdSupportProvider { - - @Override - public AdsLoader getAdsLoader(Uri adTagUri) { - if (mediaItems.size() > 1) { - showToast(R.string.unsupported_ads_in_playlist); - releaseAdsLoader(); - return null; - } - if (!adTagUri.equals(loadedAdTagUri)) { - releaseAdsLoader(); - loadedAdTagUri = adTagUri; - } - // The ads loader is reused for multiple playbacks, so that ad playback can resume. - if (adsLoader == null) { - adsLoader = new ImaAdsLoader(/* context= */ PlayerActivity.this, adTagUri); - } - adsLoader.setPlayer(player); - return adsLoader; - } - - @Override - public AdsLoader.AdViewProvider getAdViewProvider() { - return checkNotNull(playerView); - } - } - private static List createMediaItems(Intent intent, DownloadTracker downloadTracker) { List mediaItems = new ArrayList<>(); for (MediaItem item : IntentUtil.createMediaItemsFromIntent(intent)) { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 267b97f8ec..ea5b38ce8e 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -53,7 +53,6 @@ import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSourceInputStream; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; @@ -276,9 +275,7 @@ public class SampleChooserActivity extends AppCompatActivity protected List doInBackground(String... uris) { List result = new ArrayList<>(); Context context = getApplicationContext(); - String userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); - DataSource dataSource = - new DefaultDataSource(context, userAgent, /* allowCrossProtocolRedirects= */ false); + DataSource dataSource = DemoUtil.getDataSourceFactory(context).createDataSource(); for (String uri : uris) { DataSpec dataSpec = new DataSpec(Uri.parse(uri)); InputStream inputStream = new DataSourceInputStream(dataSource, dataSpec); diff --git a/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java b/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java index 31cd29de94..cd58e1f58b 100644 --- a/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java +++ b/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java @@ -243,8 +243,7 @@ public final class ImaPlaybackTest { new DefaultDataSourceFactory( context, Util.getUserAgent(context, ImaPlaybackTest.class.getSimpleName())); MediaSource contentMediaSource = - DefaultMediaSourceFactory.newInstance(context) - .createMediaSource(MediaItem.fromUri(contentUri)); + new DefaultMediaSourceFactory(context).createMediaSource(MediaItem.fromUri(contentUri)); return new AdsMediaSource( contentMediaSource, dataSourceFactory, diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java index 345985f862..f5518e0c7c 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java @@ -80,7 +80,7 @@ import org.junit.rules.ExternalResource; exoPlayer = new SimpleExoPlayer.Builder(context) .setLooper(Looper.myLooper()) - .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory, null)) + .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); sessionPlayerConnector = new SessionPlayerConnector(exoPlayer); }); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 5211b3eace..b5489186bc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -182,7 +182,7 @@ public interface ExoPlayer extends Player { this( renderers, new DefaultTrackSelector(context), - DefaultMediaSourceFactory.newInstance(context), + new DefaultMediaSourceFactory(context), new DefaultLoadControl(), DefaultBandwidthMeter.getSingletonInstance(context)); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java index dcdce89489..dfe96ffa32 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java @@ -194,7 +194,7 @@ public final class ExoPlayerFactory { context, renderersFactory, trackSelector, - DefaultMediaSourceFactory.newInstance(context), + new DefaultMediaSourceFactory(context), loadControl, bandwidthMeter, analyticsCollector, @@ -250,7 +250,7 @@ public final class ExoPlayerFactory { return new ExoPlayerImpl( renderers, trackSelector, - DefaultMediaSourceFactory.newInstance(context), + new DefaultMediaSourceFactory(context), loadControl, bandwidthMeter, /* analyticsCollector= */ null, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java b/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java index c233845e0c..72f6957865 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MetadataRetriever.java @@ -43,8 +43,8 @@ public final class MetadataRetriever { /** * Retrieves the {@link TrackGroupArray} corresponding to a {@link MediaItem}. * - *

This is equivalent to using {@code - * retrieveMetadata(DefaultMediaSourceFactory.newInstance(context), mediaItem)}. + *

This is equivalent to using {@code retrieveMetadata(new DefaultMediaSourceFactory(context), + * mediaItem)}. * * @param context The {@link Context}. * @param mediaItem The {@link MediaItem} whose metadata should be retrieved. @@ -52,7 +52,7 @@ public final class MetadataRetriever { */ public static ListenableFuture retrieveMetadata( Context context, MediaItem mediaItem) { - return retrieveMetadata(DefaultMediaSourceFactory.newInstance(context), mediaItem); + return retrieveMetadata(new DefaultMediaSourceFactory(context), mediaItem); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index a43973b31c..787946d6a9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -163,7 +163,7 @@ public class SimpleExoPlayer extends BasePlayer context, renderersFactory, new DefaultTrackSelector(context), - DefaultMediaSourceFactory.newInstance(context), + new DefaultMediaSourceFactory(context), new DefaultLoadControl(), DefaultBandwidthMeter.getSingletonInstance(context), new AnalyticsCollector(Clock.DEFAULT)); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index df2d10ae53..dd868f9822 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -889,7 +889,7 @@ public final class DownloadHelper { MediaItem mediaItem, DataSource.Factory dataSourceFactory, @Nullable DrmSessionManager drmSessionManager) { - return new DefaultMediaSourceFactory(dataSourceFactory, /* adSupportProvider= */ null) + return new DefaultMediaSourceFactory(dataSourceFactory) .setDrmSessionManager(drmSessionManager) .createMediaSource(mediaItem); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 566f7fb1c7..89b4ffb6a5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.ads.AdsLoader; +import com.google.android.exoplayer2.source.ads.AdsLoader.AdViewProvider; import com.google.android.exoplayer2.source.ads.AdsMediaSource; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; @@ -68,101 +69,62 @@ import java.util.List; * the stream. * * - *

Ad support for media items with ad tag uri

+ *

Ad support for media items with ad tag URIs

* - *

For a media item with an ad tag uri, an {@link AdSupportProvider} needs to be passed to {@link - * #newInstance(Context, DataSource.Factory, AdSupportProvider)}. + *

To support media items with {@link MediaItem.PlaybackProperties#adTagUri ad tag URIs}, {@link + * #setAdsLoaderProvider} and {@link #setAdViewProvider} need to be called to configure the factory + * with the required providers. */ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** - * Provides {@link AdsLoader ads loaders} and an {@link AdsLoader.AdViewProvider} to created - * {@link AdsMediaSource AdsMediaSources}. + * Provides {@link AdsLoader} instances for media items that have {@link + * MediaItem.PlaybackProperties#adTagUri ad tag URIs}. */ - public interface AdSupportProvider { + public interface AdsLoaderProvider { /** - * Returns an {@link AdsLoader} for the given {@link Uri ad tag uri} or null if no ads loader is - * available for the given ad tag uri. + * Returns an {@link AdsLoader} for the given {@link MediaItem.PlaybackProperties#adTagUri ad + * tag URI}, or null if no ads loader is available for the given ad tag URI. * - *

This method is called for each media item for which a media source is created. + *

This method is called each time a {@link MediaSource} is created from a {@link MediaItem} + * that defines an {@link MediaItem.PlaybackProperties#adTagUri ad tag URI}. */ @Nullable AdsLoader getAdsLoader(Uri adTagUri); - - /** - * Returns an {@link AdsLoader.AdViewProvider} which is used to create {@link AdsMediaSource - * AdsMediaSources}. - */ - AdsLoader.AdViewProvider getAdViewProvider(); - } - - /** - * Creates a new instance with the given {@link Context}. - * - *

This is functionally equivalent with calling {@code #newInstance(Context, - * DefaultDataSourceFactory)}. - * - * @param context The {@link Context}. - * @return A new instance of {@link DefaultMediaSourceFactory}. - */ - public static DefaultMediaSourceFactory newInstance(Context context) { - return newInstance( - context, - new DefaultDataSourceFactory( - context, Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY))); - } - - /** - * Creates a new instance with the given {@link Context} and {@link DataSource.Factory}. - * - * @param context The {@link Context}. - * @param dataSourceFactory A {@link DataSource.Factory} to be used to create media sources. - * @return A new instance of {@link DefaultMediaSourceFactory}. - */ - public static DefaultMediaSourceFactory newInstance( - Context context, DataSource.Factory dataSourceFactory) { - return new DefaultMediaSourceFactory(dataSourceFactory, /* adSupportProvider= */ null) - .setDrmUserAgent(Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY)); - } - - /** - * Creates a new instance with the given {@link Context} and {@link DataSource.Factory}. - * - * @param context The {@link Context}. - * @param dataSourceFactory A {@link DataSource.Factory} to be used to create media sources. - * @param adSupportProvider A {@link AdSupportProvider} to be used to create ad media sources. - * @return A new instance of {@link DefaultMediaSourceFactory}. - */ - public static DefaultMediaSourceFactory newInstance( - Context context, DataSource.Factory dataSourceFactory, AdSupportProvider adSupportProvider) { - return new DefaultMediaSourceFactory(dataSourceFactory, adSupportProvider) - .setDrmUserAgent(Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY)); } private static final String TAG = "DefaultMediaSourceFactory"; private final MediaSourceDrmHelper mediaSourceDrmHelper; private final DataSource.Factory dataSourceFactory; - @Nullable private final AdSupportProvider adSupportProvider; private final SparseArray mediaSourceFactories; @C.ContentType private final int[] supportedTypes; + @Nullable private AdsLoaderProvider adsLoaderProvider; + @Nullable private AdViewProvider adViewProvider; @Nullable private DrmSessionManager drmSessionManager; @Nullable private List streamKeys; /** - * Creates a new instance with the {@link DataSource.Factory} for downloading media and an {@link - * AdSupportProvider} to create {@link AdsMediaSource AdsMediaSources}. + * Creates a new instance. * - * @param dataSourceFactory A {@link DataSource.Factory} to be used to create media sources. - * @param adSupportProvider An {@link AdSupportProvider} to get ads loaders and ad view providers - * to be used to create {@link AdsMediaSource AdsMediaSources}. + * @param context Any context. */ - public DefaultMediaSourceFactory( - DataSource.Factory dataSourceFactory, @Nullable AdSupportProvider adSupportProvider) { + public DefaultMediaSourceFactory(Context context) { + this( + new DefaultDataSourceFactory( + context, Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY))); + } + + /** + * Creates a new instance. + * + * @param dataSourceFactory A {@link DataSource.Factory} to create {@link DataSource} instances + * for requesting media data. + */ + public DefaultMediaSourceFactory(DataSource.Factory dataSourceFactory) { this.dataSourceFactory = dataSourceFactory; - this.adSupportProvider = adSupportProvider; mediaSourceDrmHelper = new MediaSourceDrmHelper(); mediaSourceFactories = loadDelegates(dataSourceFactory); supportedTypes = new int[mediaSourceFactories.size()]; @@ -171,6 +133,30 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { } } + /** + * Sets the {@link AdsLoaderProvider} that provides {@link AdsLoader} instances for media items + * that have {@link MediaItem.PlaybackProperties#adTagUri ad tag URIs}. + * + * @param adsLoaderProvider A provider for {@link AdsLoader} instances. + * @return This factory, for convenience. + */ + public DefaultMediaSourceFactory setAdsLoaderProvider( + @Nullable AdsLoaderProvider adsLoaderProvider) { + this.adsLoaderProvider = adsLoaderProvider; + return this; + } + + /** + * Sets the {@link AdViewProvider} that provides information about views for the ad playback UI. + * + * @param adViewProvider A provider for {@link AdsLoader} instances. + * @return This factory, for convenience. + */ + public DefaultMediaSourceFactory setAdViewProvider(@Nullable AdViewProvider adViewProvider) { + this.adViewProvider = adViewProvider; + return this; + } + @Override public DefaultMediaSourceFactory setDrmHttpDataSourceFactory( @Nullable HttpDataSource.Factory drmHttpDataSourceFactory) { @@ -279,24 +265,23 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { if (mediaItem.playbackProperties.adTagUri == null) { return mediaSource; } - if (adSupportProvider == null) { + AdsLoaderProvider adsLoaderProvider = this.adsLoaderProvider; + AdViewProvider adViewProvider = this.adViewProvider; + if (adsLoaderProvider == null || adViewProvider == null) { Log.w( TAG, - "Playing media without ads. Pass an AdsSupportProvider to the constructor for supporting" - + " media items with an ad tag uri."); + "Playing media without ads. Configure ad support by calling setAdsLoaderProvider and" + + " setAdViewProvider."); return mediaSource; } @Nullable - AdsLoader adsLoader = adSupportProvider.getAdsLoader(mediaItem.playbackProperties.adTagUri); + AdsLoader adsLoader = adsLoaderProvider.getAdsLoader(mediaItem.playbackProperties.adTagUri); if (adsLoader == null) { Log.w(TAG, "Playing media without ads. No AdsLoader for provided adTagUri"); return mediaSource; } return new AdsMediaSource( - mediaSource, - /* adMediaSourceFactory= */ this, - adsLoader, - adSupportProvider.getAdViewProvider()); + mediaSource, /* adMediaSourceFactory= */ this, adsLoader, adViewProvider); } private static SparseArray loadDelegates( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java index 8dfe73f4ad..d02f04d097 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java @@ -20,14 +20,12 @@ import static org.mockito.Mockito.mock; import android.content.Context; import android.net.Uri; -import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.ads.AdsMediaSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.MimeTypes; import java.util.Arrays; import java.util.Collections; @@ -45,7 +43,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_fromMediaItem_returnsSameMediaItemInstance() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -56,7 +54,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withoutMimeType_progressiveSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -69,7 +67,7 @@ public final class DefaultMediaSourceFactoryTest { public void createMediaSource_withTag_tagInSource_deprecated() { Object tag = new Object(); DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setTag(tag).build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -80,7 +78,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withPath_progressiveSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mp3").build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -91,7 +89,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withNull_usesNonNullDefaults() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build(); MediaSource mediaSource = @@ -107,7 +105,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withSubtitle_isMergingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); List subtitles = Arrays.asList( new MediaItem.Subtitle(Uri.parse(URI_TEXT), MimeTypes.APPLICATION_TTML, "en"), @@ -124,7 +122,7 @@ public final class DefaultMediaSourceFactoryTest { @SuppressWarnings("deprecation") // Testing deprecated MediaSource.getTag() still works. public void createMediaSource_withSubtitle_hasTag_deprecated() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); Object tag = new Object(); MediaItem mediaItem = new MediaItem.Builder() @@ -143,7 +141,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withStartPosition_isClippingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setClipStartPositionMs(1000L).build(); @@ -155,7 +153,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withEndPosition_isClippingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setClipEndPositionMs(1000L).build(); @@ -167,7 +165,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_relativeToDefaultPosition_isClippingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setClipRelativeToDefaultPosition(true).build(); @@ -179,7 +177,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_defaultToEnd_isNotClippingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_MEDIA) @@ -194,7 +192,7 @@ public final class DefaultMediaSourceFactoryTest { @Test public void getSupportedTypes_coreModule_onlyOther() { int[] supportedTypes = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()) + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) .getSupportedTypes(); assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER); @@ -202,14 +200,12 @@ public final class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withAdTagUri_callsAdsLoader() { - Context applicationContext = ApplicationProvider.getApplicationContext(); Uri adTagUri = Uri.parse(URI_MEDIA); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(adTagUri).build(); DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance( - applicationContext, - new DefaultDataSourceFactory(applicationContext, /* userAgent= */ "ua"), - createAdSupportProvider(mock(AdsLoader.class), mock(AdsLoader.AdViewProvider.class))); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) + .setAdsLoaderProvider(ignoredAdTagUri -> mock(AdsLoader.class)) + .setAdViewProvider(mock(AdsLoader.AdViewProvider.class)); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -217,15 +213,11 @@ public final class DefaultMediaSourceFactoryTest { } @Test - public void createMediaSource_withAdTagUriAdsLoaderNull_playsWithoutAdNoException() { - Context applicationContext = ApplicationProvider.getApplicationContext(); + public void createMediaSource_withAdTagUri_adProvidersNotSet_playsWithoutAdNoException() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build(); DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance( - applicationContext, - new DefaultDataSourceFactory(applicationContext, /* userAgent= */ "ua"), - createAdSupportProvider(/* adsLoader= */ null, mock(AdsLoader.AdViewProvider.class))); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -239,24 +231,8 @@ public final class DefaultMediaSourceFactoryTest { new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build(); MediaSource mediaSource = - DefaultMediaSourceFactory.newInstance(applicationContext).createMediaSource(mediaItem); + new DefaultMediaSourceFactory(applicationContext).createMediaSource(mediaItem); assertThat(mediaSource).isNotInstanceOf(AdsMediaSource.class); } - - private static DefaultMediaSourceFactory.AdSupportProvider createAdSupportProvider( - @Nullable AdsLoader adsLoader, AdsLoader.AdViewProvider adViewProvider) { - return new DefaultMediaSourceFactory.AdSupportProvider() { - @Nullable - @Override - public AdsLoader getAdsLoader(Uri adTagUri) { - return adsLoader; - } - - @Override - public AdsLoader.AdViewProvider getAdViewProvider() { - return adViewProvider; - } - }; - } } diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java index 4ed34b0164..ab7f456c55 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.dash; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; @@ -36,7 +37,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withMimeType_dashSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_MPD).build(); @@ -49,7 +50,7 @@ public class DefaultMediaSourceFactoryTest { public void createMediaSource_withTag_tagInSource() { Object tag = new Object(); DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_MEDIA) @@ -65,7 +66,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withPath_dashSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -76,7 +77,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withNull_usesNonNullDefaults() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build(); MediaSource mediaSource = @@ -92,7 +93,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void getSupportedTypes_dashModule_containsTypeDash() { int[] supportedTypes = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()) + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) .getSupportedTypes(); assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_DASH); diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java index d46da26ff2..54383ffe33 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.hls; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; @@ -36,7 +37,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withMimeType_hlsSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_M3U8).build(); @@ -49,7 +50,7 @@ public class DefaultMediaSourceFactoryTest { public void createMediaSource_withTag_tagInSource() { Object tag = new Object(); DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_MEDIA) @@ -65,7 +66,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withPath_hlsSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -76,7 +77,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withNull_usesNonNullDefaults() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build(); MediaSource mediaSource = @@ -92,7 +93,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void getSupportedTypes_hlsModule_containsTypeHls() { int[] supportedTypes = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()) + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) .getSupportedTypes(); assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_HLS); diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java index 016acdbf3d..43c62071d3 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.smoothstreaming; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; @@ -38,7 +39,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withMimeType_smoothstreamingSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_SS).build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -49,7 +50,7 @@ public class DefaultMediaSourceFactoryTest { public void createMediaSource_withTag_tagInSource() { Object tag = new Object(); DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_MEDIA) @@ -65,7 +66,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withIsmPath_smoothstreamingSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -76,7 +77,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withManifestPath_smoothstreamingSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + ".ism/Manifest").build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); @@ -87,7 +88,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void createMediaSource_withNull_usesNonNullDefaults() { DefaultMediaSourceFactory defaultMediaSourceFactory = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build(); MediaSource mediaSource = @@ -103,7 +104,7 @@ public class DefaultMediaSourceFactoryTest { @Test public void getSupportedTypes_smoothstreamingModule_containsTypeSS() { int[] supportedTypes = - DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()) + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) .getSupportedTypes(); assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_SS);