diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 7c7f592264..eb7e34c103 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -115,7 +115,7 @@ import java.util.ArrayList; DefaultTrackSelector trackSelector = new DefaultTrackSelector(); RenderersFactory renderersFactory = new DefaultRenderersFactory(context); - exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); + exoPlayer = ExoPlayerFactory.newSimpleInstance(context, renderersFactory, trackSelector); exoPlayer.addListener(this); localPlayerView.setPlayer(exoPlayer); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 3081b2dc4f..5d7023d687 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -424,7 +424,8 @@ public class PlayerActivity extends Activity lastSeenTrackGroupArray = null; player = - ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager); + ExoPlayerFactory.newSimpleInstance( + /* context= */ this, renderersFactory, trackSelector, drmSessionManager); player.addListener(new PlayerEventListener()); player.setPlayWhenReady(startAutoPlay); player.addAnalyticsListener(new EventLogger(trackSelector)); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java index bbbfa8fd09..a00d11c831 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java @@ -42,13 +42,14 @@ public final class ExoPlayerFactory { * @param context A {@link Context}. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. - * @deprecated Use {@link #newSimpleInstance(RenderersFactory, TrackSelector, LoadControl)}. + * @deprecated Use {@link #newSimpleInstance(Context, RenderersFactory, TrackSelector, + * LoadControl)}. */ @Deprecated - public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, - LoadControl loadControl) { + public static SimpleExoPlayer newSimpleInstance( + Context context, TrackSelector trackSelector, LoadControl loadControl) { RenderersFactory renderersFactory = new DefaultRenderersFactory(context); - return newSimpleInstance(renderersFactory, trackSelector, loadControl); + return newSimpleInstance(context, renderersFactory, trackSelector, loadControl); } /** @@ -59,14 +60,18 @@ public final class ExoPlayerFactory { * @param loadControl The {@link LoadControl} that will be used by the instance. * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance * will not be used for DRM protected playbacks. - * @deprecated Use {@link #newSimpleInstance(RenderersFactory, TrackSelector, LoadControl)}. + * @deprecated Use {@link #newSimpleInstance(Context, RenderersFactory, TrackSelector, + * LoadControl)}. */ @Deprecated - public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, + public static SimpleExoPlayer newSimpleInstance( + Context context, + TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager) { RenderersFactory renderersFactory = new DefaultRenderersFactory(context); - return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager); + return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, drmSessionManager); } /** @@ -80,14 +85,19 @@ public final class ExoPlayerFactory { * @param extensionRendererMode The extension renderer mode, which determines if and how available * extension renderers are used. Note that extensions must be included in the application * build for them to be considered available. - * @deprecated Use {@link #newSimpleInstance(RenderersFactory, TrackSelector, LoadControl)}. + * @deprecated Use {@link #newSimpleInstance(Context, RenderersFactory, TrackSelector, + * LoadControl)}. */ @Deprecated - public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, - LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, + public static SimpleExoPlayer newSimpleInstance( + Context context, + TrackSelector trackSelector, + LoadControl loadControl, + @Nullable DrmSessionManager drmSessionManager, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) { RenderersFactory renderersFactory = new DefaultRenderersFactory(context, extensionRendererMode); - return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager); + return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, drmSessionManager); } /** @@ -103,16 +113,21 @@ public final class ExoPlayerFactory { * build for them to be considered available. * @param allowedVideoJoiningTimeMs The maximum duration for which a video renderer can attempt to * seamlessly join an ongoing playback. - * @deprecated Use {@link #newSimpleInstance(RenderersFactory, TrackSelector, LoadControl)}. + * @deprecated Use {@link #newSimpleInstance(Context, RenderersFactory, TrackSelector, + * LoadControl)}. */ @Deprecated - public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector, - LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, + public static SimpleExoPlayer newSimpleInstance( + Context context, + TrackSelector trackSelector, + LoadControl loadControl, + @Nullable DrmSessionManager drmSessionManager, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode, long allowedVideoJoiningTimeMs) { RenderersFactory renderersFactory = new DefaultRenderersFactory(context, extensionRendererMode, allowedVideoJoiningTimeMs); - return newSimpleInstance(renderersFactory, trackSelector, loadControl, drmSessionManager); + return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, drmSessionManager); } /** @@ -122,7 +137,7 @@ public final class ExoPlayerFactory { * @param trackSelector The {@link TrackSelector} that will be used by the instance. */ public static SimpleExoPlayer newSimpleInstance(Context context, TrackSelector trackSelector) { - return newSimpleInstance(new DefaultRenderersFactory(context), trackSelector); + return newSimpleInstance(context, new DefaultRenderersFactory(context), trackSelector); } /** @@ -130,38 +145,61 @@ public final class ExoPlayerFactory { * * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. + * @deprecated Use {@link #newSimpleInstance(Context, RenderersFactory, TrackSelector)}. */ - public static SimpleExoPlayer newSimpleInstance(RenderersFactory renderersFactory, - TrackSelector trackSelector) { - return newSimpleInstance(renderersFactory, trackSelector, new DefaultLoadControl()); + @Deprecated + @SuppressWarnings("nullness:argument.type.incompatible") + public static SimpleExoPlayer newSimpleInstance( + RenderersFactory renderersFactory, TrackSelector trackSelector) { + return newSimpleInstance( + /* context= */ null, renderersFactory, trackSelector, new DefaultLoadControl()); } /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. + * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. + * @param trackSelector The {@link TrackSelector} that will be used by the instance. + */ + public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector) { + return newSimpleInstance(context, renderersFactory, trackSelector, new DefaultLoadControl()); + } + + /** + * Creates a {@link SimpleExoPlayer} instance. + * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance * will not be used for DRM protected playbacks. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, @Nullable DrmSessionManager drmSessionManager) { return newSimpleInstance( - renderersFactory, trackSelector, new DefaultLoadControl(), drmSessionManager); + context, renderersFactory, trackSelector, new DefaultLoadControl(), drmSessionManager); } /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. */ - public static SimpleExoPlayer newSimpleInstance(RenderersFactory renderersFactory, - TrackSelector trackSelector, LoadControl loadControl) { + public static SimpleExoPlayer newSimpleInstance( + Context context, + RenderersFactory renderersFactory, + TrackSelector trackSelector, + LoadControl loadControl) { return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, @@ -172,6 +210,7 @@ public final class ExoPlayerFactory { /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -179,17 +218,19 @@ public final class ExoPlayerFactory { * will not be used for DRM protected playbacks. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager) { return newSimpleInstance( - renderersFactory, trackSelector, loadControl, drmSessionManager, Util.getLooper()); + context, renderersFactory, trackSelector, loadControl, drmSessionManager, Util.getLooper()); } /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -198,12 +239,14 @@ public final class ExoPlayerFactory { * @param bandwidthMeter The {@link BandwidthMeter} that will be used by the instance. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, BandwidthMeter bandwidthMeter) { return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, @@ -216,6 +259,7 @@ public final class ExoPlayerFactory { /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -225,12 +269,14 @@ public final class ExoPlayerFactory { * will collect and forward all player events. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, AnalyticsCollector.Factory analyticsCollectorFactory) { return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, @@ -242,6 +288,7 @@ public final class ExoPlayerFactory { /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -251,12 +298,14 @@ public final class ExoPlayerFactory { * used to call listeners on. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @Nullable DrmSessionManager drmSessionManager, Looper looper) { return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, @@ -268,6 +317,7 @@ public final class ExoPlayerFactory { /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -279,6 +329,7 @@ public final class ExoPlayerFactory { * used to call listeners on. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @@ -286,6 +337,7 @@ public final class ExoPlayerFactory { AnalyticsCollector.Factory analyticsCollectorFactory, Looper looper) { return newSimpleInstance( + context, renderersFactory, trackSelector, loadControl, @@ -298,6 +350,7 @@ public final class ExoPlayerFactory { /** * Creates a {@link SimpleExoPlayer} instance. * + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -309,6 +362,7 @@ public final class ExoPlayerFactory { * used to call listeners on. */ public static SimpleExoPlayer newSimpleInstance( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @@ -317,6 +371,7 @@ public final class ExoPlayerFactory { AnalyticsCollector.Factory analyticsCollectorFactory, Looper looper) { return new SimpleExoPlayer( + context, renderersFactory, trackSelector, loadControl, 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 583558fd43..70dbcaf730 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 @@ -16,8 +16,10 @@ package com.google.android.exoplayer2; import android.annotation.TargetApi; +import android.content.Context; import android.graphics.Rect; import android.graphics.SurfaceTexture; +import android.media.AudioManager; import android.media.MediaCodec; import android.media.PlaybackParams; import android.os.Handler; @@ -83,6 +85,9 @@ public class SimpleExoPlayer private final BandwidthMeter bandwidthMeter; private final AnalyticsCollector analyticsCollector; + @SuppressWarnings({"unused", "FieldCanBeLocal"}) + private final @Nullable AudioManager audioManager; + private Format videoFormat; private Format audioFormat; @@ -110,7 +115,10 @@ public class SimpleExoPlayer * will not be used for DRM protected playbacks. * @param looper The {@link Looper} which must be used for all calls to the player and which is * used to call listeners on. + * @deprecated Use {@link #SimpleExoPlayer(Context, RenderersFactory, TrackSelector, LoadControl, + * BandwidthMeter, DrmSessionManager, Looper)}. */ + @Deprecated protected SimpleExoPlayer( RenderersFactory renderersFactory, TrackSelector trackSelector, @@ -119,6 +127,7 @@ public class SimpleExoPlayer @Nullable DrmSessionManager drmSessionManager, Looper looper) { this( + /* context= */ null, renderersFactory, trackSelector, loadControl, @@ -129,6 +138,37 @@ public class SimpleExoPlayer } /** + * @param context A {@link Context}. + * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. + * @param trackSelector The {@link TrackSelector} that will be used by the instance. + * @param loadControl The {@link LoadControl} that will be used by the instance. + * @param bandwidthMeter The {@link BandwidthMeter} that will be used by the instance. + * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the instance + * will not be used for DRM protected playbacks. + * @param looper The {@link Looper} which must be used for all calls to the player and which is + * used to call listeners on. + */ + protected SimpleExoPlayer( + Context context, + RenderersFactory renderersFactory, + TrackSelector trackSelector, + LoadControl loadControl, + BandwidthMeter bandwidthMeter, + @Nullable DrmSessionManager drmSessionManager, + Looper looper) { + this( + context, + renderersFactory, + trackSelector, + loadControl, + drmSessionManager, + bandwidthMeter, + new AnalyticsCollector.Factory(), + looper); + } + + /** + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -141,6 +181,7 @@ public class SimpleExoPlayer * used to call listeners on. */ protected SimpleExoPlayer( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @@ -149,6 +190,7 @@ public class SimpleExoPlayer AnalyticsCollector.Factory analyticsCollectorFactory, Looper looper) { this( + context, renderersFactory, trackSelector, loadControl, @@ -160,6 +202,7 @@ public class SimpleExoPlayer } /** + * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer}s to be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. @@ -174,6 +217,7 @@ public class SimpleExoPlayer * used to call listeners on. */ protected SimpleExoPlayer( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, @@ -221,6 +265,13 @@ public class SimpleExoPlayer if (drmSessionManager instanceof DefaultDrmSessionManager) { ((DefaultDrmSessionManager) drmSessionManager).addListener(eventHandler, analyticsCollector); } + // TODO: Remove null check once the deprecated factory method and constructor that don't take + // Contexts have been removed. + audioManager = + context == null + ? null + : (AudioManager) + context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE); } @Override diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 3b81782ddf..82b8a8d892 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; +import android.content.Context; import android.support.annotation.Nullable; import android.view.Surface; import com.google.android.exoplayer2.Player.DiscontinuityReason; @@ -58,9 +59,11 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; /** Unit test for {@link ExoPlayer}. */ @@ -75,6 +78,13 @@ public final class ExoPlayerTest { */ private static final int TIMEOUT_MS = 10000; + private Context context; + + @Before + public void setUp() { + context = RuntimeEnvironment.application; + } + /** * Tests playback of a source that exposes an empty timeline. Playback is expected to end without * error. @@ -87,7 +97,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setRenderers(renderer) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertNoPositionDiscontinuities(); @@ -108,7 +118,7 @@ public final class ExoPlayerTest { .setTimeline(timeline) .setManifest(manifest) .setRenderers(renderer) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertNoPositionDiscontinuities(); @@ -130,7 +140,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setRenderers(renderer) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPositionDiscontinuityReasonsEqual( @@ -154,7 +164,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setRenderers(renderer) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); Integer[] expectedReasons = new Integer[99]; @@ -211,7 +221,7 @@ public final class ExoPlayerTest { .setTimeline(timeline) .setRenderers(videoRenderer, audioRenderer) .setSupportedFormats(Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPositionDiscontinuityReasonsEqual( @@ -288,7 +298,7 @@ public final class ExoPlayerTest { .setMediaSource(firstSource) .setRenderers(renderer) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertNoPositionDiscontinuities(); @@ -333,7 +343,7 @@ public final class ExoPlayerTest { .setTimeline(timeline) .setRenderers(renderer) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPlayedPeriodIndices(0, 1, 1, 2, 2, 0, 0, 0, 1, 2); @@ -380,7 +390,7 @@ public final class ExoPlayerTest { .setMediaSource(mediaSource) .setRenderers(renderer) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPlayedPeriodIndices(0, 1, 0, 2, 1, 2); @@ -437,7 +447,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(fakeMediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); // There is still one discontinuity from content to content for the failed ad insertion. @@ -458,7 +468,7 @@ public final class ExoPlayerTest { new Builder() .setRenderers(renderer) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(renderer.isEnded).isTrue(); @@ -509,7 +519,7 @@ public final class ExoPlayerTest { .setTimeline(timeline) .setEventListener(eventListener) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPositionDiscontinuityReasonsEqual( @@ -550,7 +560,7 @@ public final class ExoPlayerTest { } }; ExoPlayerTestRunner testRunner = - new Builder().setActionSchedule(actionSchedule).setEventListener(listener).build(); + new Builder().setActionSchedule(actionSchedule).setEventListener(listener).build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -570,7 +580,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPositionDiscontinuityReasonsEqual(Player.DISCONTINUITY_REASON_SEEK); @@ -604,7 +614,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPositionDiscontinuityReasonsEqual( @@ -631,7 +641,7 @@ public final class ExoPlayerTest { ExoPlayerTestRunner testRunner = new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPositionDiscontinuityReasonsEqual(Player.DISCONTINUITY_REASON_INTERNAL); @@ -657,7 +667,7 @@ public final class ExoPlayerTest { ExoPlayerTestRunner testRunner = new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); // If the position is unchanged we do not expect the discontinuity to be reported externally. @@ -677,7 +687,7 @@ public final class ExoPlayerTest { .setMediaSource(mediaSource) .setRenderers(videoRenderer, audioRenderer) .setTrackSelector(trackSelector) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -706,7 +716,7 @@ public final class ExoPlayerTest { .setMediaSource(mediaSource) .setRenderers(videoRenderer, audioRenderer) .setTrackSelector(trackSelector) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -744,7 +754,7 @@ public final class ExoPlayerTest { .setRenderers(videoRenderer, audioRenderer) .setTrackSelector(trackSelector) .setActionSchedule(disableTrackAction) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -783,7 +793,7 @@ public final class ExoPlayerTest { .setRenderers(videoRenderer, audioRenderer) .setTrackSelector(trackSelector) .setActionSchedule(disableTrackAction) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -824,7 +834,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertTimelinesEqual(timeline1, timeline2); @@ -865,7 +875,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(firstMediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPlayedPeriodIndices(0, 1, 0); @@ -922,7 +932,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); } @@ -949,7 +959,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -981,7 +991,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -1013,7 +1023,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -1038,7 +1048,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS); mediaSource.assertReleased(); @@ -1059,7 +1069,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS); mediaSource.assertReleased(); @@ -1082,7 +1092,7 @@ public final class ExoPlayerTest { .setTimeline(timeline) .setActionSchedule(actionSchedule) .setExpectedPlayerEndedCount(2) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertTimelinesEqual(timeline, Timeline.EMPTY, timeline); @@ -1112,7 +1122,7 @@ public final class ExoPlayerTest { .setTimeline(timeline) .setActionSchedule(actionSchedule) .setExpectedPlayerEndedCount(2) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertTimelinesEqual(timeline, Timeline.EMPTY, secondTimeline); @@ -1138,7 +1148,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -1164,7 +1174,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -1191,7 +1201,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build(); + .build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -1240,7 +1250,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build(); + .build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -1280,7 +1290,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build(); + .build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -1327,7 +1337,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(concatenatingMediaSource) .setActionSchedule(actionSchedule) - .build(); + .build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -1369,7 +1379,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(concatenatingMediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -1427,7 +1437,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build(); + .build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -1462,7 +1472,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build(); + .build(context); try { testRunner.start().blockUntilActionScheduleFinished(TIMEOUT_MS).blockUntilEnded(TIMEOUT_MS); fail(); @@ -1488,7 +1498,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1508,7 +1518,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1530,7 +1540,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target50.positionMs).isAtLeast(50L); @@ -1554,7 +1564,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target1.positionMs).isAtLeast(50L); @@ -1576,7 +1586,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1613,7 +1623,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -1640,7 +1650,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1660,7 +1670,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1681,7 +1691,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isEqualTo(C.POSITION_UNSET); @@ -1702,7 +1712,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isEqualTo(C.POSITION_UNSET); @@ -1725,7 +1735,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.messageCount).isEqualTo(1); @@ -1754,7 +1764,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.messageCount).isEqualTo(2); @@ -1789,7 +1799,7 @@ public final class ExoPlayerTest { new Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1810,7 +1820,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.windowIndex).isEqualTo(2); @@ -1831,7 +1841,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.windowIndex).isEqualTo(2); @@ -1869,7 +1879,7 @@ public final class ExoPlayerTest { new Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); @@ -1903,7 +1913,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target1.windowIndex).isEqualTo(0); @@ -1942,7 +1952,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(message.get().isCanceled()).isTrue(); @@ -1986,7 +1996,7 @@ public final class ExoPlayerTest { new Builder() .setTimeline(timeline) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); assertThat(message.get().isCanceled()).isTrue(); @@ -2009,7 +2019,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setRenderers(videoRenderer) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -2025,7 +2035,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setTimeline(Timeline.EMPTY) .setActionSchedule(waitForEndedAndSwitchSchedule) - .build() + .build(context) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); @@ -2065,7 +2075,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); testRunner.assertPlayedPeriodIndices(0, 1); @@ -2103,7 +2113,7 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder() .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -2154,7 +2164,7 @@ public final class ExoPlayerTest { .build(); new ExoPlayerTestRunner.Builder() .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -2204,7 +2214,7 @@ public final class ExoPlayerTest { .build(); new ExoPlayerTestRunner.Builder() .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); @@ -2269,7 +2279,7 @@ public final class ExoPlayerTest { .setClock(clock) .setMediaSource(mediaSource) .setActionSchedule(actionSchedule) - .build() + .build(context) .start() .blockUntilEnded(TIMEOUT_MS); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 63d333df40..3216087169 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -711,7 +711,7 @@ public final class AnalyticsCollectorTest { .setRenderersFactory(renderersFactory) .setAnalyticsListener(listener) .setActionSchedule(actionSchedule) - .build() + .build(RuntimeEnvironment.application) .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index 38733445cb..0da9430b12 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -301,7 +301,7 @@ public final class DashTestRunner { DrmSessionManager drmSessionManager) { SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance( - new DebugRenderersFactory(host), trackSelector, drmSessionManager); + host, new DebugRenderersFactory(host), trackSelector, drmSessionManager); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index 47f82e54c4..00e2943086 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -370,7 +370,8 @@ public abstract class ExoHostedTest DrmSessionManager drmSessionManager) { RenderersFactory renderersFactory = new DefaultRenderersFactory(host, drmSessionManager, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0); - SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector); + SimpleExoPlayer player = + ExoPlayerFactory.newSimpleInstance(host, renderersFactory, trackSelector); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index bd98c1f1ca..c637792935 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.testutil; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; import android.os.HandlerThread; import android.os.Looper; import android.support.annotation.Nullable; @@ -291,9 +292,10 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc /** * Builds an {@link ExoPlayerTestRunner} using the provided values or their defaults. * + * @param context The context. * @return The built {@link ExoPlayerTestRunner}. */ - public ExoPlayerTestRunner build() { + public ExoPlayerTestRunner build(Context context) { if (supportedFormats == null) { supportedFormats = new Format[] {VIDEO_FORMAT}; } @@ -334,6 +336,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc expectedPlayerEndedCount = 1; } return new ExoPlayerTestRunner( + context, clock, mediaSource, renderersFactory, @@ -348,6 +351,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc } } + private final Context context; private final Clock clock; private final MediaSource mediaSource; private final RenderersFactory renderersFactory; @@ -375,6 +379,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc private boolean playerWasPrepared; private ExoPlayerTestRunner( + Context context, Clock clock, MediaSource mediaSource, RenderersFactory renderersFactory, @@ -386,6 +391,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc @Nullable AudioRendererEventListener audioRendererEventListener, @Nullable AnalyticsListener analyticsListener, int expectedPlayerEndedCount) { + this.context = context; this.clock = clock; this.mediaSource = mediaSource; this.renderersFactory = renderersFactory; @@ -423,7 +429,9 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc @Override public void run() { try { - player = new TestSimpleExoPlayer(renderersFactory, trackSelector, loadControl, clock); + player = + new TestSimpleExoPlayer( + context, renderersFactory, trackSelector, loadControl, clock); player.addListener(ExoPlayerTestRunner.this); if (eventListener != null) { player.addListener(eventListener); @@ -652,11 +660,13 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc private static final class TestSimpleExoPlayer extends SimpleExoPlayer { public TestSimpleExoPlayer( + Context context, RenderersFactory renderersFactory, TrackSelector trackSelector, LoadControl loadControl, Clock clock) { super( + context, renderersFactory, trackSelector, loadControl,