From 274f3a13a25f84c9c25a4ecc3ca904355a8bf1ef Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 23 May 2022 13:01:22 +0100 Subject: [PATCH] Rollback of 57182ac7bd32db54d11fd41e21338a2bbfaf043c *** Original commit *** Remove `@Nullable` from `MediaSource.Factory` setters The null-behaviour of these methods creates a minimization footgun, because **any** call to these setters will prevent R8 from removing the default implementation (even if it's never used by the app) - this is because R8 can't tell the default implementation is only used if the parameter is `null`. ****** PiperOrigin-RevId: 450410833 --- .../ImaServerSideAdInsertionMediaSource.java | 4 +- .../exoplayer2/offline/DownloadHelper.java | 10 ++- .../source/DefaultMediaSourceFactory.java | 45 ++++-------- .../exoplayer2/source/MediaSource.java | 11 ++- .../source/ProgressiveMediaSource.java | 70 ++++++------------- .../source/DefaultMediaSourceFactoryTest.java | 15 ++++ .../source/dash/DashMediaSource.java | 46 +++++------- .../dash/DefaultMediaSourceFactoryTest.java | 15 ++++ .../exoplayer2/source/hls/HlsMediaSource.java | 51 +++++--------- .../hls/DefaultMediaSourceFactoryTest.java | 15 ++++ .../source/rtsp/RtspMediaSource.java | 6 +- .../source/smoothstreaming/SsMediaSource.java | 47 +++++-------- .../DefaultMediaSourceFactoryTest.java | 15 ++++ .../testutil/FakeMediaSourceFactory.java | 5 +- 14 files changed, 168 insertions(+), 187 deletions(-) diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java index c06b39da59..bfcad342f6 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java @@ -134,14 +134,14 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou @Override public MediaSource.Factory setLoadErrorHandlingPolicy( - LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); return this; } @Override public MediaSource.Factory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { contentMediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); return this; } 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 1f877dd602..f9fa73895c 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 @@ -949,12 +949,10 @@ public final class DownloadHelper { MediaItem mediaItem, DataSource.Factory dataSourceFactory, @Nullable DrmSessionManager drmSessionManager) { - DefaultMediaSourceFactory mediaSourceFactory = - new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY); - if (drmSessionManager != null) { - mediaSourceFactory.setDrmSessionManagerProvider(unusedMediaItem -> drmSessionManager); - } - return mediaSourceFactory.createMediaSource(mediaItem); + return new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY) + .setDrmSessionManagerProvider( + drmSessionManager != null ? unusedMediaItem -> drmSessionManager : null) + .createMediaSource(mediaItem); } private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) { 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 1b9b371b06..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 @@ -331,25 +331,15 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { @Override public DefaultMediaSourceFactory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { - delegateFactoryLoader.setDrmSessionManagerProvider( - checkNotNull( - drmSessionManagerProvider, - "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" - + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct and" - + " pass an instance in order to retain the old behavior.")); + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + delegateFactoryLoader.setDrmSessionManagerProvider(drmSessionManagerProvider); return this; } @Override public DefaultMediaSourceFactory setLoadErrorHandlingPolicy( - LoadErrorHandlingPolicy loadErrorHandlingPolicy) { - this.loadErrorHandlingPolicy = - checkNotNull( - loadErrorHandlingPolicy, - "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" - + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" - + " pass an instance in order to retain the old behavior."); + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; delegateFactoryLoader.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); return this; } @@ -424,23 +414,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { SubtitleDecoderFactory.DEFAULT.createDecoder(format), format) : new UnknownSubtitlesExtractor(format) }; - ProgressiveMediaSource.Factory progressiveMediaSourceFactory = - new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory); - if (loadErrorHandlingPolicy != null) { - progressiveMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); - } mediaSources[i + 1] = - progressiveMediaSourceFactory.createMediaSource( - MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); + new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory) + .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) + .createMediaSource( + MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); } else { - SingleSampleMediaSource.Factory singleSampleMediaSourceFactory = - new SingleSampleMediaSource.Factory(dataSourceFactory); - if (loadErrorHandlingPolicy != null) { - singleSampleMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); - } mediaSources[i + 1] = - singleSampleMediaSourceFactory.createMediaSource( - subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); + new SingleSampleMediaSource.Factory(dataSourceFactory) + .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) + .createMediaSource(subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); } } @@ -549,14 +532,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { return mediaSourceFactory; } - public void setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) { + public void setDrmSessionManagerProvider( + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = drmSessionManagerProvider; for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) { mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); } } - public void setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + public void setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) { mediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java index 2cc97c3836..1b37454953 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java @@ -22,10 +22,12 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.analytics.PlayerId; +import com.google.android.exoplayer2.drm.DefaultDrmSessionManagerProvider; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; @@ -65,16 +67,21 @@ public interface MediaSource { * Sets the {@link DrmSessionManagerProvider} used to obtain a {@link DrmSessionManager} for a * {@link MediaItem}. * + *

If not set, {@link DefaultDrmSessionManagerProvider} is used. + * * @return This factory, for convenience. */ - Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider); + Factory setDrmSessionManagerProvider( + @Nullable DrmSessionManagerProvider drmSessionManagerProvider); /** * Sets an optional {@link LoadErrorHandlingPolicy}. * + * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}, or {@code null} to use the + * {@link DefaultLoadErrorHandlingPolicy}. * @return This factory, for convenience. */ - Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy); + Factory setLoadErrorHandlingPolicy(@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy); /** * Returns the {@link C.ContentType content types} supported by media sources created by this diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java index 6eca2cba48..e569c69e9d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java @@ -63,18 +63,10 @@ public final class ProgressiveMediaSource extends BaseMediaSource @Nullable private Object tag; /** - * Creates a new factory for {@link ProgressiveMediaSource}s. + * Creates a new factory for {@link ProgressiveMediaSource}s, using the extractors provided by + * {@link DefaultExtractorsFactory}. * - *

The factory will use the following default components: - * - *

- * - * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the - * media. + * @param dataSourceFactory A factory for {@link DataSource}s to read the media. */ public Factory(DataSource.Factory dataSourceFactory) { this(dataSourceFactory, new DefaultExtractorsFactory()); @@ -83,18 +75,6 @@ public final class ProgressiveMediaSource extends BaseMediaSource /** * Equivalent to {@link #Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory) new * Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}. - * - *

The factory will use the following default components: - * - *

- * - * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the - * media. - * @param extractorsFactory A factory for the {@linkplain Extractor extractors} used to extract - * the media from its container. */ public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) { this(dataSourceFactory, playerId -> new BundledExtractorsAdapter(extractorsFactory)); @@ -103,17 +83,9 @@ public final class ProgressiveMediaSource extends BaseMediaSource /** * Creates a new factory for {@link ProgressiveMediaSource}s. * - *

The factory will use the following default components: - * - *

- * - * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the - * media. + * @param dataSourceFactory A factory for {@link DataSource}s to read the media. * @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor} - * to extract the media from its container. + * to extract media from its container. */ public Factory( DataSource.Factory dataSourceFactory, @@ -129,8 +101,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource /** * Creates a new factory for {@link ProgressiveMediaSource}s. * - * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the - * media. + * @param dataSourceFactory A factory for {@link DataSource}s to read the media. * @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor} * to extract media from its container. * @param drmSessionManagerProvider A provider to obtain a {@link DrmSessionManager} for a @@ -153,14 +124,19 @@ public final class ProgressiveMediaSource extends BaseMediaSource this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes; } - @Override - public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + /** + * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link + * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. + * + * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. + * @return This factory, for convenience. + */ + public Factory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - checkNotNull( - loadErrorHandlingPolicy, - "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" - + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" - + " pass an instance in order to retain the old behavior."); + loadErrorHandlingPolicy != null + ? loadErrorHandlingPolicy + : new DefaultLoadErrorHandlingPolicy(); return this; } @@ -181,13 +157,11 @@ public final class ProgressiveMediaSource extends BaseMediaSource @Override public Factory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - checkNotNull( - drmSessionManagerProvider, - "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" - + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" - + " and pass an instance in order to retain the old behavior."); + drmSessionManagerProvider != null + ? drmSessionManagerProvider + : new DefaultDrmSessionManagerProvider(); return this; } 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 4e48978d5e..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 @@ -73,6 +73,21 @@ public final class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(ProgressiveMediaSource.class); } + @Test + public void createMediaSource_withNull_usesNonNullDefaults() { + DefaultMediaSourceFactory defaultMediaSourceFactory = + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); + MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build(); + + MediaSource mediaSource = + defaultMediaSourceFactory + .setDrmSessionManagerProvider(null) + .setLoadErrorHandlingPolicy(null) + .createMediaSource(mediaItem); + + assertThat(mediaSource).isNotNull(); + } + @Test public void createMediaSource_withSubtitle_isMergingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index ad88861b3d..4d67b53728 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -112,15 +112,6 @@ public final class DashMediaSource extends BaseMediaSource { /** * Creates a new factory for {@link DashMediaSource}s. * - *

The factory will use the following default components: - * - *

- * * @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load * manifest and media data. */ @@ -131,14 +122,6 @@ public final class DashMediaSource extends BaseMediaSource { /** * Creates a new factory for {@link DashMediaSource}s. * - *

The factory will use the following default components: - * - *

- * * @param chunkSourceFactory A factory for {@link DashChunkSource} instances. * @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used * to load (and refresh) the manifest. May be {@code null} if the factory will only ever be @@ -158,24 +141,27 @@ public final class DashMediaSource extends BaseMediaSource { @Override public Factory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - checkNotNull( - drmSessionManagerProvider, - "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" - + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" - + " and pass an instance in order to retain the old behavior."); + drmSessionManagerProvider != null + ? drmSessionManagerProvider + : new DefaultDrmSessionManagerProvider(); return this; } - @Override - public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + /** + * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link + * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. + * + * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. + * @return This factory, for convenience. + */ + public Factory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - checkNotNull( - loadErrorHandlingPolicy, - "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" - + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" - + " pass an instance in order to retain the old behavior."); + loadErrorHandlingPolicy != null + ? loadErrorHandlingPolicy + : new DefaultLoadErrorHandlingPolicy(); return this; } 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 7dfccefe77..9f86d628b3 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 @@ -74,6 +74,21 @@ public class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(DashMediaSource.class); } + @Test + public void createMediaSource_withNull_usesNonNullDefaults() { + DefaultMediaSourceFactory defaultMediaSourceFactory = + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); + MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build(); + + MediaSource mediaSource = + defaultMediaSourceFactory + .setDrmSessionManagerProvider(null) + .setLoadErrorHandlingPolicy(null) + .createMediaSource(mediaItem); + + assertThat(mediaSource).isNotNull(); + } + @Test public void getSupportedTypes_dashModule_containsTypeDash() { int[] supportedTypes = diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 6f01b3641d..e00caa3af7 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -112,17 +112,6 @@ public final class HlsMediaSource extends BaseMediaSource /** * Creates a new factory for {@link HlsMediaSource}s. * - *

The factory will use the following default components: - * - *

- * * @param dataSourceFactory A data source factory that will be wrapped by a {@link * DefaultHlsDataSourceFactory} to create {@link DataSource}s for manifests, segments and * keys. @@ -134,17 +123,6 @@ public final class HlsMediaSource extends BaseMediaSource /** * Creates a new factory for {@link HlsMediaSource}s. * - *

The factory will use the following default components: - * - *

- * * @param hlsDataSourceFactory An {@link HlsDataSourceFactory} for {@link DataSource}s for * manifests, segments and keys. */ @@ -175,14 +153,19 @@ public final class HlsMediaSource extends BaseMediaSource return this; } - @Override - public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + /** + * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link + * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. + * + * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. + * @return This factory, for convenience. + */ + public Factory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - checkNotNull( - loadErrorHandlingPolicy, - "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" - + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" - + " pass an instance in order to retain the old behavior."); + loadErrorHandlingPolicy != null + ? loadErrorHandlingPolicy + : new DefaultLoadErrorHandlingPolicy(); return this; } @@ -291,13 +274,11 @@ public final class HlsMediaSource extends BaseMediaSource @Override public Factory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - checkNotNull( - drmSessionManagerProvider, - "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" - + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" - + " and pass an instance in order to retain the old behavior."); + drmSessionManagerProvider != null + ? drmSessionManagerProvider + : new DefaultDrmSessionManagerProvider(); return this; } 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 84e99e8bb3..63f477cb1e 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 @@ -74,6 +74,21 @@ public class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(HlsMediaSource.class); } + @Test + public void createMediaSource_withNull_usesNonNullDefaults() { + DefaultMediaSourceFactory defaultMediaSourceFactory = + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); + MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build(); + + MediaSource mediaSource = + defaultMediaSourceFactory + .setDrmSessionManagerProvider(null) + .setLoadErrorHandlingPolicy(null) + .createMediaSource(mediaItem); + + assertThat(mediaSource).isNotNull(); + } + @Test public void getSupportedTypes_hlsModule_containsTypeHls() { int[] supportedTypes = diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java index ee38fc609c..bfcd6aefa5 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java @@ -146,13 +146,15 @@ public final class RtspMediaSource extends BaseMediaSource { /** Does nothing. {@link RtspMediaSource} does not support DRM. */ @Override - public Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManager) { + public Factory setDrmSessionManagerProvider( + @Nullable DrmSessionManagerProvider drmSessionManager) { return this; } /** Does nothing. {@link RtspMediaSource} does not support error handling policies. */ @Override - public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + public Factory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { // TODO(internal b/172331505): Implement support. return this; } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index 968f7e3e87..08fefdfbec 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -91,15 +91,6 @@ public final class SsMediaSource extends BaseMediaSource /** * Creates a new factory for {@link SsMediaSource}s. * - *

The factory will use the following default components: - * - *

- * * @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load * manifest and media data. */ @@ -108,14 +99,7 @@ public final class SsMediaSource extends BaseMediaSource } /** - * Creates a new factory for {@link SsMediaSource}s. The factory will use the following default - * components: - * - * + * Creates a new factory for {@link SsMediaSource}s. * * @param chunkSourceFactory A factory for {@link SsChunkSource} instances. * @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used @@ -134,14 +118,19 @@ public final class SsMediaSource extends BaseMediaSource compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory(); } - @Override - public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + /** + * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link + * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. + * + * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. + * @return This factory, for convenience. + */ + public Factory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - checkNotNull( - loadErrorHandlingPolicy, - "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" - + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" - + " pass an instance in order to retain the old behavior."); + loadErrorHandlingPolicy != null + ? loadErrorHandlingPolicy + : new DefaultLoadErrorHandlingPolicy(); return this; } @@ -193,13 +182,11 @@ public final class SsMediaSource extends BaseMediaSource @Override public Factory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - checkNotNull( - drmSessionManagerProvider, - "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" - + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" - + " and pass an instance in order to retain the old behavior."); + drmSessionManagerProvider != null + ? drmSessionManagerProvider + : new DefaultDrmSessionManagerProvider(); return this; } 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 3b91e91d19..28f220147e 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 @@ -85,6 +85,21 @@ public class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(SsMediaSource.class); } + @Test + public void createMediaSource_withNull_usesNonNullDefaults() { + DefaultMediaSourceFactory defaultMediaSourceFactory = + new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); + MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build(); + + MediaSource mediaSource = + defaultMediaSourceFactory + .setDrmSessionManagerProvider(null) + .setLoadErrorHandlingPolicy(null) + .createMediaSource(mediaItem); + + assertThat(mediaSource).isNotNull(); + } + @Test public void getSupportedTypes_smoothstreamingModule_containsTypeSS() { int[] supportedTypes = diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java index 047a4d7cab..05e0a2fd7b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.testutil; +import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; @@ -36,13 +37,13 @@ public final class FakeMediaSourceFactory implements MediaSourceFactory { @Override public MediaSourceFactory setDrmSessionManagerProvider( - DrmSessionManagerProvider drmSessionManagerProvider) { + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { throw new UnsupportedOperationException(); } @Override public MediaSourceFactory setLoadErrorHandlingPolicy( - LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { throw new UnsupportedOperationException(); }