diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 11d84fc1d4..e594883c72 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2; import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; import android.content.Context; @@ -59,6 +60,7 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; +import com.google.common.base.Supplier; import java.util.List; /** @@ -366,12 +368,12 @@ public interface ExoPlayer extends Player { /* package */ Clock clock; /* package */ long foregroundModeTimeoutMs; - /* package */ RenderersFactory renderersFactory; - /* package */ MediaSourceFactory mediaSourceFactory; - /* package */ TrackSelector trackSelector; - /* package */ LoadControl loadControl; - /* package */ BandwidthMeter bandwidthMeter; - /* package */ AnalyticsCollector analyticsCollector; + /* package */ Supplier renderersFactorySupplier; + /* package */ Supplier mediaSourceFactorySupplier; + /* package */ Supplier trackSelectorSupplier; + /* package */ Supplier loadControlSupplier; + /* package */ Supplier bandwidthMeterSupplier; + /* package */ Supplier analyticsCollectorSupplier; /* package */ Looper looper; @Nullable /* package */ PriorityTaskManager priorityTaskManager; /* package */ AudioAttributes audioAttributes; @@ -437,8 +439,8 @@ public interface ExoPlayer extends Player { public Builder(Context context) { this( context, - new DefaultRenderersFactory(context), - new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); + () -> new DefaultRenderersFactory(context), + () -> new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); } /** @@ -456,8 +458,8 @@ public interface ExoPlayer extends Player { public Builder(Context context, RenderersFactory renderersFactory) { this( context, - renderersFactory, - new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); + () -> renderersFactory, + () -> new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); } /** @@ -474,7 +476,7 @@ public interface ExoPlayer extends Player { * MediaItem}. */ public Builder(Context context, MediaSourceFactory mediaSourceFactory) { - this(context, new DefaultRenderersFactory(context), mediaSourceFactory); + this(context, () -> new DefaultRenderersFactory(context), () -> mediaSourceFactory); } /** @@ -494,14 +496,7 @@ public interface ExoPlayer extends Player { */ public Builder( Context context, RenderersFactory renderersFactory, MediaSourceFactory mediaSourceFactory) { - this( - context, - renderersFactory, - mediaSourceFactory, - new DefaultTrackSelector(context), - new DefaultLoadControl(), - DefaultBandwidthMeter.getSingletonInstance(context), - new AnalyticsCollector(Clock.DEFAULT)); + this(context, () -> renderersFactory, () -> mediaSourceFactory); } /** @@ -527,13 +522,48 @@ public interface ExoPlayer extends Player { LoadControl loadControl, BandwidthMeter bandwidthMeter, AnalyticsCollector analyticsCollector) { + this( + context, + () -> renderersFactory, + () -> mediaSourceFactory, + () -> trackSelector, + () -> loadControl, + () -> bandwidthMeter, + () -> analyticsCollector); + } + + private Builder( + Context context, + Supplier renderersFactorySupplier, + Supplier mediaSourceFactorySupplier) { + this( + context, + renderersFactorySupplier, + mediaSourceFactorySupplier, + () -> new DefaultTrackSelector(context), + DefaultLoadControl::new, + () -> DefaultBandwidthMeter.getSingletonInstance(context), + /* analyticsCollectorSupplier= */ null); + } + + private Builder( + Context context, + Supplier renderersFactorySupplier, + Supplier mediaSourceFactorySupplier, + Supplier trackSelectorSupplier, + Supplier loadControlSupplier, + Supplier bandwidthMeterSupplier, + @Nullable Supplier analyticsCollectorSupplier) { this.context = context; - this.renderersFactory = renderersFactory; - this.mediaSourceFactory = mediaSourceFactory; - this.trackSelector = trackSelector; - this.loadControl = loadControl; - this.bandwidthMeter = bandwidthMeter; - this.analyticsCollector = analyticsCollector; + this.renderersFactorySupplier = renderersFactorySupplier; + this.mediaSourceFactorySupplier = mediaSourceFactorySupplier; + this.trackSelectorSupplier = trackSelectorSupplier; + this.loadControlSupplier = loadControlSupplier; + this.bandwidthMeterSupplier = bandwidthMeterSupplier; + this.analyticsCollectorSupplier = + analyticsCollectorSupplier != null + ? analyticsCollectorSupplier + : () -> new AnalyticsCollector(checkNotNull(clock)); looper = Util.getCurrentOrMainLooper(); audioAttributes = AudioAttributes.DEFAULT; wakeMode = C.WAKE_MODE_NONE; @@ -573,7 +603,7 @@ public interface ExoPlayer extends Player { */ public Builder setRenderersFactory(RenderersFactory renderersFactory) { checkState(!buildCalled); - this.renderersFactory = renderersFactory; + this.renderersFactorySupplier = () -> renderersFactory; return this; } @@ -586,7 +616,7 @@ public interface ExoPlayer extends Player { */ public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { checkState(!buildCalled); - this.mediaSourceFactory = mediaSourceFactory; + this.mediaSourceFactorySupplier = () -> mediaSourceFactory; return this; } @@ -599,7 +629,7 @@ public interface ExoPlayer extends Player { */ public Builder setTrackSelector(TrackSelector trackSelector) { checkState(!buildCalled); - this.trackSelector = trackSelector; + this.trackSelectorSupplier = () -> trackSelector; return this; } @@ -612,7 +642,7 @@ public interface ExoPlayer extends Player { */ public Builder setLoadControl(LoadControl loadControl) { checkState(!buildCalled); - this.loadControl = loadControl; + this.loadControlSupplier = () -> loadControl; return this; } @@ -625,7 +655,7 @@ public interface ExoPlayer extends Player { */ public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { checkState(!buildCalled); - this.bandwidthMeter = bandwidthMeter; + this.bandwidthMeterSupplier = () -> bandwidthMeter; return this; } @@ -652,7 +682,7 @@ public interface ExoPlayer extends Player { */ public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { checkState(!buildCalled); - this.analyticsCollector = analyticsCollector; + this.analyticsCollectorSupplier = () -> analyticsCollector; return this; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index f0637df30a..3c6607611e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -28,6 +28,7 @@ import static com.google.android.exoplayer2.Renderer.MSG_SET_SKIP_SILENCE_ENABLE import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_OUTPUT; import static com.google.android.exoplayer2.Renderer.MSG_SET_VOLUME; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import android.content.Context; import android.graphics.Rect; @@ -66,7 +67,6 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.Log; @@ -409,12 +409,14 @@ public class SimpleExoPlayer extends BasePlayer Clock clock, Looper applicationLooper) { this( - new ExoPlayer.Builder(context, renderersFactory) - .setTrackSelector(trackSelector) - .setMediaSourceFactory(mediaSourceFactory) - .setLoadControl(loadControl) - .setBandwidthMeter(bandwidthMeter) - .setAnalyticsCollector(analyticsCollector) + new ExoPlayer.Builder( + context, + renderersFactory, + mediaSourceFactory, + trackSelector, + loadControl, + bandwidthMeter, + analyticsCollector) .setUseLazyPreparation(useLazyPreparation) .setClock(clock) .setLooper(applicationLooper)); @@ -431,7 +433,7 @@ public class SimpleExoPlayer extends BasePlayer constructorFinished = new ConditionVariable(); try { applicationContext = builder.context.getApplicationContext(); - analyticsCollector = builder.analyticsCollector; + analyticsCollector = builder.analyticsCollectorSupplier.get(); priorityTaskManager = builder.priorityTaskManager; audioAttributes = builder.audioAttributes; videoScalingMode = builder.videoScalingMode; @@ -443,12 +445,15 @@ public class SimpleExoPlayer extends BasePlayer listeners = new CopyOnWriteArraySet<>(); Handler eventHandler = new Handler(builder.looper); renderers = - builder.renderersFactory.createRenderers( - eventHandler, - componentListener, - componentListener, - componentListener, - componentListener); + builder + .renderersFactorySupplier + .get() + .createRenderers( + eventHandler, + componentListener, + componentListener, + componentListener, + componentListener); // Set initial values. volume = 1; @@ -476,10 +481,10 @@ public class SimpleExoPlayer extends BasePlayer player = new ExoPlayerImpl( renderers, - builder.trackSelector, - builder.mediaSourceFactory, - builder.loadControl, - builder.bandwidthMeter, + builder.trackSelectorSupplier.get(), + builder.mediaSourceFactorySupplier.get(), + builder.loadControlSupplier.get(), + builder.bandwidthMeterSupplier.get(), analyticsCollector, builder.useLazyPreparation, builder.seekParameters, @@ -848,7 +853,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addAnalyticsListener(AnalyticsListener listener) { // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); + checkNotNull(listener); analyticsCollector.addListener(listener); } @@ -874,7 +879,7 @@ public class SimpleExoPlayer extends BasePlayer return; } if (isPriorityTaskManagerRegistered) { - Assertions.checkNotNull(this.priorityTaskManager).remove(C.PRIORITY_PLAYBACK); + checkNotNull(this.priorityTaskManager).remove(C.PRIORITY_PLAYBACK); } if (priorityTaskManager != null && isLoading()) { priorityTaskManager.add(C.PRIORITY_PLAYBACK); @@ -982,7 +987,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Listener listener) { - Assertions.checkNotNull(listener); + checkNotNull(listener); listeners.add(listener); EventListener eventListener = listener; addListener(eventListener); @@ -992,13 +997,13 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Player.EventListener listener) { // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); + checkNotNull(listener); player.addEventListener(listener); } @Override public void removeListener(Listener listener) { - Assertions.checkNotNull(listener); + checkNotNull(listener); listeners.remove(listener); EventListener eventListener = listener; removeListener(eventListener); @@ -1322,7 +1327,7 @@ public class SimpleExoPlayer extends BasePlayer ownedSurface = null; } if (isPriorityTaskManagerRegistered) { - Assertions.checkNotNull(priorityTaskManager).remove(C.PRIORITY_PLAYBACK); + checkNotNull(priorityTaskManager).remove(C.PRIORITY_PLAYBACK); isPriorityTaskManagerRegistered = false; } currentCues = Collections.emptyList();