Rename PreloadMediaSource.PreloadControl methods

The IntDefs in `DefaultPreloadManager.Stage` are also renamed accordingly.

PiperOrigin-RevId: 638631357
This commit is contained in:
tianyifeng 2024-05-30 06:29:51 -07:00 committed by Copybara-Service
parent 4db9bf92af
commit 1f1897709f
6 changed files with 166 additions and 214 deletions

View File

@ -38,6 +38,9 @@
* Fix bug where playback moved to `STATE_ENDED` when re-preparing a
multi-period DASH live stream after the original period was already
removed from the manifest.
* Rename `onTimelineRefreshed` to `onSourcePrepared` and `onPrepared` to
`onTracksSelected` in `PreloadMediaSource.PreloadControl`. Also rename
the IntDefs in `DefaultPreloadManager.Stage` accordingly.
* Transformer:
* Work around a decoder bug where the number of audio channels was capped
at stereo when handling PCM input.

View File

@ -24,7 +24,6 @@ import android.os.Looper;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.Timeline;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util;
import androidx.media3.exoplayer.ExoPlayer;
@ -57,25 +56,25 @@ public final class DefaultPreloadManager extends BasePreloadManager<Integer> {
public static class Status implements TargetPreloadStatusControl.PreloadStatus {
/**
* Stages that for the preload status. One of {@link #STAGE_TIMELINE_REFRESHED}, {@link
* #STAGE_SOURCE_PREPARED} or {@link #STAGE_LOADED_TO_POSITION_MS}.
* Stages for the preload status. One of {@link #STAGE_SOURCE_PREPARED}, {@link
* #STAGE_TRACKS_SELECTED} or {@link #STAGE_LOADED_TO_POSITION_MS}.
*/
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(TYPE_USE)
@IntDef(
value = {
STAGE_TIMELINE_REFRESHED,
STAGE_SOURCE_PREPARED,
STAGE_TRACKS_SELECTED,
STAGE_LOADED_TO_POSITION_MS,
})
public @interface Stage {}
/** The {@link PreloadMediaSource} has its {@link Timeline} refreshed. */
public static final int STAGE_TIMELINE_REFRESHED = 0;
/** The {@link PreloadMediaSource} has completed preparation. */
public static final int STAGE_SOURCE_PREPARED = 0;
/** The {@link PreloadMediaSource} is prepared. */
public static final int STAGE_SOURCE_PREPARED = 1;
/** The {@link PreloadMediaSource} has tracks selected. */
public static final int STAGE_TRACKS_SELECTED = 1;
/** The {@link PreloadMediaSource} is loaded to a specific position in microseconds. */
public static final int STAGE_LOADED_TO_POSITION_MS = 2;
@ -205,25 +204,25 @@ public final class DefaultPreloadManager extends BasePreloadManager<Integer> {
private final class SourcePreloadControl implements PreloadMediaSource.PreloadControl {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
// The PreloadMediaSource may have more data preloaded than the target preload status if it
// has been preloaded before, thus we set `clearExceededDataFromTargetPreloadStatus` to
// `true` to clear the exceeded data.
return continueOrCompletePreloading(
mediaSource,
/* continueLoadingPredicate= */ status ->
status.getStage() > Status.STAGE_TIMELINE_REFRESHED,
status.getStage() > Status.STAGE_SOURCE_PREPARED,
/* clearExceededDataFromTargetPreloadStatus= */ true);
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
// Set `clearExceededDataFromTargetPreloadStatus` to `false` as clearing the exceeded data
// from the status STAGE_SOURCE_PREPARED is not supported.
// from the status STAGE_TRACKS_SELECTED is not supported.
return continueOrCompletePreloading(
mediaSource,
/* continueLoadingPredicate= */ status ->
status.getStage() > Status.STAGE_SOURCE_PREPARED,
status.getStage() > Status.STAGE_TRACKS_SELECTED,
/* clearExceededDataFromTargetPreloadStatus= */ false);
}

View File

@ -63,20 +63,20 @@ public final class PreloadMediaSource extends WrappingMediaSource {
public interface PreloadControl {
/**
* Called from {@link PreloadMediaSource} when the {@link Timeline} is refreshed.
* Called from {@link PreloadMediaSource} when it has completed preparation.
*
* @param mediaSource The {@link PreloadMediaSource} that has its {@link Timeline} refreshed.
* @param mediaSource The {@link PreloadMediaSource} that has completed preparation.
* @return True if the {@code mediaSource} should continue preloading, false otherwise.
*/
boolean onTimelineRefreshed(PreloadMediaSource mediaSource);
boolean onSourcePrepared(PreloadMediaSource mediaSource);
/**
* Called from {@link PreloadMediaSource} when it is prepared.
* Called from {@link PreloadMediaSource} when it has tracks selected.
*
* @param mediaSource The {@link PreloadMediaSource} it is prepared.
* @param mediaSource The {@link PreloadMediaSource} that has tracks selected.
* @return True if the {@code mediaSource} should continue preloading, false otherwise.
*/
boolean onPrepared(PreloadMediaSource mediaSource);
boolean onTracksSelected(PreloadMediaSource mediaSource);
/**
* Called from {@link PreloadMediaSource} when it requests to continue loading.
@ -291,7 +291,7 @@ public final class PreloadMediaSource extends WrappingMediaSource {
protected void onChildSourceInfoRefreshed(Timeline newTimeline) {
this.timeline = newTimeline;
refreshSourceInfo(newTimeline);
if (isUsedByPlayer() || !preloadControl.onTimelineRefreshed(PreloadMediaSource.this)) {
if (isUsedByPlayer() || !preloadControl.onSourcePrepared(PreloadMediaSource.this)) {
return;
}
Pair<Object, Long> periodPosition =
@ -415,7 +415,7 @@ public final class PreloadMediaSource extends WrappingMediaSource {
if (trackSelectorResult != null) {
preloadMediaPeriod.selectTracksForPreloading(
trackSelectorResult.selections, periodStartPositionUs);
if (preloadControl.onPrepared(PreloadMediaSource.this)) {
if (preloadControl.onTracksSelected(PreloadMediaSource.this)) {
preloadMediaPeriod.continueLoading(
new LoadingInfo.Builder().setPlaybackPositionUs(periodStartPositionUs).build());
}

View File

@ -17,7 +17,7 @@ package androidx.media3.exoplayer.source.preload;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_SOURCE_PREPARED;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_TIMELINE_REFRESHED;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_TRACKS_SELECTED;
import static androidx.media3.test.utils.FakeMediaSourceFactory.DEFAULT_WINDOW_UID;
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runMainLooperUntil;
import static com.google.common.truth.Truth.assertThat;
@ -192,7 +192,7 @@ public class DefaultPreloadManagerTest {
if (abs(rankingData - currentPlayingItemIndex.get()) == 1) {
return new DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 100L);
} else {
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
}
};
ProgressiveMediaSource.Factory mediaSourceFactory =
@ -244,7 +244,7 @@ public class DefaultPreloadManagerTest {
if (abs(rankingData - currentPlayingItemIndex.get()) == 1) {
return new DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 100L);
} else {
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
}
};
ProgressiveMediaSource.Factory mediaSourceFactory =
@ -297,7 +297,7 @@ public class DefaultPreloadManagerTest {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> {
targetPreloadStatusControlCallStates.add(rankingData);
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
};
FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory();
DefaultPreloadManager preloadManager =
@ -340,7 +340,7 @@ public class DefaultPreloadManagerTest {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> {
targetPreloadStatusControlCallStates.add(rankingData);
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
};
FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory();
DefaultPreloadManager preloadManager =
@ -453,9 +453,9 @@ public class DefaultPreloadManagerTest {
rankingData -> {
targetPreloadStatusControlCallStates.add(rankingData);
if (abs(rankingData - currentPlayingIndex.get()) <= 2) {
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
return new DefaultPreloadManager.Status(STAGE_TRACKS_SELECTED);
} else if (abs(rankingData - currentPlayingIndex.get()) == 3) {
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
}
return null;
};
@ -573,7 +573,7 @@ public class DefaultPreloadManagerTest {
@Test
public void removeByMediaItems_correspondingHeldSourceRemovedAndReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
DefaultPreloadManager preloadManager =
new DefaultPreloadManager(
@ -624,7 +624,7 @@ public class DefaultPreloadManagerTest {
@Test
public void removeByMediaSources_heldSourceRemovedAndReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
DefaultPreloadManager preloadManager =
new DefaultPreloadManager(
@ -682,7 +682,7 @@ public class DefaultPreloadManagerTest {
@Test
public void reset_returnZeroCount_sourcesButNotRendererCapabilitiesListReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
List<FakeRenderer> underlyingRenderers = new ArrayList<>();
RenderersFactory renderersFactory =
@ -753,7 +753,7 @@ public class DefaultPreloadManagerTest {
@Test
public void release_returnZeroCount_sourcesAndRendererCapabilitiesListReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED);
rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
List<FakeRenderer> underlyingRenderers = new ArrayList<>();
RenderersFactory renderersFactory =

View File

@ -68,8 +68,8 @@ public class PreloadAndPlaybackCoordinationTest {
private final FakeMediaSource wrappedMediaSource;
private final MediaSource.MediaSourceCaller playbackMediaSourceCaller;
private final AtomicInteger preloadControlOnSourceInfoRefreshedCalledCounter;
private final AtomicInteger preloadControlOnPreparedCalledCounter;
private final AtomicInteger preloadControlOnSourcePreparedCalledCounter;
private final AtomicInteger preloadControlOnTracksSelectedCalledCounter;
private final AtomicInteger preloadControlOnUsedByPlayerCounter;
private final AtomicBoolean playbackSourceCallerOnSourceInfoRefreshedCalled;
private final AtomicBoolean playbackPeriodCallbackOnPreparedCalled;
@ -93,8 +93,8 @@ public class PreloadAndPlaybackCoordinationTest {
SystemClock.DEFAULT.createHandler(handler.getLooper(), /* callback= */ null),
audioListener)
};
preloadControlOnSourceInfoRefreshedCalledCounter = new AtomicInteger();
preloadControlOnPreparedCalledCounter = new AtomicInteger();
preloadControlOnSourcePreparedCalledCounter = new AtomicInteger();
preloadControlOnTracksSelectedCalledCounter = new AtomicInteger();
preloadControlOnUsedByPlayerCounter = new AtomicInteger();
playbackSourceCallerOnSourceInfoRefreshedCalled = new AtomicBoolean();
playbackPeriodCallbackOnPreparedCalled = new AtomicBoolean();
@ -103,14 +103,14 @@ public class PreloadAndPlaybackCoordinationTest {
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
preloadControlOnSourceInfoRefreshedCalledCounter.addAndGet(1);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
preloadControlOnSourcePreparedCalledCounter.addAndGet(1);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
preloadControlOnPreparedCalledCounter.addAndGet(1);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
preloadControlOnTracksSelectedCalledCounter.addAndGet(1);
return true;
}
@ -173,8 +173,8 @@ public class PreloadAndPlaybackCoordinationTest {
playbackMediaSourceCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -187,8 +187,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
}
@ -199,8 +199,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -213,13 +213,13 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2);
}
@Test
public void playbackBetweenPreloadStartAndTimelineInfoRefreshed_reusableForPreloadAfterRelease() {
public void playbackBetweenPreloadStartAndSourcePrepared_reusableForPreloadAfterRelease() {
wrappedMediaSource.setAllowPreparation(false);
preloadMediaSource.preload(/* startPositionUs= */ 0L);
@ -229,8 +229,8 @@ public class PreloadAndPlaybackCoordinationTest {
wrappedMediaSource.setAllowPreparation(true);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -243,14 +243,14 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
}
@Test
public void
playbackBetweenPreloadTimelineRefreshedAndPeriodPrepared_reusableForPreloadAfterRelease() {
playbackBetweenPreloadSourcePreparedAndTracksSelected_reusableForPreloadAfterRelease() {
wrappedMediaSource.setPeriodDefersOnPreparedCallback(true);
preloadMediaSource.preload(/* startPositionUs= */ 0L);
@ -262,8 +262,8 @@ public class PreloadAndPlaybackCoordinationTest {
lastCreatedActiveMediaPeriod.setPreparationComplete();
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -277,8 +277,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
}
@ -290,8 +290,8 @@ public class PreloadAndPlaybackCoordinationTest {
playbackMediaSourceCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -304,8 +304,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
}

View File

@ -107,22 +107,22 @@ public final class PreloadMediaSourceTest {
@Test
public void preload_loadPeriodToTargetPreloadPosition() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean();
AtomicBoolean onPreparedCalled = new AtomicBoolean();
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicBoolean onContinueLoadingStopped = new AtomicBoolean();
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return true;
}
@ -167,31 +167,31 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onContinueLoadingStopped::get);
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onPreparedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(onTracksSelectedCalled.get()).isTrue();
assertThat(onUsedByPlayerCalled.get()).isFalse();
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
}
@Test
public void preload_stopWhenPeriodPreparedByPreloadControl() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean();
AtomicBoolean onPreparedCalled = new AtomicBoolean();
public void preload_stopWhenTracksSelectedByPreloadControl() throws Exception {
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
preloadMediaSourceReference.set(mediaSource);
onPreparedCalled.set(true);
onTracksSelectedCalled.set(true);
return false;
}
@ -230,33 +230,33 @@ public final class PreloadMediaSourceTest {
.build());
preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onPreparedCalled::get);
runMainLooperUntil(onTracksSelectedCalled::get);
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onContinueLoadingRequestedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isFalse();
}
@Test
public void preload_stopWhenTimelineRefreshedByPreloadControl() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean();
public void preload_stopWhenSourcePreparedByPreloadControl() throws Exception {
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
AtomicBoolean onPreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
preloadMediaSourceReference.set(mediaSource);
onTimelineRefreshedCalled.set(true);
onSourcePreparedCalled.set(true);
return false;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return false;
}
@ -294,30 +294,30 @@ public final class PreloadMediaSourceTest {
.build());
preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onTimelineRefreshedCalled::get);
runMainLooperUntil(onSourcePreparedCalled::get);
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onPreparedCalled.get()).isFalse();
assertThat(onTracksSelectedCalled.get()).isFalse();
assertThat(onContinueLoadingRequestedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isFalse();
}
@Test
public void preload_whileSourceIsAccessedByExternalCaller_notProceedWithPreloading() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
AtomicBoolean onPreparedCalled = new AtomicBoolean(false);
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean(false);
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return true;
}
@ -351,12 +351,7 @@ public final class PreloadMediaSourceTest {
AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerMediaSourceReference.set(source);
}
};
(source, timeline) -> externalCallerMediaSourceReference.set(source);
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
shadowOf(Looper.getMainLooper()).idle();
@ -364,29 +359,29 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle();
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onTimelineRefreshedCalled.get()).isFalse();
assertThat(onPreparedCalled.get()).isFalse();
assertThat(onSourcePreparedCalled.get()).isFalse();
assertThat(onTracksSelectedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isTrue();
}
@Test
public void preload_loadToTheEndOfSource() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean();
AtomicBoolean onPreparedCalled = new AtomicBoolean();
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
AtomicBoolean onLoadedToTheEndOfSourceCalled = new AtomicBoolean();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return true;
}
@ -437,8 +432,8 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onLoadedToTheEndOfSourceCalled::get);
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onPreparedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(onTracksSelectedCalled.get()).isTrue();
assertThat(onContinueLoadingRequestedCalled.get()).isTrue();
assertThat(onUsedByPlayerCalled.get()).isFalse();
}
@ -446,20 +441,20 @@ public final class PreloadMediaSourceTest {
@Test
public void
prepareSource_beforeSourceInfoRefreshedForPreloading_onlyInvokeExternalCallerOnSourceInfoRefreshed() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
AtomicBoolean onPreparedCalled = new AtomicBoolean(false);
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean(false);
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return true;
}
@ -497,39 +492,34 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle();
AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerMediaSourceReference.set(source);
}
};
(source, timeline) -> externalCallerMediaSourceReference.set(source);
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
wrappedMediaSource.setAllowPreparation(true);
shadowOf(Looper.getMainLooper()).idle();
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onTimelineRefreshedCalled.get()).isFalse();
assertThat(onPreparedCalled.get()).isFalse();
assertThat(onSourcePreparedCalled.get()).isFalse();
assertThat(onTracksSelectedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isTrue();
}
@Test
public void prepareSource_afterPreload_immediatelyInvokeExternalCallerOnSourceInfoRefreshed() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
AtomicBoolean onPreparedCalled = new AtomicBoolean(false);
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean(false);
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return true;
}
@ -566,17 +556,12 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle();
AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerMediaSourceReference.set(source);
}
};
(source, timeline) -> externalCallerMediaSourceReference.set(source);
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onPreparedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(onTracksSelectedCalled.get()).isTrue();
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onUsedByPlayerCalled.get()).isTrue();
}
@ -584,17 +569,17 @@ public final class PreloadMediaSourceTest {
@Test
public void createPeriodWithSameMediaPeriodIdAndStartPosition_returnExistingPeriod()
throws Exception {
AtomicBoolean onPreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return false;
}
@ -668,12 +653,7 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle();
AtomicReference<Timeline> externalCallerSourceInfoTimelineReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoTimelineReference.set(timeline);
}
};
(source, timeline) -> externalCallerSourceInfoTimelineReference.set(timeline);
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
Pair<Object, Long> periodPosition =
@ -687,24 +667,24 @@ public final class PreloadMediaSourceTest {
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(periodPosition.first);
preloadMediaSource.createPeriod(mediaPeriodId, allocator, periodPosition.second);
assertThat(onPreparedCalled.get()).isTrue();
assertThat(onTracksSelectedCalled.get()).isTrue();
verify(internalSourceReference.get()).createPeriod(any(), any(), anyLong());
}
@Test
public void createPeriodWithSameMediaPeriodIdAndDifferentStartPosition_returnNewPeriod()
throws Exception {
AtomicBoolean onPreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return false;
}
@ -778,12 +758,7 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle();
AtomicReference<Timeline> externalCallerSourceInfoTimelineReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoTimelineReference.set(timeline);
}
};
(source, timeline) -> externalCallerSourceInfoTimelineReference.set(timeline);
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
// Create a period from different position.
@ -798,23 +773,23 @@ public final class PreloadMediaSourceTest {
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(periodPosition.first);
preloadMediaSource.createPeriod(mediaPeriodId, allocator, periodPosition.second);
assertThat(onPreparedCalled.get()).isTrue();
assertThat(onTracksSelectedCalled.get()).isTrue();
verify(internalSourceReference.get(), times(2)).createPeriod(any(), any(), anyLong());
}
@Test
public void clear_preloadingPeriodReleased() throws Exception {
AtomicBoolean onPreparedCalled = new AtomicBoolean();
AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true);
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onTracksSelectedCalled.set(true);
return false;
}
@ -871,7 +846,7 @@ public final class PreloadMediaSourceTest {
.setUri(Uri.parse("asset://android_asset/media/mp4/sample.mp4"))
.build());
preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onPreparedCalled::get);
runMainLooperUntil(onTracksSelectedCalled::get);
preloadMediaSource.clear();
shadowOf(Looper.getMainLooper()).idle();
@ -884,12 +859,12 @@ public final class PreloadMediaSourceTest {
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return false;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false;
}
@ -940,12 +915,7 @@ public final class PreloadMediaSourceTest {
.build());
AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoRefreshedCalled.set(true);
}
};
(source, timeline) -> externalCallerSourceInfoRefreshedCalled.set(true);
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
shadowOf(Looper.getMainLooper()).idle();
@ -959,17 +929,17 @@ public final class PreloadMediaSourceTest {
@Test
public void releaseSourceByAllExternalCallers_stillPreloading_notReleaseInternalSource() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return true;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return true;
}
@ -1020,19 +990,14 @@ public final class PreloadMediaSourceTest {
.build());
AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoRefreshedCalled.set(true);
}
};
(source, timeline) -> externalCallerSourceInfoRefreshedCalled.set(true);
preloadMediaSource.preload(/* startPositionUs= */ 0L);
shadowOf(Looper.getMainLooper()).idle();
preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
preloadMediaSource.releaseSource(externalCaller);
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(externalCallerSourceInfoRefreshedCalled.get()).isTrue();
MediaSource internalSource = internalSourceReference.get();
assertThat(internalSource).isNotNull();
@ -1045,12 +1010,12 @@ public final class PreloadMediaSourceTest {
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return false;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false;
}
@ -1102,19 +1067,9 @@ public final class PreloadMediaSourceTest {
AtomicBoolean externalCaller1SourceInfoRefreshedCalled = new AtomicBoolean();
AtomicBoolean externalCaller2SourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller1 =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCaller1SourceInfoRefreshedCalled.set(true);
}
};
(source, timeline) -> externalCaller1SourceInfoRefreshedCalled.set(true);
MediaSource.MediaSourceCaller externalCaller2 =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCaller2SourceInfoRefreshedCalled.set(true);
}
};
(source, timeline) -> externalCaller2SourceInfoRefreshedCalled.set(true);
preloadMediaSource.prepareSource(
externalCaller1, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
preloadMediaSource.prepareSource(
@ -1131,17 +1086,17 @@ public final class PreloadMediaSourceTest {
@Test
public void releasePreloadMediaSource_notUsedByExternalCallers_releaseInternalSource() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return false;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false;
}
@ -1195,7 +1150,7 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.releasePreloadMediaSource();
shadowOf(Looper.getMainLooper()).idle();
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
MediaSource internalSource = internalSourceReference.get();
assertThat(internalSource).isNotNull();
verify(internalSource).releaseSource(any());
@ -1203,17 +1158,17 @@ public final class PreloadMediaSourceTest {
@Test
public void releasePreloadMediaSource_stillUsedByExternalCallers_releaseInternalSource() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() {
@Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true);
public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onSourcePreparedCalled.set(true);
return false;
}
@Override
public boolean onPrepared(PreloadMediaSource mediaSource) {
public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false;
}
@ -1264,12 +1219,7 @@ public final class PreloadMediaSourceTest {
.build());
AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoRefreshedCalled.set(true);
}
};
(source, timeline) -> externalCallerSourceInfoRefreshedCalled.set(true);
preloadMediaSource.preload(/* startPositionUs= */ 0L);
shadowOf(Looper.getMainLooper()).idle();
preloadMediaSource.prepareSource(
@ -1278,7 +1228,7 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.releasePreloadMediaSource();
shadowOf(Looper.getMainLooper()).idle();
assertThat(onTimelineRefreshedCalled.get()).isTrue();
assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(externalCallerSourceInfoRefreshedCalled.get()).isTrue();
MediaSource internalSource = internalSourceReference.get();
assertThat(internalSource).isNotNull();