From 938728ce0080b400cd7bdb380c8b3561a498a8b0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 12 May 2022 16:10:51 +0100 Subject: [PATCH] Add DefaultMediaSourceFactory.{set,clear}LocalAdInsertionConfig Deprecate the setAdsLoaderProvider and setAdViewProvider methods these replace. PiperOrigin-RevId: 448251423 --- .../exoplayer2/demo/PlayerActivity.java | 4 +- docs/ad-insertion.md | 4 +- docs/media-sources.md | 4 +- .../source/DefaultMediaSourceFactory.java | 47 ++++++++++++++++++- .../source/DefaultMediaSourceFactoryTest.java | 21 ++++++++- 5 files changed, 72 insertions(+), 8 deletions(-) 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 00214e6fd0..0027a4e96a 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 @@ -311,8 +311,8 @@ public class PlayerActivity extends AppCompatActivity serverSideAdsLoader, new DefaultMediaSourceFactory(dataSourceFactory)); return new DefaultMediaSourceFactory(dataSourceFactory) .setDrmSessionManagerProvider(drmSessionManagerProvider) - .setAdsLoaderProvider(this::getClientSideAdsLoader) - .setAdViewProvider(playerView) + .setLocalAdInsertionComponents( + this::getClientSideAdsLoader, /* adViewProvider= */ playerView) .setServerSideAdInsertionMediaSourceFactory(imaServerSideAdInsertionMediaSourceFactory); } diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 10e169f986..9422bceac1 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -51,8 +51,8 @@ build and inject a `DefaultMediaSourceFactory` configured with an ~~~ MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) - .setAdsLoaderProvider(adsLoaderProvider) - .setAdViewProvider(playerView); + .setLocalAdInsertionComponents( + adsLoaderProvider, /* adViewProvider= */ playerView); ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build(); diff --git a/docs/media-sources.md b/docs/media-sources.md index 1855abd6cb..5d927b54e2 100644 --- a/docs/media-sources.md +++ b/docs/media-sources.md @@ -35,8 +35,8 @@ these requirements and injected during player construction: ~~~ MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(cacheDataSourceFactory) - .setAdsLoaderProvider(adsLoaderProvider) - .setAdViewProvider(playerView); + .setLocalAdInsertionComponents( + adsLoaderProvider, /* adViewProvider= */ playerView); ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build(); 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 c18f771b14..4aca4aa02c 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 @@ -188,9 +188,15 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { * Sets the {@link AdsLoader.Provider} that provides {@link AdsLoader} instances for media items * that have {@link MediaItem.LocalConfiguration#adsConfiguration ads configurations}. * + *

This will override or clear the {@link AdsLoader.Provider} set by {@link + * #setLocalAdInsertionComponents(AdsLoader.Provider, AdViewProvider)}. + * * @param adsLoaderProvider A provider for {@link AdsLoader} instances. * @return This factory, for convenience. + * @deprecated Use {@link #setLocalAdInsertionComponents(AdsLoader.Provider, AdViewProvider)} + * instead. */ + @Deprecated public DefaultMediaSourceFactory setAdsLoaderProvider( @Nullable AdsLoader.Provider adsLoaderProvider) { this.adsLoaderProvider = adsLoaderProvider; @@ -200,14 +206,53 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** * Sets the {@link AdViewProvider} that provides information about views for the ad playback UI. * - * @param adViewProvider A provider for {@link AdsLoader} instances. + *

This will override or clear the {@link AdViewProvider} set by {@link + * #setLocalAdInsertionComponents(AdsLoader.Provider, AdViewProvider)}. + * + * @param adViewProvider A provider for information about views for the ad playback UI. * @return This factory, for convenience. + * @deprecated Use {@link #setLocalAdInsertionComponents(AdsLoader.Provider, AdViewProvider)} + * instead. */ + @Deprecated public DefaultMediaSourceFactory setAdViewProvider(@Nullable AdViewProvider adViewProvider) { this.adViewProvider = adViewProvider; return this; } + /** + * Sets the components required for local ad insertion for media items that have {@link + * MediaItem.LocalConfiguration#adsConfiguration ads configurations} + * + *

This will override the values set by {@link #setAdsLoaderProvider(AdsLoader.Provider)} and + * {@link #setAdViewProvider(AdViewProvider)}. + * + * @param adsLoaderProvider A provider for {@link AdsLoader} instances. + * @param adViewProvider A provider for information about views for the ad playback UI. + * @return This factory, for convenience. + */ + public DefaultMediaSourceFactory setLocalAdInsertionComponents( + AdsLoader.Provider adsLoaderProvider, AdViewProvider adViewProvider) { + this.adsLoaderProvider = checkNotNull(adsLoaderProvider); + this.adViewProvider = checkNotNull(adViewProvider); + return this; + } + + /** + * Clear any values set via {@link #setLocalAdInsertionComponents(AdsLoader.Provider, + * AdViewProvider)}. + * + *

This will also clear any values set by {@link #setAdsLoaderProvider(AdsLoader.Provider)} and + * {@link #setAdViewProvider(AdViewProvider)}. + * + * @return This factory, for convenience. + */ + public DefaultMediaSourceFactory clearLocalAdInsertionComponents() { + this.adsLoaderProvider = null; + this.adViewProvider = null; + return this; + } + /** * Sets the {@link MediaSource.Factory} used to handle {@link MediaItem} instances containing a * {@link Uri} identified as resolving to content with server side ad insertion (SSAI). 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 17691d809a..73ad8b2a10 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 @@ -191,8 +191,9 @@ public final class DefaultMediaSourceFactoryTest { assertThat(supportedTypes).asList().containsExactly(C.CONTENT_TYPE_OTHER); } + @SuppressWarnings("deprecation") // Testing deprecated setters. @Test - public void createMediaSource_withAdsConfiguration_callsAdsLoader() { + public void createMediaSource_withDeprecatedAdsConfiguration_callsAdsLoader() { Uri adTagUri = Uri.parse(URI_MEDIA); MediaItem mediaItem = new MediaItem.Builder() @@ -209,6 +210,24 @@ public final class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(AdsMediaSource.class); } + @Test + public void createMediaSource_withAdsConfiguration_callsAdsLoader() { + Uri adTagUri = Uri.parse(URI_MEDIA); + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_MEDIA) + .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) + .build(); + DefaultMediaSourceFactory defaultMediaSourceFactory = + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) + .setLocalAdInsertionComponents( + ignoredAdsConfiguration -> mock(AdsLoader.class), mock(AdViewProvider.class)); + + MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); + + assertThat(mediaSource).isInstanceOf(AdsMediaSource.class); + } + @Test public void createMediaSource_withAdsConfiguration_adProvidersNotSet_playsWithoutAdNoException() { MediaItem mediaItem =