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:
parent
442aa78196
commit
04f67e4adc
@ -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;
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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(
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user