Implement getCurrentTracks in MediaController

After this change the current tracks are sent to the controller as part of
`PlayerInfo` and call `Listener.onTracksChanged()` in case of a change in tracks.

PiperOrigin-RevId: 461578695
This commit is contained in:
bachinger 2022-07-18 10:47:57 +00:00 committed by Rohit Singh
parent 5c2aabca66
commit 9a895cd18f
14 changed files with 198 additions and 19 deletions

View File

@ -1677,7 +1677,8 @@ public class MediaController implements Player {
@Override
public Tracks getCurrentTracks() {
return Tracks.EMPTY; // TODO(b/178486745)
verifyApplicationThread();
return isConnected() ? impl.getCurrentTracks() : Tracks.EMPTY;
}
@Override
@ -2010,6 +2011,8 @@ public class MediaController implements Player {
Commands getAvailableCommands();
Tracks getCurrentTracks();
TrackSelectionParameters getTrackSelectionParameters();
void setTrackSelectionParameters(TrackSelectionParameters parameters);

View File

@ -57,6 +57,7 @@ import static androidx.media3.common.Player.EVENT_SEEK_BACK_INCREMENT_CHANGED;
import static androidx.media3.common.Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED;
import static androidx.media3.common.Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED;
import static androidx.media3.common.Player.EVENT_TIMELINE_CHANGED;
import static androidx.media3.common.Player.EVENT_TRACKS_CHANGED;
import static androidx.media3.common.Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED;
import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED;
import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT;
@ -132,6 +133,7 @@ import androidx.media3.common.Timeline.Period;
import androidx.media3.common.Timeline.RemotableTimeline;
import androidx.media3.common.Timeline.Window;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.CueGroup;
import androidx.media3.common.util.BundleableUtil;
@ -1766,6 +1768,11 @@ import org.checkerframework.checker.nullness.qual.NonNull;
return intersectedPlayerCommands;
}
@Override
public Tracks getCurrentTracks() {
return playerInfo.currentTracks;
}
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return playerInfo.trackSelectionParameters;
@ -2388,6 +2395,10 @@ import org.checkerframework.checker.nullness.qual.NonNull;
listener.onMediaItemTransition(
currentMediaItem, playerInfo.mediaItemTransitionReason));
}
if (!Util.areEqual(oldPlayerInfo.currentTracks, newPlayerInfo.currentTracks)) {
listeners.queueEvent(
EVENT_TRACKS_CHANGED, listener -> listener.onTracksChanged(newPlayerInfo.currentTracks));
}
if (!Util.areEqual(oldPlayerInfo.playbackParameters, playerInfo.playbackParameters)) {
listeners.queueEvent(
EVENT_PLAYBACK_PARAMETERS_CHANGED,

View File

@ -83,6 +83,7 @@ import androidx.media3.common.Rating;
import androidx.media3.common.Timeline;
import androidx.media3.common.Timeline.Window;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.CueGroup;
import androidx.media3.common.util.Clock;
@ -1184,6 +1185,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
return controllerInfo.availablePlayerCommands;
}
@Override
public Tracks getCurrentTracks() {
return Tracks.EMPTY;
}
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
@ -2102,6 +2108,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
seekBackIncrementMs,
seekForwardIncrementMs,
/* maxSeekToPreviousPositionMs= */ 0L,
/* currentTracks= */ Tracks.EMPTY,
/* parameters= */ TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
return new ControllerInfo(

View File

@ -51,6 +51,7 @@ import androidx.media3.common.Player.RepeatMode;
import androidx.media3.common.Rating;
import androidx.media3.common.Timeline;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util;
@ -1123,6 +1124,8 @@ public class MediaSession {
default void onIsLoadingChanged(int seq, boolean isLoading) throws RemoteException {}
default void onTracksChanged(int seq, Tracks tracks) throws RemoteException {}
default void onTrackSelectionParametersChanged(int seq, TrackSelectionParameters parameters)
throws RemoteException {}

View File

@ -61,6 +61,7 @@ import androidx.media3.common.Player.RepeatMode;
import androidx.media3.common.Rating;
import androidx.media3.common.Timeline;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.CueGroup;
import androidx.media3.common.util.Log;
@ -401,13 +402,13 @@ import org.checkerframework.checker.initialization.qual.Initialized;
.onPlayerInfoChanged(
seq,
playerInfo,
!sessionStub
/* excludeMediaItems= */ !sessionStub
.getConnectedControllersManager()
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_TIMELINE),
!sessionStub
/* excludeMediaItemsMetadata= */ !sessionStub
.getConnectedControllersManager()
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_MEDIA_ITEMS_METADATA),
!sessionStub
/* excludeCues= */ !sessionStub
.getConnectedControllersManager()
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_TEXT),
excludeTimeline);
@ -1087,6 +1088,23 @@ import org.checkerframework.checker.initialization.qual.Initialized;
(callback, seq) -> callback.onDeviceInfoChanged(seq, session.playerInfo.deviceInfo));
}
@Override
public void onTracksChanged(Tracks tracks) {
@Nullable MediaSessionImpl session = getSession();
if (session == null) {
return;
}
session.verifyApplicationThread();
@Nullable PlayerWrapper player = this.player.get();
if (player == null) {
return;
}
session.playerInfo = session.playerInfo.copyWithCurrentTracks(tracks);
session.onPlayerInfoChangedHandler.sendPlayerInfoChangedMessage(/* excludeTimeline= */ true);
session.dispatchRemoteControllerTaskWithoutReturn(
(callback, seq) -> callback.onTracksChanged(seq, tracks));
}
@Override
public void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) {
@Nullable MediaSessionImpl session = getSession();

View File

@ -42,6 +42,7 @@ import androidx.media3.common.Player.State;
import androidx.media3.common.Timeline;
import androidx.media3.common.Timeline.Window;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.CueGroup;
import androidx.media3.common.util.Assertions;
@ -90,6 +91,7 @@ import java.lang.annotation.Target;
private long seekBackIncrementMs;
private long seekForwardIncrementMs;
private long maxSeekToPreviousPositionMs;
private Tracks currentTracks;
private TrackSelectionParameters trackSelectionParameters;
public Builder(PlayerInfo playerInfo) {
@ -121,6 +123,7 @@ import java.lang.annotation.Target;
seekBackIncrementMs = playerInfo.seekBackIncrementMs;
seekForwardIncrementMs = playerInfo.seekForwardIncrementMs;
maxSeekToPreviousPositionMs = playerInfo.maxSeekToPreviousPositionMs;
currentTracks = playerInfo.currentTracks;
trackSelectionParameters = playerInfo.trackSelectionParameters;
}
@ -267,6 +270,11 @@ import java.lang.annotation.Target;
return this;
}
public Builder setCurrentTracks(Tracks tracks) {
currentTracks = tracks;
return this;
}
public Builder setTrackSelectionParameters(TrackSelectionParameters parameters) {
trackSelectionParameters = parameters;
return this;
@ -305,6 +313,7 @@ import java.lang.annotation.Target;
seekBackIncrementMs,
seekForwardIncrementMs,
maxSeekToPreviousPositionMs,
currentTracks,
trackSelectionParameters);
}
}
@ -350,6 +359,7 @@ import java.lang.annotation.Target;
/* seekBackIncrementMs= */ 0,
/* seekForwardIncrementMs= */ 0,
/* maxSeekToPreviousPositionMs= */ 0,
/* currentTracks= */ Tracks.EMPTY,
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
@Nullable public final PlaybackException playerError;
@ -408,6 +418,8 @@ import java.lang.annotation.Target;
public final long maxSeekToPreviousPositionMs;
public final Tracks currentTracks;
public final TrackSelectionParameters trackSelectionParameters;
@CheckResult
@ -578,6 +590,10 @@ import java.lang.annotation.Target;
return new Builder(this).setMaxSeekToPreviousPositionMs(maxSeekToPreviousPositionMs).build();
}
public PlayerInfo copyWithCurrentTracks(Tracks tracks) {
return new Builder(this).setCurrentTracks(tracks).build();
}
@CheckResult
public PlayerInfo copyWithTrackSelectionParameters(TrackSelectionParameters parameters) {
return new Builder(this).setTrackSelectionParameters(parameters).build();
@ -612,6 +628,7 @@ import java.lang.annotation.Target;
long seekBackIncrementMs,
long seekForwardIncrementMs,
long maxSeekToPreviousPositionMs,
Tracks currentTracks,
TrackSelectionParameters parameters) {
this.playerError = playerError;
this.mediaItemTransitionReason = mediaItemTransitionReason;
@ -641,6 +658,7 @@ import java.lang.annotation.Target;
this.seekBackIncrementMs = seekBackIncrementMs;
this.seekForwardIncrementMs = seekForwardIncrementMs;
this.maxSeekToPreviousPositionMs = maxSeekToPreviousPositionMs;
this.currentTracks = currentTracks;
this.trackSelectionParameters = parameters;
}
@ -696,6 +714,7 @@ import java.lang.annotation.Target;
FIELD_SEEK_FORWARD_INCREMENT_MS,
FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS,
FIELD_TRACK_SELECTION_PARAMETERS,
FIELD_CURRENT_TRACKS,
})
private @interface FieldNumber {}
@ -728,7 +747,8 @@ import java.lang.annotation.Target;
private static final int FIELD_SEEK_FORWARD_INCREMENT_MS = 27;
private static final int FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS = 28;
private static final int FIELD_TRACK_SELECTION_PARAMETERS = 29;
// Next field key = 30
private static final int FIELD_CURRENT_TRACKS = 30;
// Next field key = 31
public Bundle toBundle(
boolean excludeMediaItems,
@ -774,6 +794,7 @@ import java.lang.annotation.Target;
bundle.putLong(keyForField(FIELD_SEEK_FORWARD_INCREMENT_MS), seekForwardIncrementMs);
bundle.putLong(
keyForField(FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS), maxSeekToPreviousPositionMs);
bundle.putBundle(keyForField(FIELD_CURRENT_TRACKS), currentTracks.toBundle());
bundle.putBundle(
keyForField(FIELD_TRACK_SELECTION_PARAMETERS), trackSelectionParameters.toBundle());
@ -886,6 +907,9 @@ import java.lang.annotation.Target;
bundle.getLong(keyForField(FIELD_SEEK_FORWARD_INCREMENT_MS), /* defaultValue= */ 0);
long maxSeekToPreviousPosition =
bundle.getLong(keyForField(FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS), /* defaultValue= */ 0);
Bundle currentTracksBundle = bundle.getBundle(keyForField(FIELD_CURRENT_TRACKS));
Tracks currentTracks =
currentTracksBundle == null ? Tracks.EMPTY : Tracks.CREATOR.fromBundle(currentTracksBundle);
@Nullable
Bundle trackSelectionParametersBundle =
bundle.getBundle(keyForField(FIELD_TRACK_SELECTION_PARAMETERS));
@ -922,6 +946,7 @@ import java.lang.annotation.Target;
seekBackIncrementMs,
seekForwardIncrementMs,
maxSeekToPreviousPosition,
currentTracks,
trackSelectionParameters);
}

