Commit 22f8ee37 by tonihei Committed by Oliver Woodman

Clean-up of player message handling.

Some readability fixes for PlayerMessage and the handling in
ExoPlayerImplInternal.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=180544294
parent 884f6401
...@@ -122,7 +122,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { ...@@ -122,7 +122,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase {
player player
.createMessage(videoRenderer) .createMessage(videoRenderer)
.setType(LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER) .setType(LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER)
.setMessage(new VpxVideoSurfaceView(context)) .setPayload(new VpxVideoSurfaceView(context))
.send(); .send();
player.prepare(mediaSource); player.prepare(mediaSource);
player.setPlayWhenReady(true); player.setPlayWhenReady(true);
......
...@@ -217,7 +217,7 @@ public interface ExoPlayer extends Player { ...@@ -217,7 +217,7 @@ public interface ExoPlayer extends Player {
/** /**
* Creates a message that can be sent to a {@link PlayerMessage.Target}. By default, the message * Creates a message that can be sent to a {@link PlayerMessage.Target}. By default, the message
* will be delivered immediately without blocking on the playback thread. The default {@link * will be delivered immediately without blocking on the playback thread. The default {@link
* PlayerMessage#getType()} is 0 and the default {@link PlayerMessage#getMessage()} is null. If a * PlayerMessage#getType()} is 0 and the default {@link PlayerMessage#getPayload()} is null. If a
* position is specified with {@link PlayerMessage#setPosition(long)}, the message will be * position is specified with {@link PlayerMessage#setPosition(long)}, the message will be
* delivered at this position in the current window defined by {@link #getCurrentWindowIndex()}. * delivered at this position in the current window defined by {@link #getCurrentWindowIndex()}.
* Alternatively, the message can be sent at a specific window using {@link * Alternatively, the message can be sent at a specific window using {@link
......
...@@ -336,7 +336,7 @@ import java.util.concurrent.CopyOnWriteArraySet; ...@@ -336,7 +336,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
@Override @Override
public void sendMessages(ExoPlayerMessage... messages) { public void sendMessages(ExoPlayerMessage... messages) {
for (ExoPlayerMessage message : messages) { for (ExoPlayerMessage message : messages) {
createMessage(message.target).setType(message.messageType).setMessage(message.message).send(); createMessage(message.target).setType(message.messageType).setPayload(message.message).send();
} }
} }
...@@ -357,7 +357,7 @@ import java.util.concurrent.CopyOnWriteArraySet; ...@@ -357,7 +357,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
playerMessages.add( playerMessages.add(
createMessage(message.target) createMessage(message.target)
.setType(message.messageType) .setType(message.messageType)
.setMessage(message.message) .setPayload(message.message)
.send()); .send());
} }
boolean wasInterrupted = false; boolean wasInterrupted = false;
......
...@@ -79,6 +79,7 @@ import java.util.Collections; ...@@ -79,6 +79,7 @@ import java.util.Collections;
private static final int MSG_CUSTOM = 12; private static final int MSG_CUSTOM = 12;
private static final int MSG_SET_REPEAT_MODE = 13; private static final int MSG_SET_REPEAT_MODE = 13;
private static final int MSG_SET_SHUFFLE_ENABLED = 14; private static final int MSG_SET_SHUFFLE_ENABLED = 14;
private static final int MSG_SEND_MESSAGE_TO_TARGET = 15;
private static final int PREPARING_SOURCE_INTERVAL_MS = 10; private static final int PREPARING_SOURCE_INTERVAL_MS = 10;
private static final int RENDERING_INTERVAL_MS = 10; private static final int RENDERING_INTERVAL_MS = 10;
...@@ -223,14 +224,13 @@ import java.util.Collections; ...@@ -223,14 +224,13 @@ import java.util.Collections;
} }
@Override @Override
public synchronized void sendMessage( public synchronized void sendMessage(PlayerMessage message) {
PlayerMessage message, PlayerMessage.Sender.Listener listener) {
if (released) { if (released) {
Log.w(TAG, "Ignoring messages sent after release."); Log.w(TAG, "Ignoring messages sent after release.");
listener.onMessageDeleted(); message.markAsProcessed(/* isDelivered= */ false);
return; return;
} }
handler.obtainMessage(MSG_CUSTOM, new CustomMessageInfo(message, listener)).sendToTarget(); handler.obtainMessage(MSG_CUSTOM, message).sendToTarget();
} }
public synchronized void release() { public synchronized void release() {
...@@ -338,7 +338,10 @@ import java.util.Collections; ...@@ -338,7 +338,10 @@ import java.util.Collections;
reselectTracksInternal(); reselectTracksInternal();
break; break;
case MSG_CUSTOM: case MSG_CUSTOM:
sendMessageInternal((CustomMessageInfo) msg.obj); sendMessageInternal((PlayerMessage) msg.obj);
break;
case MSG_SEND_MESSAGE_TO_TARGET:
sendCustomMessageToTargetThread((PlayerMessage) msg.obj);
break; break;
case MSG_RELEASE: case MSG_RELEASE:
releaseInternal(); releaseInternal();
...@@ -838,7 +841,7 @@ import java.util.Collections; ...@@ -838,7 +841,7 @@ import java.util.Collections;
if (resetState) { if (resetState) {
mediaPeriodInfoSequence.setTimeline(null); mediaPeriodInfoSequence.setTimeline(null);
for (CustomMessageInfo customMessageInfo : customMessageInfos) { for (CustomMessageInfo customMessageInfo : customMessageInfos) {
customMessageInfo.listener.onMessageDeleted(); customMessageInfo.message.markAsProcessed(/* isDelivered= */ false);
} }
customMessageInfos.clear(); customMessageInfos.clear();
nextCustomMessageInfoIndex = 0; nextCustomMessageInfoIndex = 0;
...@@ -862,58 +865,54 @@ import java.util.Collections; ...@@ -862,58 +865,54 @@ import java.util.Collections;
} }
} }
private void sendMessageInternal(CustomMessageInfo customMessageInfo) { private void sendMessageInternal(PlayerMessage message) {
if (customMessageInfo.message.getPositionMs() == C.TIME_UNSET) { if (message.getPositionMs() == C.TIME_UNSET) {
// If no delivery time is specified, trigger immediate message delivery. // If no delivery time is specified, trigger immediate message delivery.
sendCustomMessagesToTarget(customMessageInfo); sendCustomMessageToTarget(message);
} else if (playbackInfo.timeline == null) { } else if (playbackInfo.timeline == null) {
// Still waiting for initial timeline to resolve position. // Still waiting for initial timeline to resolve position.
customMessageInfos.add(customMessageInfo); customMessageInfos.add(new CustomMessageInfo(message));
} else { } else {
CustomMessageInfo customMessageInfo = new CustomMessageInfo(message);
if (resolveCustomMessagePosition(customMessageInfo)) { if (resolveCustomMessagePosition(customMessageInfo)) {
customMessageInfos.add(customMessageInfo); customMessageInfos.add(customMessageInfo);
// Ensure new message is inserted according to playback order. // Ensure new message is inserted according to playback order.
Collections.sort(customMessageInfos); Collections.sort(customMessageInfos);
} else { } else {
customMessageInfo.listener.onMessageDeleted(); message.markAsProcessed(/* isDelivered= */ false);
} }
} }
} }
private void sendCustomMessagesToTarget(final CustomMessageInfo customMessageInfo) { private void sendCustomMessageToTarget(PlayerMessage message) {
final Runnable handleMessageRunnable = if (message.getHandler().getLooper() == handler.getLooper()) {
new Runnable() { deliverCustomMessage(message);
@Override // The message may have caused something to change that now requires us to do work.
public void run() { handler.sendEmptyMessage(MSG_DO_SOME_WORK);
try {
customMessageInfo
.message
.getTarget()
.handleMessage(
customMessageInfo.message.getType(), customMessageInfo.message.getMessage());
} catch (ExoPlaybackException e) {
eventHandler.obtainMessage(MSG_ERROR, e).sendToTarget();
} finally {
customMessageInfo.listener.onMessageDelivered();
if (customMessageInfo.message.getDeleteAfterDelivery()) {
customMessageInfo.listener.onMessageDeleted();
}
// The message may have caused something to change that now requires us to do
// work.
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
}
}
};
if (customMessageInfo.message.getHandler().getLooper() == handler.getLooper()) {
handleMessageRunnable.run();
} else { } else {
handler.post( handler.obtainMessage(MSG_SEND_MESSAGE_TO_TARGET, message).sendToTarget();
new Runnable() { }
@Override }
public void run() {
customMessageInfo.message.getHandler().post(handleMessageRunnable); private void sendCustomMessageToTargetThread(final PlayerMessage message) {
} message
}); .getHandler()
.post(
new Runnable() {
@Override
public void run() {
deliverCustomMessage(message);
}
});
}
private void deliverCustomMessage(PlayerMessage message) {
try {
message.getTarget().handleMessage(message.getType(), message.getPayload());
} catch (ExoPlaybackException e) {
eventHandler.obtainMessage(MSG_ERROR, e).sendToTarget();
} finally {
message.markAsProcessed(/* isDelivered= */ true);
} }
} }
...@@ -921,7 +920,7 @@ import java.util.Collections; ...@@ -921,7 +920,7 @@ import java.util.Collections;
for (int i = customMessageInfos.size() - 1; i >= 0; i--) { for (int i = customMessageInfos.size() - 1; i >= 0; i--) {
if (!resolveCustomMessagePosition(customMessageInfos.get(i))) { if (!resolveCustomMessagePosition(customMessageInfos.get(i))) {
// Remove messages if new position can't be resolved. // Remove messages if new position can't be resolved.
customMessageInfos.get(i).listener.onMessageDeleted(); customMessageInfos.get(i).message.markAsProcessed(/* isDelivered= */ false);
customMessageInfos.remove(i); customMessageInfos.remove(i);
} }
} }
...@@ -1003,7 +1002,7 @@ import java.util.Collections; ...@@ -1003,7 +1002,7 @@ import java.util.Collections;
&& nextInfo.resolvedPeriodIndex == currentPeriodIndex && nextInfo.resolvedPeriodIndex == currentPeriodIndex
&& nextInfo.resolvedPeriodTimeUs > oldPeriodPositionUs && nextInfo.resolvedPeriodTimeUs > oldPeriodPositionUs
&& nextInfo.resolvedPeriodTimeUs <= newPeriodPositionUs) { && nextInfo.resolvedPeriodTimeUs <= newPeriodPositionUs) {
sendCustomMessagesToTarget(nextInfo); sendCustomMessageToTarget(nextInfo.message);
if (nextInfo.message.getDeleteAfterDelivery()) { if (nextInfo.message.getDeleteAfterDelivery()) {
customMessageInfos.remove(nextCustomMessageInfoIndex); customMessageInfos.remove(nextCustomMessageInfoIndex);
} else { } else {
...@@ -1942,15 +1941,13 @@ import java.util.Collections; ...@@ -1942,15 +1941,13 @@ import java.util.Collections;
private static final class CustomMessageInfo implements Comparable<CustomMessageInfo> { private static final class CustomMessageInfo implements Comparable<CustomMessageInfo> {
public final PlayerMessage message; public final PlayerMessage message;
public final PlayerMessage.Sender.Listener listener;
public int resolvedPeriodIndex; public int resolvedPeriodIndex;
public long resolvedPeriodTimeUs; public long resolvedPeriodTimeUs;
public @Nullable Object resolvedPeriodUid; public @Nullable Object resolvedPeriodUid;
public CustomMessageInfo(PlayerMessage message, PlayerMessage.Sender.Listener listener) { public CustomMessageInfo(PlayerMessage message) {
this.message = message; this.message = message;
this.listener = listener;
} }
public void setResolvedPosition(int periodIndex, long periodTimeUs, Object periodUid) { public void setResolvedPosition(int periodIndex, long periodTimeUs, Object periodUid) {
......
...@@ -32,32 +32,21 @@ public final class PlayerMessage { ...@@ -32,32 +32,21 @@ public final class PlayerMessage {
* Handles a message delivered to the target. * Handles a message delivered to the target.
* *
* @param messageType The message type. * @param messageType The message type.
* @param message The message. * @param payload The message payload.
* @throws ExoPlaybackException If an error occurred whilst handling the message. * @throws ExoPlaybackException If an error occurred whilst handling the message.
*/ */
void handleMessage(int messageType, Object message) throws ExoPlaybackException; void handleMessage(int messageType, Object payload) throws ExoPlaybackException;
} }
/** A sender for messages. */ /** A sender for messages. */
public interface Sender { public interface Sender {
/** A listener for message events triggered by the sender. */
interface Listener {
/** Called when the message has been delivered. */
void onMessageDelivered();
/** Called when the message has been deleted. */
void onMessageDeleted();
}
/** /**
* Sends a message. * Sends a message.
* *
* @param message The message to be sent. * @param message The message to be sent.
* @param listener The listener to listen to message events.
*/ */
void sendMessage(PlayerMessage message, Listener listener); void sendMessage(PlayerMessage message);
} }
private final Target target; private final Target target;
...@@ -65,14 +54,14 @@ public final class PlayerMessage { ...@@ -65,14 +54,14 @@ public final class PlayerMessage {
private final Timeline timeline; private final Timeline timeline;
private int type; private int type;
private Object message; private Object payload;
private Handler handler; private Handler handler;
private int windowIndex; private int windowIndex;
private long positionMs; private long positionMs;
private boolean deleteAfterDelivery; private boolean deleteAfterDelivery;
private boolean isSent; private boolean isSent;
private boolean isDelivered; private boolean isDelivered;
private boolean isDeleted; private boolean isProcessed;
/** /**
* Creates a new message. * Creates a new message.
...@@ -112,9 +101,9 @@ public final class PlayerMessage { ...@@ -112,9 +101,9 @@ public final class PlayerMessage {
} }
/** /**
* Sets a custom message type forwarded to the {@link Target#handleMessage(int, Object)}. * Sets the message type forwarded to {@link Target#handleMessage(int, Object)}.
* *
* @param messageType The custom message type. * @param messageType The message type.
* @return This message. * @return This message.
* @throws IllegalStateException If {@link #send()} has already been called. * @throws IllegalStateException If {@link #send()} has already been called.
*/ */
...@@ -124,27 +113,27 @@ public final class PlayerMessage { ...@@ -124,27 +113,27 @@ public final class PlayerMessage {
return this; return this;
} }
/** Returns custom message type forwarded to the {@link Target#handleMessage(int, Object)}. */ /** Returns the message type forwarded to {@link Target#handleMessage(int, Object)}. */
public int getType() { public int getType() {
return type; return type;
} }
/** /**
* Sets a custom message forwarded to the {@link Target#handleMessage(int, Object)}. * Sets the message payload forwarded to {@link Target#handleMessage(int, Object)}.
* *
* @param message The custom message. * @param payload The message payload.
* @return This message. * @return This message.
* @throws IllegalStateException If {@link #send()} has already been called. * @throws IllegalStateException If {@link #send()} has already been called.
*/ */
public PlayerMessage setMessage(@Nullable Object message) { public PlayerMessage setPayload(@Nullable Object payload) {
Assertions.checkState(!isSent); Assertions.checkState(!isSent);
this.message = message; this.payload = payload;
return this; return this;
} }
/** Returns custom message forwarded to the {@link Target#handleMessage(int, Object)}. */ /** Returns the message payload forwarded to {@link Target#handleMessage(int, Object)}. */
public Object getMessage() { public Object getPayload() {
return message; return payload;
} }
/** /**
...@@ -248,25 +237,7 @@ public final class PlayerMessage { ...@@ -248,25 +237,7 @@ public final class PlayerMessage {
Assertions.checkArgument(deleteAfterDelivery); Assertions.checkArgument(deleteAfterDelivery);
} }
isSent = true; isSent = true;
sender.sendMessage( sender.sendMessage(this);
this,
new Sender.Listener() {
@Override
public void onMessageDelivered() {
synchronized (PlayerMessage.this) {
isDelivered = true;
PlayerMessage.this.notifyAll();
}
}
@Override
public void onMessageDeleted() {
synchronized (PlayerMessage.this) {
isDeleted = true;
PlayerMessage.this.notifyAll();
}
}
});
return this; return this;
} }
...@@ -287,9 +258,23 @@ public final class PlayerMessage { ...@@ -287,9 +258,23 @@ public final class PlayerMessage {
public synchronized boolean blockUntilDelivered() throws InterruptedException { public synchronized boolean blockUntilDelivered() throws InterruptedException {
Assertions.checkState(isSent); Assertions.checkState(isSent);
Assertions.checkState(handler.getLooper().getThread() != Thread.currentThread()); Assertions.checkState(handler.getLooper().getThread() != Thread.currentThread());
while (!isDelivered && !isDeleted) { while (!isProcessed) {
wait(); wait();
} }
return isDelivered; return isDelivered;
} }
/**
* Marks the message as processed. Should only be called by a {@link Sender} and may be called
* multiple times.
*
* @param isDelivered Whether the message has been delivered to its target. The message is
* considered as being delivered when this method has been called with {@code isDelivered} set
* to true at least once.
*/
public synchronized void markAsProcessed(boolean isDelivered) {
this.isDelivered |= isDelivered;
isProcessed = true;
notifyAll();
}
} }
...@@ -41,6 +41,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelector; ...@@ -41,6 +41,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.android.exoplayer2.video.VideoRendererEventListener; import com.google.android.exoplayer2.video.VideoRendererEventListener;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
...@@ -168,7 +169,7 @@ public class SimpleExoPlayer implements ExoPlayer { ...@@ -168,7 +169,7 @@ public class SimpleExoPlayer implements ExoPlayer {
player player
.createMessage(renderer) .createMessage(renderer)
.setType(C.MSG_SET_SCALING_MODE) .setType(C.MSG_SET_SCALING_MODE)
.setMessage(videoScalingMode) .setPayload(videoScalingMode)
.send(); .send();
} }
} }
...@@ -357,7 +358,7 @@ public class SimpleExoPlayer implements ExoPlayer { ...@@ -357,7 +358,7 @@ public class SimpleExoPlayer implements ExoPlayer {
player player
.createMessage(renderer) .createMessage(renderer)
.setType(C.MSG_SET_AUDIO_ATTRIBUTES) .setType(C.MSG_SET_AUDIO_ATTRIBUTES)
.setMessage(audioAttributes) .setPayload(audioAttributes)
.send(); .send();
} }
} }
...@@ -379,7 +380,7 @@ public class SimpleExoPlayer implements ExoPlayer { ...@@ -379,7 +380,7 @@ public class SimpleExoPlayer implements ExoPlayer {
this.audioVolume = audioVolume; this.audioVolume = audioVolume;
for (Renderer renderer : renderers) { for (Renderer renderer : renderers) {
if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) {
player.createMessage(renderer).setType(C.MSG_SET_VOLUME).setMessage(audioVolume).send(); player.createMessage(renderer).setType(C.MSG_SET_VOLUME).setPayload(audioVolume).send();
} }
} }
} }
...@@ -911,21 +912,22 @@ public class SimpleExoPlayer implements ExoPlayer { ...@@ -911,21 +912,22 @@ public class SimpleExoPlayer implements ExoPlayer {
private void setVideoSurfaceInternal(Surface surface, boolean ownsSurface) { private void setVideoSurfaceInternal(Surface surface, boolean ownsSurface) {
// Note: We don't turn this method into a no-op if the surface is being replaced with itself // Note: We don't turn this method into a no-op if the surface is being replaced with itself
// so as to ensure onRenderedFirstFrame callbacks are still called in this case. // so as to ensure onRenderedFirstFrame callbacks are still called in this case.
boolean surfaceReplaced = this.surface != null && this.surface != surface; List<PlayerMessage> messages = new ArrayList<>();
for (Renderer renderer : renderers) { for (Renderer renderer : renderers) {
if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) {
PlayerMessage message = messages.add(
player.createMessage(renderer).setType(C.MSG_SET_SURFACE).setMessage(surface).send(); player.createMessage(renderer).setType(C.MSG_SET_SURFACE).setPayload(surface).send());
if (surfaceReplaced) {
try {
message.blockUntilDelivered();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
} }
} }
if (surfaceReplaced) { if (this.surface != null && this.surface != surface) {
// We're replacing a surface. Block to ensure that it's not accessed after the method returns.
try {
for (PlayerMessage message : messages) {
message.blockUntilDelivered();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// If we created the previous surface, we are responsible for releasing it. // If we created the previous surface, we are responsible for releasing it.
if (this.ownsSurface) { if (this.ownsSurface) {
this.surface.release(); this.surface.release();
......
...@@ -149,7 +149,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe ...@@ -149,7 +149,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
player player
.createMessage(this) .createMessage(this)
.setType(MSG_ADD) .setType(MSG_ADD)
.setMessage(new MessageData<>(index, mediaSource, actionOnCompletion)) .setPayload(new MessageData<>(index, mediaSource, actionOnCompletion))
.send(); .send();
} else if (actionOnCompletion != null) { } else if (actionOnCompletion != null) {
actionOnCompletion.run(); actionOnCompletion.run();
...@@ -225,7 +225,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe ...@@ -225,7 +225,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
player player
.createMessage(this) .createMessage(this)
.setType(MSG_ADD_MULTIPLE) .setType(MSG_ADD_MULTIPLE)
.setMessage(new MessageData<>(index, mediaSources, actionOnCompletion)) .setPayload(new MessageData<>(index, mediaSources, actionOnCompletion))
.send(); .send();
} else if (actionOnCompletion != null){ } else if (actionOnCompletion != null){
actionOnCompletion.run(); actionOnCompletion.run();
...@@ -264,7 +264,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe ...@@ -264,7 +264,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
player player
.createMessage(this) .createMessage(this)
.setType(MSG_REMOVE) .setType(MSG_REMOVE)
.setMessage(new MessageData<>(index, null, actionOnCompletion)) .setPayload(new MessageData<>(index, null, actionOnCompletion))
.send(); .send();
} else if (actionOnCompletion != null) { } else if (actionOnCompletion != null) {
actionOnCompletion.run(); actionOnCompletion.run();
...@@ -304,7 +304,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe ...@@ -304,7 +304,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
player player
.createMessage(this) .createMessage(this)
.setType(MSG_MOVE) .setType(MSG_MOVE)
.setMessage(new MessageData<>(currentIndex, newIndex, actionOnCompletion)) .setPayload(new MessageData<>(currentIndex, newIndex, actionOnCompletion))
.send(); .send();
} else if (actionOnCompletion != null) { } else if (actionOnCompletion != null) {
actionOnCompletion.run(); actionOnCompletion.run();
...@@ -438,7 +438,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe ...@@ -438,7 +438,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
new ConcatenatedTimeline(mediaSourceHolders, windowCount, periodCount, shuffleOrder), new ConcatenatedTimeline(mediaSourceHolders, windowCount, periodCount, shuffleOrder),
null); null);
if (actionOnCompletion != null) { if (actionOnCompletion != null) {
player.createMessage(this).setType(MSG_ON_COMPLETION).setMessage(actionOnCompletion).send(); player.createMessage(this).setType(MSG_ON_COMPLETION).setPayload(actionOnCompletion).send();
} }
} }
} }
......
...@@ -24,7 +24,6 @@ import android.os.Handler; ...@@ -24,7 +24,6 @@ import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.util.Pair;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.PlayerMessage;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
...@@ -299,22 +298,17 @@ public class MediaSourceTestRunner { ...@@ -299,22 +298,17 @@ public class MediaSourceTestRunner {
} }
@Override @Override
public void sendMessage(PlayerMessage message, Listener listener) { public void sendMessage(PlayerMessage message) {
handler.obtainMessage(0, Pair.create(message, listener)).sendToTarget(); handler.obtainMessage(0, message).sendToTarget();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public boolean handleMessage(Message msg) { public boolean handleMessage(Message msg) {
Pair<PlayerMessage, Listener> messageAndListener = (Pair<PlayerMessage, Listener>) msg.obj; PlayerMessage message = (PlayerMessage) msg.obj;
try { try {
messageAndListener message.getTarget().handleMessage(message.getType(), message.getPayload());
.first message.markAsProcessed(/* isDelivered= */ true);
.getTarget()
.handleMessage(
messageAndListener.first.getType(), messageAndListener.first.getMessage());
messageAndListener.second.onMessageDelivered();
messageAndListener.second.onMessageDeleted();
} catch (ExoPlaybackException e) { } catch (ExoPlaybackException e) {
fail("Unexpected ExoPlaybackException."); fail("Unexpected ExoPlaybackException.");
} }
......
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