diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java index bf8c963413..4ec1f61bc5 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java @@ -49,6 +49,7 @@ import androidx.media3.exoplayer.source.TrackGroupArray; import androidx.media3.exoplayer.upstream.Allocator; import androidx.media3.test.utils.FakeMediaPeriod.TrackDataFactory; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -106,6 +107,7 @@ public class FakeMediaSource extends BaseMediaSource { private boolean releasedSource; @Nullable private Handler sourceInfoRefreshHandler; @Nullable private TransferListener transferListener; + private boolean periodDefersOnPreparedCallback; /** Creates a {@link FakeMediaSource} with a default {@link FakeTimeline}. */ public FakeMediaSource() { @@ -359,6 +361,27 @@ public class FakeMediaSource extends BaseMediaSource { return createdMediaPeriods; } + /** + * Sets whether the created {@link FakeMediaPeriod period} should defer to call {@link + * MediaPeriod.Callback#onPrepared(MediaPeriod)}. If set to true, {@link + * MediaPeriod.Callback#onPrepared(MediaPeriod)} should be called only after {@link + * FakeMediaPeriod#setPreparationComplete()} has been called, otherwise the preparation completes + * immediately. + */ + public void setPeriodDefersOnPreparedCallback(boolean periodDefersOnPreparedCallback) { + this.periodDefersOnPreparedCallback = periodDefersOnPreparedCallback; + } + + /** + * Returns the last created active {@link MediaPeriod}. + * + *

Must only be called if the source has created at least one period and it hasn't been + * released. + */ + public MediaPeriod getLastCreatedActiveMediaPeriod() { + return Iterables.getLast(activeMediaPeriods); + } + /** * Creates a {@link MediaPeriod} for this media source. * @@ -372,7 +395,7 @@ public class FakeMediaSource extends BaseMediaSource { * events. * @param transferListener The transfer listener which should be informed of any data transfers. * May be null if no listener is available. - * @return A new {@link FakeMediaPeriod}. + * @return A new {@link MediaPeriod}. */ @RequiresNonNull("this.timeline") protected MediaPeriod createMediaPeriod( @@ -395,7 +418,7 @@ public class FakeMediaSource extends BaseMediaSource { mediaSourceEventDispatcher, drmSessionManager, drmEventDispatcher, - /* deferOnPrepared= */ false); + periodDefersOnPreparedCallback); } /**