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
This commit is contained in:
olly 2020-09-07 18:17:21 +01:00 committed by Oliver Woodman
parent 442aa78196
commit 04f67e4adc
15 changed files with 142 additions and 181 deletions

View File

@ -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;
}

View File

@ -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<MediaItem> createMediaItems(Intent intent, DownloadTracker downloadTracker) {
List<MediaItem> mediaItems = new ArrayList<>();
for (MediaItem item : IntentUtil.createMediaItemsFromIntent(intent)) {

View File

@ -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<PlaylistGroup> doInBackground(String... uris) {
List<PlaylistGroup> 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);

View File

@ -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,

View File

@ -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);
});

View File

@ -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));
}

View File

@ -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,

View File

@ -43,8 +43,8 @@ public final class MetadataRetriever {
/**
* Retrieves the {@link TrackGroupArray} corresponding to a {@link MediaItem}.
*
* <p>This is equivalent to using {@code
* retrieveMetadata(DefaultMediaSourceFactory.newInstance(context), mediaItem)}.
* <p>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<TrackGroupArray> retrieveMetadata(
Context context, MediaItem mediaItem) {
return retrieveMetadata(DefaultMediaSourceFactory.newInstance(context), mediaItem);
return retrieveMetadata(new DefaultMediaSourceFactory(context), mediaItem);
}
/**

View File

@ -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));

View File

@ -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);
}

View File

@ -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.
* </ul>
*
* <h3>Ad support for media items with ad tag uri</h3>
* <h3>Ad support for media items with ad tag URIs</h3>
*
* <p>For a media item with an ad tag uri, an {@link AdSupportProvider} needs to be passed to {@link
* #newInstance(Context, DataSource.Factory, AdSupportProvider)}.
* <p>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.
*
* <p>This method is called for each media item for which a media source is created.
* <p>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}.
*
* <p>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<MediaSourceFactory> mediaSourceFactories;
@C.ContentType private final int[] supportedTypes;
@Nullable private AdsLoaderProvider adsLoaderProvider;
@Nullable private AdViewProvider adViewProvider;
@Nullable private DrmSessionManager drmSessionManager;
@Nullable private List<StreamKey> 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<MediaSourceFactory> loadDelegates(

View File

@ -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<MediaItem.Subtitle> 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;
}
};
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);