View File

@ -951,6 +951,7 @@ import java.util.List;
getSeekBackIncrement(),
getSeekForwardIncrement(),
getMaxSeekToPreviousPosition(),
getCurrentTracks(),
getTrackSelectionParameters());
}

View File

@ -85,4 +85,5 @@ interface IRemoteMediaSession {
void notifyRenderedFirstFrame(String sessionId);
void notifyMaxSeekToPreviousPositionChanged(String sessionid, long maxSeekToPreviousPositionMs);
void notifyTrackSelectionParametersChanged(String sessionId, in Bundle parameters);
void notifyTracksChanged(String sessionId, in Bundle tracks);
}

View File

@ -103,6 +103,7 @@ public class CommonConstants {
public static final String KEY_MEDIA_METADATA = "mediaMetadata";
public static final String KEY_MAX_SEEK_TO_PREVIOUS_POSITION_MS = "maxSeekToPreviousPositionMs";
public static final String KEY_TRACK_SELECTION_PARAMETERS = "trackSelectionParameters";
public static final String KEY_CURRENT_TRACKS = "currentTracks";
// SessionCompat arguments
public static final String KEY_SESSION_COMPAT_TOKEN = "sessionCompatToken";

View File

@ -50,6 +50,7 @@ import androidx.media3.common.AudioAttributes;
import androidx.media3.common.C;
import androidx.media3.common.DeviceInfo;
import androidx.media3.common.FlagSet;
import androidx.media3.common.Format;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaMetadata;
import androidx.media3.common.PlaybackException;
@ -62,7 +63,9 @@ import androidx.media3.common.Player.PositionInfo;
import androidx.media3.common.Player.RepeatMode;
import androidx.media3.common.Player.State;
import androidx.media3.common.Timeline;
import androidx.media3.common.TrackGroup;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.Cue;
import androidx.media3.common.text.CueGroup;
@ -829,6 +832,52 @@ public class MediaControllerListenerTest {
assertThat(parametersFromGetterRef.get()).isEqualTo(parameters);
}
@Test
public void onTracksChanged() throws Exception {
RemoteMediaSession.RemoteMockPlayer player = remoteSession.getMockPlayer();
ImmutableList<Tracks.Group> trackGroups =
ImmutableList.of(
new Tracks.Group(
new TrackGroup(new Format.Builder().setChannelCount(2).build()),
/* adaptiveSupported= */ false,
/* trackSupport= */ new int[1],
/* trackSelected= */ new boolean[1]),
new Tracks.Group(
new TrackGroup(new Format.Builder().setHeight(1024).build()),
/* adaptiveSupported= */ false,
/* trackSupport= */ new int[1],
/* trackSelected= */ new boolean[1]));
Tracks currentTracks = new Tracks(trackGroups);
MediaController controller = controllerTestRule.createController(remoteSession.getToken());
AtomicReference<Tracks> changedCurrentTracksFromParamRef = new AtomicReference<>();
AtomicReference<Tracks> changedCurrentTracksFromGetterRef = new AtomicReference<>();
CountDownLatch latch = new CountDownLatch(1);
Player.Listener listener =
new Player.Listener() {
@Override
public void onTracksChanged(Tracks currentTracks) {
changedCurrentTracksFromParamRef.set(currentTracks);
changedCurrentTracksFromGetterRef.set(controller.getCurrentTracks());
latch.countDown();
}
};
AtomicReference<Tracks> initialCurrentTracksRef = new AtomicReference<>();
threadTestRule
.getHandler()
.postAndSync(
() -> {
initialCurrentTracksRef.set(controller.getCurrentTracks());
controller.addListener(listener);
});
player.notifyTracksChanged(currentTracks);
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
assertThat(initialCurrentTracksRef.get()).isEqualTo(Tracks.EMPTY);
assertThat(changedCurrentTracksFromParamRef.get()).isEqualTo(currentTracks);
assertThat(changedCurrentTracksFromGetterRef.get()).isEqualTo(currentTracks);
}
/** This also tests {@link MediaController#getShuffleModeEnabled()}. */
@Test
public void onShuffleModeEnabledChanged() throws Exception {

View File

@ -35,6 +35,7 @@ import android.os.Bundle;
import android.os.RemoteException;
import androidx.media3.common.AudioAttributes;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.HeartRating;
import androidx.media3.common.IllegalSeekPositionException;
import androidx.media3.common.MediaItem;
@ -47,7 +48,9 @@ import androidx.media3.common.Player.RepeatMode;
import androidx.media3.common.Rating;
import androidx.media3.common.StarRating;
import androidx.media3.common.Timeline;
import androidx.media3.common.TrackGroup;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.util.Util;
import androidx.media3.test.session.common.HandlerThreadTestRule;
@ -283,6 +286,22 @@ public class MediaControllerTest {
long seekBackIncrementMs = 1_000;
long seekForwardIncrementMs = 2_000;
long maxSeekToPreviousPositionMs = 300;
ImmutableList<Tracks.Group> trackGroups =
new ImmutableList.Builder<Tracks.Group>()
.add(
new Tracks.Group(
new TrackGroup(new Format.Builder().setChannelCount(2).build()),
/* adaptiveSupported= */ false,
/* trackSupport= */ new int[1],
/* trackSelected= */ new boolean[1]))
.add(
new Tracks.Group(
new TrackGroup(new Format.Builder().setHeight(1024).build()),
/* adaptiveSupported= */ false,
/* trackSupport= */ new int[1],
/* trackSelected= */ new boolean[1]))
.build();
Tracks currentTracks = new Tracks(trackGroups);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxVideoSizeSd().build();
Timeline timeline = MediaTestUtils.createTimeline(5);
@ -316,6 +335,7 @@ public class MediaControllerTest {
.setSeekForwardIncrement(seekForwardIncrementMs)
.setMaxSeekToPreviousPositionMs(maxSeekToPreviousPositionMs)
.setTrackSelectionParameters(trackSelectionParameters)
.setCurrentTracks(currentTracks)
.setTimeline(timeline)
.setCurrentMediaItemIndex(currentMediaItemIndex)
.build();
@ -347,6 +367,7 @@ public class MediaControllerTest {
AtomicLong seekBackIncrementRef = new AtomicLong();
AtomicLong seekForwardIncrementRef = new AtomicLong();
AtomicLong maxSeekToPreviousPositionMsRef = new AtomicLong();
AtomicReference<Tracks> currentTracksRef = new AtomicReference<>();
AtomicReference<TrackSelectionParameters> trackSelectionParametersRef = new AtomicReference<>();
AtomicReference<Timeline> timelineRef = new AtomicReference<>();
AtomicInteger currentMediaItemIndexRef = new AtomicInteger();
@ -379,6 +400,7 @@ public class MediaControllerTest {
seekBackIncrementRef.set(controller.getSeekBackIncrement());
seekForwardIncrementRef.set(controller.getSeekForwardIncrement());
maxSeekToPreviousPositionMsRef.set(controller.getMaxSeekToPreviousPosition());
currentTracksRef.set(controller.getCurrentTracks());
trackSelectionParametersRef.set(controller.getTrackSelectionParameters());
timelineRef.set(controller.getCurrentTimeline());
currentMediaItemIndexRef.set(controller.getCurrentMediaItemIndex());
@ -409,6 +431,7 @@ public class MediaControllerTest {
assertThat(seekForwardIncrementRef.get()).isEqualTo(seekForwardIncrementMs);
assertThat(maxSeekToPreviousPositionMsRef.get()).isEqualTo(maxSeekToPreviousPositionMs);
assertThat(trackSelectionParametersRef.get()).isEqualTo(trackSelectionParameters);
assertThat(currentTracksRef.get()).isEqualTo(currentTracks);
assertTimelineMediaItemsEquals(timelineRef.get(), timeline);
assertThat(currentMediaItemIndexRef.get()).isEqualTo(currentMediaItemIndex);
assertThat(currentMediaItemRef.get()).isEqualTo(currentMediaItem);

View File

@ -29,6 +29,7 @@ import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_LI
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_MEDIA_ITEM_INDEX;
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_PERIOD_INDEX;
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_POSITION;
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_TRACKS;
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_INFO;
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_MUTED;
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_VOLUME;
@ -79,6 +80,7 @@ import androidx.media3.common.Player.DiscontinuityReason;
import androidx.media3.common.Player.PositionInfo;
import androidx.media3.common.Timeline;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.CueGroup;
import androidx.media3.common.util.Log;
@ -355,6 +357,10 @@ public class MediaSessionProviderService extends Service {
}
player.maxSeekToPreviousPositionMs =
config.getLong(KEY_MAX_SEEK_TO_PREVIOUS_POSITION_MS, player.maxSeekToPreviousPositionMs);
@Nullable Bundle currentTracksBundle = config.getBundle(KEY_CURRENT_TRACKS);
if (currentTracksBundle != null) {
player.currentTracks = Tracks.CREATOR.fromBundle(currentTracksBundle);
}
@Nullable
Bundle trackSelectionParametersBundle = config.getBundle(KEY_TRACK_SELECTION_PARAMETERS);
if (trackSelectionParametersBundle != null) {
@ -1004,5 +1010,17 @@ public class MediaSessionProviderService extends Service {
player.notifyTrackSelectionParametersChanged();
});
}
@Override
public void notifyTracksChanged(String sessionId, Bundle tracksBundle) throws RemoteException {
Tracks tracks = Tracks.CREATOR.fromBundle(tracksBundle);
runOnHandler(
() -> {
MediaSession session = sessionMap.get(sessionId);
MockPlayer player = (MockPlayer) session.getPlayer();
player.currentTracks = tracks;
player.notifyTracksChanged();
});
}
}
}

View File

@ -251,6 +251,7 @@ public class MockPlayer implements Player {
public long seekForwardIncrementMs;
public long maxSeekToPreviousPositionMs;
public TrackSelectionParameters trackSelectionParameters;
public Tracks currentTracks;
private MockPlayer(Builder builder) {
changePlayerStateWithTransportControl = builder.changePlayerStateWithTransportControl;
@ -299,6 +300,7 @@ public class MockPlayer implements Player {
commands = new Player.Commands.Builder().addAllCommands().build();
currentTracks = Tracks.EMPTY;
trackSelectionParameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
}
@ -1177,6 +1179,22 @@ public class MockPlayer implements Player {
}
}
@Override
public Tracks getCurrentTracks() {
return currentTracks;
}
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return trackSelectionParameters;
}
@Override
public void setTrackSelectionParameters(TrackSelectionParameters parameters) {
trackSelectionParameters = parameters;
checkNotNull(conditionVariables.get(METHOD_SET_TRACK_SELECTION_PARAMETERS)).open();
}
public boolean surfaceExists() {
return surface != null;
}
@ -1225,20 +1243,10 @@ public class MockPlayer implements Player {
}
}
@Override
public Tracks getCurrentTracks() {
throw new UnsupportedOperationException();
public void notifyTracksChanged() {
for (Listener listener : listeners) {
listener.onTracksChanged(currentTracks);
}
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return trackSelectionParameters;
}
@Override
public void setTrackSelectionParameters(TrackSelectionParameters parameters) {
trackSelectionParameters = parameters;
checkNotNull(conditionVariables.get(METHOD_SET_TRACK_SELECTION_PARAMETERS)).open();
}
@Override

View File

@ -29,6 +29,7 @@ import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_LI
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_MEDIA_ITEM_INDEX;
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_PERIOD_INDEX;
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_POSITION;
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_TRACKS;
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_INFO;
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_MUTED;
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_VOLUME;
@ -77,6 +78,7 @@ import androidx.media3.common.Player.DiscontinuityReason;
import androidx.media3.common.Player.PositionInfo;
import androidx.media3.common.Timeline;
import androidx.media3.common.TrackSelectionParameters;
import androidx.media3.common.Tracks;
import androidx.media3.common.VideoSize;
import androidx.media3.common.text.CueGroup;
import androidx.media3.common.util.Log;
@ -421,6 +423,10 @@ public class RemoteMediaSession {
throws RemoteException {
binder.notifyTrackSelectionParametersChanged(sessionId, parameters.toBundle());
}
public void notifyTracksChanged(Tracks tracks) throws RemoteException {
binder.notifyTracksChanged(sessionId, tracks.toBundle());
}
}
////////////////////////////////////////////////////////////////////////////////
@ -687,6 +693,11 @@ public class RemoteMediaSession {
return this;
}
public MockPlayerConfigBuilder setCurrentTracks(Tracks tracks) {
bundle.putBundle(KEY_CURRENT_TRACKS, tracks.toBundle());
return this;
}
public Bundle build() {
return bundle;
}