Add Context to SimpleExoPlayer factory methods

This is needed for implementing (optional) support for audio focus handling in a
later change.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206899837
This commit is contained in:
andrewlewis 2018-08-01 02:19:18 -07:00 committed by Oliver Woodman
parent 429bf4d099
commit 5715960304
9 changed files with 223 additions and 95 deletions

View File

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

View File

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

View File

@ -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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> drmSessionManager,
public static SimpleExoPlayer newSimpleInstance(
Context context,
TrackSelector trackSelector,
LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> drmSessionManager,
public static SimpleExoPlayer newSimpleInstance(
Context context,
TrackSelector trackSelector,
LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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,

View File

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

View File

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

View File

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

View File

@ -301,7 +301,7 @@ public final class DashTestRunner {
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
SimpleExoPlayer player =
ExoPlayerFactory.newSimpleInstance(
new DebugRenderersFactory(host), trackSelector, drmSessionManager);
host, new DebugRenderersFactory(host), trackSelector, drmSessionManager);
player.setVideoSurface(surface);
return player;
}

View File

@ -370,7 +370,8 @@ public abstract class ExoHostedTest
DrmSessionManager<FrameworkMediaCrypto> 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;
}

View File

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