Commit c3d67311 by tonihei Committed by Oliver Woodman

Add clear method to ConcatenatingMediaSource.

This simplifies clearing a playlist without having to call removeMediaSource
repeatedly. It will also update the timeline only once.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=187863857
parent 3eaab9e2
......@@ -50,8 +50,9 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
private static final int MSG_ADD_MULTIPLE = 1;
private static final int MSG_REMOVE = 2;
private static final int MSG_MOVE = 3;
private static final int MSG_NOTIFY_LISTENER = 4;
private static final int MSG_ON_COMPLETION = 5;
private static final int MSG_CLEAR = 4;
private static final int MSG_NOTIFY_LISTENER = 5;
private static final int MSG_ON_COMPLETION = 6;
// Accessed on the app thread.
private final List<MediaSource> mediaSourcesPublic;
......@@ -333,6 +334,30 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
}
}
/** Clears the playlist. */
public final synchronized void clear() {
clear(/* actionOnCompletion= */ null);
}
/**
* Clears the playlist and executes a custom action on completion.
*
* @param actionOnCompletion A {@link Runnable} which is executed immediately after the playlist
* has been cleared.
*/
public final synchronized void clear(@Nullable Runnable actionOnCompletion) {
mediaSourcesPublic.clear();
if (player != null) {
player
.createMessage(this)
.setType(MSG_CLEAR)
.setPayload(actionOnCompletion != null ? new EventDispatcher(actionOnCompletion) : null)
.send();
} else if (actionOnCompletion != null) {
actionOnCompletion.run();
}
}
/** Returns the number of media sources in the playlist. */
public final synchronized int getSize() {
return mediaSourcesPublic.size();
......@@ -445,6 +470,10 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
moveMediaSourceInternal(moveMessage.index, moveMessage.customData);
scheduleListenerNotification(moveMessage.actionOnCompletion);
break;
case MSG_CLEAR:
clearInternal();
scheduleListenerNotification((EventDispatcher) message);
break;
case MSG_NOTIFY_LISTENER:
notifyListener();
break;
......@@ -545,9 +574,14 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
scheduleListenerNotification(/* actionOnCompletion= */ null);
}
private void clearInternal() {
for (int index = mediaSourceHolders.size() - 1; index >= 0; index--) {
removeMediaSourceInternal(index);
}
}
private void removeMediaSourceInternal(int index) {
MediaSourceHolder holder = mediaSourceHolders.get(index);
mediaSourceHolders.remove(index);
MediaSourceHolder holder = mediaSourceHolders.remove(index);
Timeline oldTimeline = holder.timeline;
correctOffsets(
index,
......
......@@ -820,6 +820,37 @@ public final class ConcatenatingMediaSourceTest {
childSource.assertReleased();
}
@Test
public void testClear() throws IOException {
DummyMainThread dummyMainThread = new DummyMainThread();
final FakeMediaSource preparedChildSource = createFakeMediaSource();
final FakeMediaSource unpreparedChildSource =
new FakeMediaSource(/* timeline= */ null, /* manifest= */ null);
dummyMainThread.runOnMainThread(
new Runnable() {
@Override
public void run() {
mediaSource.addMediaSource(preparedChildSource);
mediaSource.addMediaSource(unpreparedChildSource);
}
});
testRunner.prepareSource();
final TimelineGrabber timelineGrabber = new TimelineGrabber(testRunner);
dummyMainThread.runOnMainThread(
new Runnable() {
@Override
public void run() {
mediaSource.clear(timelineGrabber);
}
});
Timeline timeline = timelineGrabber.assertTimelineChangeBlocking();
assertThat(timeline.isEmpty()).isTrue();
preparedChildSource.assertReleased();
unpreparedChildSource.assertReleased();
}
private static FakeMediaSource[] createMediaSources(int count) {
FakeMediaSource[] sources = new FakeMediaSource[count];
for (int i = 0; i < count; i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment