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:
parent
5c2aabca66
commit
9a895cd18f
@ -1677,7 +1677,8 @@ public class MediaController implements Player {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Tracks getCurrentTracks() {
|
public Tracks getCurrentTracks() {
|
||||||
return Tracks.EMPTY; // TODO(b/178486745)
|
verifyApplicationThread();
|
||||||
|
return isConnected() ? impl.getCurrentTracks() : Tracks.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -2010,6 +2011,8 @@ public class MediaController implements Player {
|
|||||||
|
|
||||||
Commands getAvailableCommands();
|
Commands getAvailableCommands();
|
||||||
|
|
||||||
|
Tracks getCurrentTracks();
|
||||||
|
|
||||||
TrackSelectionParameters getTrackSelectionParameters();
|
TrackSelectionParameters getTrackSelectionParameters();
|
||||||
|
|
||||||
void setTrackSelectionParameters(TrackSelectionParameters parameters);
|
void setTrackSelectionParameters(TrackSelectionParameters parameters);
|
||||||
|
@ -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_SEEK_FORWARD_INCREMENT_CHANGED;
|
||||||
import static androidx.media3.common.Player.EVENT_SHUFFLE_MODE_ENABLED_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_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.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_PLAYLIST_CHANGED;
|
||||||
import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT;
|
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.RemotableTimeline;
|
||||||
import androidx.media3.common.Timeline.Window;
|
import androidx.media3.common.Timeline.Window;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
import androidx.media3.common.util.BundleableUtil;
|
import androidx.media3.common.util.BundleableUtil;
|
||||||
@ -1766,6 +1768,11 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
return intersectedPlayerCommands;
|
return intersectedPlayerCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Tracks getCurrentTracks() {
|
||||||
|
return playerInfo.currentTracks;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TrackSelectionParameters getTrackSelectionParameters() {
|
public TrackSelectionParameters getTrackSelectionParameters() {
|
||||||
return playerInfo.trackSelectionParameters;
|
return playerInfo.trackSelectionParameters;
|
||||||
@ -2388,6 +2395,10 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
listener.onMediaItemTransition(
|
listener.onMediaItemTransition(
|
||||||
currentMediaItem, playerInfo.mediaItemTransitionReason));
|
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)) {
|
if (!Util.areEqual(oldPlayerInfo.playbackParameters, playerInfo.playbackParameters)) {
|
||||||
listeners.queueEvent(
|
listeners.queueEvent(
|
||||||
EVENT_PLAYBACK_PARAMETERS_CHANGED,
|
EVENT_PLAYBACK_PARAMETERS_CHANGED,
|
||||||
|
@ -83,6 +83,7 @@ import androidx.media3.common.Rating;
|
|||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.Timeline.Window;
|
import androidx.media3.common.Timeline.Window;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
import androidx.media3.common.util.Clock;
|
import androidx.media3.common.util.Clock;
|
||||||
@ -1184,6 +1185,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
|
|||||||
return controllerInfo.availablePlayerCommands;
|
return controllerInfo.availablePlayerCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Tracks getCurrentTracks() {
|
||||||
|
return Tracks.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TrackSelectionParameters getTrackSelectionParameters() {
|
public TrackSelectionParameters getTrackSelectionParameters() {
|
||||||
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
|
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
|
||||||
@ -2102,6 +2108,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
|
|||||||
seekBackIncrementMs,
|
seekBackIncrementMs,
|
||||||
seekForwardIncrementMs,
|
seekForwardIncrementMs,
|
||||||
/* maxSeekToPreviousPositionMs= */ 0L,
|
/* maxSeekToPreviousPositionMs= */ 0L,
|
||||||
|
/* currentTracks= */ Tracks.EMPTY,
|
||||||
/* parameters= */ TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
|
/* parameters= */ TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
|
||||||
|
|
||||||
return new ControllerInfo(
|
return new ControllerInfo(
|
||||||
|
@ -51,6 +51,7 @@ import androidx.media3.common.Player.RepeatMode;
|
|||||||
import androidx.media3.common.Rating;
|
import androidx.media3.common.Rating;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
@ -1123,6 +1124,8 @@ public class MediaSession {
|
|||||||
|
|
||||||
default void onIsLoadingChanged(int seq, boolean isLoading) throws RemoteException {}
|
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)
|
default void onTrackSelectionParametersChanged(int seq, TrackSelectionParameters parameters)
|
||||||
throws RemoteException {}
|
throws RemoteException {}
|
||||||
|
|
||||||
|
@ -61,6 +61,7 @@ import androidx.media3.common.Player.RepeatMode;
|
|||||||
import androidx.media3.common.Rating;
|
import androidx.media3.common.Rating;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
import androidx.media3.common.util.Log;
|
import androidx.media3.common.util.Log;
|
||||||
@ -401,13 +402,13 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
.onPlayerInfoChanged(
|
.onPlayerInfoChanged(
|
||||||
seq,
|
seq,
|
||||||
playerInfo,
|
playerInfo,
|
||||||
!sessionStub
|
/* excludeMediaItems= */ !sessionStub
|
||||||
.getConnectedControllersManager()
|
.getConnectedControllersManager()
|
||||||
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_TIMELINE),
|
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_TIMELINE),
|
||||||
!sessionStub
|
/* excludeMediaItemsMetadata= */ !sessionStub
|
||||||
.getConnectedControllersManager()
|
.getConnectedControllersManager()
|
||||||
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_MEDIA_ITEMS_METADATA),
|
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_MEDIA_ITEMS_METADATA),
|
||||||
!sessionStub
|
/* excludeCues= */ !sessionStub
|
||||||
.getConnectedControllersManager()
|
.getConnectedControllersManager()
|
||||||
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_TEXT),
|
.isPlayerCommandAvailable(controller, Player.COMMAND_GET_TEXT),
|
||||||
excludeTimeline);
|
excludeTimeline);
|
||||||
@ -1087,6 +1088,23 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
(callback, seq) -> callback.onDeviceInfoChanged(seq, session.playerInfo.deviceInfo));
|
(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
|
@Override
|
||||||
public void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) {
|
public void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) {
|
||||||
@Nullable MediaSessionImpl session = getSession();
|
@Nullable MediaSessionImpl session = getSession();
|
||||||
|
@ -42,6 +42,7 @@ import androidx.media3.common.Player.State;
|
|||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.Timeline.Window;
|
import androidx.media3.common.Timeline.Window;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
@ -90,6 +91,7 @@ import java.lang.annotation.Target;
|
|||||||
private long seekBackIncrementMs;
|
private long seekBackIncrementMs;
|
||||||
private long seekForwardIncrementMs;
|
private long seekForwardIncrementMs;
|
||||||
private long maxSeekToPreviousPositionMs;
|
private long maxSeekToPreviousPositionMs;
|
||||||
|
private Tracks currentTracks;
|
||||||
private TrackSelectionParameters trackSelectionParameters;
|
private TrackSelectionParameters trackSelectionParameters;
|
||||||
|
|
||||||
public Builder(PlayerInfo playerInfo) {
|
public Builder(PlayerInfo playerInfo) {
|
||||||
@ -121,6 +123,7 @@ import java.lang.annotation.Target;
|
|||||||
seekBackIncrementMs = playerInfo.seekBackIncrementMs;
|
seekBackIncrementMs = playerInfo.seekBackIncrementMs;
|
||||||
seekForwardIncrementMs = playerInfo.seekForwardIncrementMs;
|
seekForwardIncrementMs = playerInfo.seekForwardIncrementMs;
|
||||||
maxSeekToPreviousPositionMs = playerInfo.maxSeekToPreviousPositionMs;
|
maxSeekToPreviousPositionMs = playerInfo.maxSeekToPreviousPositionMs;
|
||||||
|
currentTracks = playerInfo.currentTracks;
|
||||||
trackSelectionParameters = playerInfo.trackSelectionParameters;
|
trackSelectionParameters = playerInfo.trackSelectionParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,6 +270,11 @@ import java.lang.annotation.Target;
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder setCurrentTracks(Tracks tracks) {
|
||||||
|
currentTracks = tracks;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder setTrackSelectionParameters(TrackSelectionParameters parameters) {
|
public Builder setTrackSelectionParameters(TrackSelectionParameters parameters) {
|
||||||
trackSelectionParameters = parameters;
|
trackSelectionParameters = parameters;
|
||||||
return this;
|
return this;
|
||||||
@ -305,6 +313,7 @@ import java.lang.annotation.Target;
|
|||||||
seekBackIncrementMs,
|
seekBackIncrementMs,
|
||||||
seekForwardIncrementMs,
|
seekForwardIncrementMs,
|
||||||
maxSeekToPreviousPositionMs,
|
maxSeekToPreviousPositionMs,
|
||||||
|
currentTracks,
|
||||||
trackSelectionParameters);
|
trackSelectionParameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -350,6 +359,7 @@ import java.lang.annotation.Target;
|
|||||||
/* seekBackIncrementMs= */ 0,
|
/* seekBackIncrementMs= */ 0,
|
||||||
/* seekForwardIncrementMs= */ 0,
|
/* seekForwardIncrementMs= */ 0,
|
||||||
/* maxSeekToPreviousPositionMs= */ 0,
|
/* maxSeekToPreviousPositionMs= */ 0,
|
||||||
|
/* currentTracks= */ Tracks.EMPTY,
|
||||||
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
|
||||||
|
|
||||||
@Nullable public final PlaybackException playerError;
|
@Nullable public final PlaybackException playerError;
|
||||||
@ -408,6 +418,8 @@ import java.lang.annotation.Target;
|
|||||||
|
|
||||||
public final long maxSeekToPreviousPositionMs;
|
public final long maxSeekToPreviousPositionMs;
|
||||||
|
|
||||||
|
public final Tracks currentTracks;
|
||||||
|
|
||||||
public final TrackSelectionParameters trackSelectionParameters;
|
public final TrackSelectionParameters trackSelectionParameters;
|
||||||
|
|
||||||
@CheckResult
|
@CheckResult
|
||||||
@ -578,6 +590,10 @@ import java.lang.annotation.Target;
|
|||||||
return new Builder(this).setMaxSeekToPreviousPositionMs(maxSeekToPreviousPositionMs).build();
|
return new Builder(this).setMaxSeekToPreviousPositionMs(maxSeekToPreviousPositionMs).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PlayerInfo copyWithCurrentTracks(Tracks tracks) {
|
||||||
|
return new Builder(this).setCurrentTracks(tracks).build();
|
||||||
|
}
|
||||||
|
|
||||||
@CheckResult
|
@CheckResult
|
||||||
public PlayerInfo copyWithTrackSelectionParameters(TrackSelectionParameters parameters) {
|
public PlayerInfo copyWithTrackSelectionParameters(TrackSelectionParameters parameters) {
|
||||||
return new Builder(this).setTrackSelectionParameters(parameters).build();
|
return new Builder(this).setTrackSelectionParameters(parameters).build();
|
||||||
@ -612,6 +628,7 @@ import java.lang.annotation.Target;
|
|||||||
long seekBackIncrementMs,
|
long seekBackIncrementMs,
|
||||||
long seekForwardIncrementMs,
|
long seekForwardIncrementMs,
|
||||||
long maxSeekToPreviousPositionMs,
|
long maxSeekToPreviousPositionMs,
|
||||||
|
Tracks currentTracks,
|
||||||
TrackSelectionParameters parameters) {
|
TrackSelectionParameters parameters) {
|
||||||
this.playerError = playerError;
|
this.playerError = playerError;
|
||||||
this.mediaItemTransitionReason = mediaItemTransitionReason;
|
this.mediaItemTransitionReason = mediaItemTransitionReason;
|
||||||
@ -641,6 +658,7 @@ import java.lang.annotation.Target;
|
|||||||
this.seekBackIncrementMs = seekBackIncrementMs;
|
this.seekBackIncrementMs = seekBackIncrementMs;
|
||||||
this.seekForwardIncrementMs = seekForwardIncrementMs;
|
this.seekForwardIncrementMs = seekForwardIncrementMs;
|
||||||
this.maxSeekToPreviousPositionMs = maxSeekToPreviousPositionMs;
|
this.maxSeekToPreviousPositionMs = maxSeekToPreviousPositionMs;
|
||||||
|
this.currentTracks = currentTracks;
|
||||||
this.trackSelectionParameters = parameters;
|
this.trackSelectionParameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -696,6 +714,7 @@ import java.lang.annotation.Target;
|
|||||||
FIELD_SEEK_FORWARD_INCREMENT_MS,
|
FIELD_SEEK_FORWARD_INCREMENT_MS,
|
||||||
FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS,
|
FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS,
|
||||||
FIELD_TRACK_SELECTION_PARAMETERS,
|
FIELD_TRACK_SELECTION_PARAMETERS,
|
||||||
|
FIELD_CURRENT_TRACKS,
|
||||||
})
|
})
|
||||||
private @interface FieldNumber {}
|
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_SEEK_FORWARD_INCREMENT_MS = 27;
|
||||||
private static final int FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS = 28;
|
private static final int FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS = 28;
|
||||||
private static final int FIELD_TRACK_SELECTION_PARAMETERS = 29;
|
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(
|
public Bundle toBundle(
|
||||||
boolean excludeMediaItems,
|
boolean excludeMediaItems,
|
||||||
@ -774,6 +794,7 @@ import java.lang.annotation.Target;
|
|||||||
bundle.putLong(keyForField(FIELD_SEEK_FORWARD_INCREMENT_MS), seekForwardIncrementMs);
|
bundle.putLong(keyForField(FIELD_SEEK_FORWARD_INCREMENT_MS), seekForwardIncrementMs);
|
||||||
bundle.putLong(
|
bundle.putLong(
|
||||||
keyForField(FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS), maxSeekToPreviousPositionMs);
|
keyForField(FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS), maxSeekToPreviousPositionMs);
|
||||||
|
bundle.putBundle(keyForField(FIELD_CURRENT_TRACKS), currentTracks.toBundle());
|
||||||
bundle.putBundle(
|
bundle.putBundle(
|
||||||
keyForField(FIELD_TRACK_SELECTION_PARAMETERS), trackSelectionParameters.toBundle());
|
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);
|
bundle.getLong(keyForField(FIELD_SEEK_FORWARD_INCREMENT_MS), /* defaultValue= */ 0);
|
||||||
long maxSeekToPreviousPosition =
|
long maxSeekToPreviousPosition =
|
||||||
bundle.getLong(keyForField(FIELD_MAX_SEEK_TO_PREVIOUS_POSITION_MS), /* defaultValue= */ 0);
|
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
|
@Nullable
|
||||||
Bundle trackSelectionParametersBundle =
|
Bundle trackSelectionParametersBundle =
|
||||||
bundle.getBundle(keyForField(FIELD_TRACK_SELECTION_PARAMETERS));
|
bundle.getBundle(keyForField(FIELD_TRACK_SELECTION_PARAMETERS));
|
||||||
@ -922,6 +946,7 @@ import java.lang.annotation.Target;
|
|||||||
seekBackIncrementMs,
|
seekBackIncrementMs,
|
||||||
seekForwardIncrementMs,
|
seekForwardIncrementMs,
|
||||||
maxSeekToPreviousPosition,
|
maxSeekToPreviousPosition,
|
||||||
|
currentTracks,
|
||||||
trackSelectionParameters);
|
trackSelectionParameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -951,6 +951,7 @@ import java.util.List;
|
|||||||
getSeekBackIncrement(),
|
getSeekBackIncrement(),
|
||||||
getSeekForwardIncrement(),
|
getSeekForwardIncrement(),
|
||||||
getMaxSeekToPreviousPosition(),
|
getMaxSeekToPreviousPosition(),
|
||||||
|
getCurrentTracks(),
|
||||||
getTrackSelectionParameters());
|
getTrackSelectionParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,4 +85,5 @@ interface IRemoteMediaSession {
|
|||||||
void notifyRenderedFirstFrame(String sessionId);
|
void notifyRenderedFirstFrame(String sessionId);
|
||||||
void notifyMaxSeekToPreviousPositionChanged(String sessionid, long maxSeekToPreviousPositionMs);
|
void notifyMaxSeekToPreviousPositionChanged(String sessionid, long maxSeekToPreviousPositionMs);
|
||||||
void notifyTrackSelectionParametersChanged(String sessionId, in Bundle parameters);
|
void notifyTrackSelectionParametersChanged(String sessionId, in Bundle parameters);
|
||||||
|
void notifyTracksChanged(String sessionId, in Bundle tracks);
|
||||||
}
|
}
|
||||||
|
@ -103,6 +103,7 @@ public class CommonConstants {
|
|||||||
public static final String KEY_MEDIA_METADATA = "mediaMetadata";
|
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_MAX_SEEK_TO_PREVIOUS_POSITION_MS = "maxSeekToPreviousPositionMs";
|
||||||
public static final String KEY_TRACK_SELECTION_PARAMETERS = "trackSelectionParameters";
|
public static final String KEY_TRACK_SELECTION_PARAMETERS = "trackSelectionParameters";
|
||||||
|
public static final String KEY_CURRENT_TRACKS = "currentTracks";
|
||||||
|
|
||||||
// SessionCompat arguments
|
// SessionCompat arguments
|
||||||
public static final String KEY_SESSION_COMPAT_TOKEN = "sessionCompatToken";
|
public static final String KEY_SESSION_COMPAT_TOKEN = "sessionCompatToken";
|
||||||
|
@ -50,6 +50,7 @@ import androidx.media3.common.AudioAttributes;
|
|||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.DeviceInfo;
|
import androidx.media3.common.DeviceInfo;
|
||||||
import androidx.media3.common.FlagSet;
|
import androidx.media3.common.FlagSet;
|
||||||
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.MediaMetadata;
|
import androidx.media3.common.MediaMetadata;
|
||||||
import androidx.media3.common.PlaybackException;
|
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.RepeatMode;
|
||||||
import androidx.media3.common.Player.State;
|
import androidx.media3.common.Player.State;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
|
import androidx.media3.common.TrackGroup;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.Cue;
|
import androidx.media3.common.text.Cue;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
@ -829,6 +832,52 @@ public class MediaControllerListenerTest {
|
|||||||
assertThat(parametersFromGetterRef.get()).isEqualTo(parameters);
|
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()}. */
|
/** This also tests {@link MediaController#getShuffleModeEnabled()}. */
|
||||||
@Test
|
@Test
|
||||||
public void onShuffleModeEnabledChanged() throws Exception {
|
public void onShuffleModeEnabledChanged() throws Exception {
|
||||||
|
@ -35,6 +35,7 @@ import android.os.Bundle;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import androidx.media3.common.AudioAttributes;
|
import androidx.media3.common.AudioAttributes;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.HeartRating;
|
import androidx.media3.common.HeartRating;
|
||||||
import androidx.media3.common.IllegalSeekPositionException;
|
import androidx.media3.common.IllegalSeekPositionException;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
@ -47,7 +48,9 @@ import androidx.media3.common.Player.RepeatMode;
|
|||||||
import androidx.media3.common.Rating;
|
import androidx.media3.common.Rating;
|
||||||
import androidx.media3.common.StarRating;
|
import androidx.media3.common.StarRating;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
|
import androidx.media3.common.TrackGroup;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.test.session.common.HandlerThreadTestRule;
|
import androidx.media3.test.session.common.HandlerThreadTestRule;
|
||||||
@ -283,6 +286,22 @@ public class MediaControllerTest {
|
|||||||
long seekBackIncrementMs = 1_000;
|
long seekBackIncrementMs = 1_000;
|
||||||
long seekForwardIncrementMs = 2_000;
|
long seekForwardIncrementMs = 2_000;
|
||||||
long maxSeekToPreviousPositionMs = 300;
|
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 trackSelectionParameters =
|
||||||
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxVideoSizeSd().build();
|
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxVideoSizeSd().build();
|
||||||
Timeline timeline = MediaTestUtils.createTimeline(5);
|
Timeline timeline = MediaTestUtils.createTimeline(5);
|
||||||
@ -316,6 +335,7 @@ public class MediaControllerTest {
|
|||||||
.setSeekForwardIncrement(seekForwardIncrementMs)
|
.setSeekForwardIncrement(seekForwardIncrementMs)
|
||||||
.setMaxSeekToPreviousPositionMs(maxSeekToPreviousPositionMs)
|
.setMaxSeekToPreviousPositionMs(maxSeekToPreviousPositionMs)
|
||||||
.setTrackSelectionParameters(trackSelectionParameters)
|
.setTrackSelectionParameters(trackSelectionParameters)
|
||||||
|
.setCurrentTracks(currentTracks)
|
||||||
.setTimeline(timeline)
|
.setTimeline(timeline)
|
||||||
.setCurrentMediaItemIndex(currentMediaItemIndex)
|
.setCurrentMediaItemIndex(currentMediaItemIndex)
|
||||||
.build();
|
.build();
|
||||||
@ -347,6 +367,7 @@ public class MediaControllerTest {
|
|||||||
AtomicLong seekBackIncrementRef = new AtomicLong();
|
AtomicLong seekBackIncrementRef = new AtomicLong();
|
||||||
AtomicLong seekForwardIncrementRef = new AtomicLong();
|
AtomicLong seekForwardIncrementRef = new AtomicLong();
|
||||||
AtomicLong maxSeekToPreviousPositionMsRef = new AtomicLong();
|
AtomicLong maxSeekToPreviousPositionMsRef = new AtomicLong();
|
||||||
|
AtomicReference<Tracks> currentTracksRef = new AtomicReference<>();
|
||||||
AtomicReference<TrackSelectionParameters> trackSelectionParametersRef = new AtomicReference<>();
|
AtomicReference<TrackSelectionParameters> trackSelectionParametersRef = new AtomicReference<>();
|
||||||
AtomicReference<Timeline> timelineRef = new AtomicReference<>();
|
AtomicReference<Timeline> timelineRef = new AtomicReference<>();
|
||||||
AtomicInteger currentMediaItemIndexRef = new AtomicInteger();
|
AtomicInteger currentMediaItemIndexRef = new AtomicInteger();
|
||||||
@ -379,6 +400,7 @@ public class MediaControllerTest {
|
|||||||
seekBackIncrementRef.set(controller.getSeekBackIncrement());
|
seekBackIncrementRef.set(controller.getSeekBackIncrement());
|
||||||
seekForwardIncrementRef.set(controller.getSeekForwardIncrement());
|
seekForwardIncrementRef.set(controller.getSeekForwardIncrement());
|
||||||
maxSeekToPreviousPositionMsRef.set(controller.getMaxSeekToPreviousPosition());
|
maxSeekToPreviousPositionMsRef.set(controller.getMaxSeekToPreviousPosition());
|
||||||
|
currentTracksRef.set(controller.getCurrentTracks());
|
||||||
trackSelectionParametersRef.set(controller.getTrackSelectionParameters());
|
trackSelectionParametersRef.set(controller.getTrackSelectionParameters());
|
||||||
timelineRef.set(controller.getCurrentTimeline());
|
timelineRef.set(controller.getCurrentTimeline());
|
||||||
currentMediaItemIndexRef.set(controller.getCurrentMediaItemIndex());
|
currentMediaItemIndexRef.set(controller.getCurrentMediaItemIndex());
|
||||||
@ -409,6 +431,7 @@ public class MediaControllerTest {
|
|||||||
assertThat(seekForwardIncrementRef.get()).isEqualTo(seekForwardIncrementMs);
|
assertThat(seekForwardIncrementRef.get()).isEqualTo(seekForwardIncrementMs);
|
||||||
assertThat(maxSeekToPreviousPositionMsRef.get()).isEqualTo(maxSeekToPreviousPositionMs);
|
assertThat(maxSeekToPreviousPositionMsRef.get()).isEqualTo(maxSeekToPreviousPositionMs);
|
||||||
assertThat(trackSelectionParametersRef.get()).isEqualTo(trackSelectionParameters);
|
assertThat(trackSelectionParametersRef.get()).isEqualTo(trackSelectionParameters);
|
||||||
|
assertThat(currentTracksRef.get()).isEqualTo(currentTracks);
|
||||||
assertTimelineMediaItemsEquals(timelineRef.get(), timeline);
|
assertTimelineMediaItemsEquals(timelineRef.get(), timeline);
|
||||||
assertThat(currentMediaItemIndexRef.get()).isEqualTo(currentMediaItemIndex);
|
assertThat(currentMediaItemIndexRef.get()).isEqualTo(currentMediaItemIndex);
|
||||||
assertThat(currentMediaItemRef.get()).isEqualTo(currentMediaItem);
|
assertThat(currentMediaItemRef.get()).isEqualTo(currentMediaItem);
|
||||||
|
@ -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_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_PERIOD_INDEX;
|
||||||
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_POSITION;
|
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_INFO;
|
||||||
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_MUTED;
|
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_MUTED;
|
||||||
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_VOLUME;
|
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.Player.PositionInfo;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
import androidx.media3.common.util.Log;
|
import androidx.media3.common.util.Log;
|
||||||
@ -355,6 +357,10 @@ public class MediaSessionProviderService extends Service {
|
|||||||
}
|
}
|
||||||
player.maxSeekToPreviousPositionMs =
|
player.maxSeekToPreviousPositionMs =
|
||||||
config.getLong(KEY_MAX_SEEK_TO_PREVIOUS_POSITION_MS, 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
|
@Nullable
|
||||||
Bundle trackSelectionParametersBundle = config.getBundle(KEY_TRACK_SELECTION_PARAMETERS);
|
Bundle trackSelectionParametersBundle = config.getBundle(KEY_TRACK_SELECTION_PARAMETERS);
|
||||||
if (trackSelectionParametersBundle != null) {
|
if (trackSelectionParametersBundle != null) {
|
||||||
@ -1004,5 +1010,17 @@ public class MediaSessionProviderService extends Service {
|
|||||||
player.notifyTrackSelectionParametersChanged();
|
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();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,6 +251,7 @@ public class MockPlayer implements Player {
|
|||||||
public long seekForwardIncrementMs;
|
public long seekForwardIncrementMs;
|
||||||
public long maxSeekToPreviousPositionMs;
|
public long maxSeekToPreviousPositionMs;
|
||||||
public TrackSelectionParameters trackSelectionParameters;
|
public TrackSelectionParameters trackSelectionParameters;
|
||||||
|
public Tracks currentTracks;
|
||||||
|
|
||||||
private MockPlayer(Builder builder) {
|
private MockPlayer(Builder builder) {
|
||||||
changePlayerStateWithTransportControl = builder.changePlayerStateWithTransportControl;
|
changePlayerStateWithTransportControl = builder.changePlayerStateWithTransportControl;
|
||||||
@ -299,6 +300,7 @@ public class MockPlayer implements Player {
|
|||||||
|
|
||||||
commands = new Player.Commands.Builder().addAllCommands().build();
|
commands = new Player.Commands.Builder().addAllCommands().build();
|
||||||
|
|
||||||
|
currentTracks = Tracks.EMPTY;
|
||||||
trackSelectionParameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
|
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() {
|
public boolean surfaceExists() {
|
||||||
return surface != null;
|
return surface != null;
|
||||||
}
|
}
|
||||||
@ -1225,20 +1243,10 @@ public class MockPlayer implements Player {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void notifyTracksChanged() {
|
||||||
public Tracks getCurrentTracks() {
|
for (Listener listener : listeners) {
|
||||||
throw new UnsupportedOperationException();
|
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
|
@Override
|
||||||
|
@ -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_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_PERIOD_INDEX;
|
||||||
import static androidx.media3.test.session.common.CommonConstants.KEY_CURRENT_POSITION;
|
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_INFO;
|
||||||
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_MUTED;
|
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_MUTED;
|
||||||
import static androidx.media3.test.session.common.CommonConstants.KEY_DEVICE_VOLUME;
|
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.Player.PositionInfo;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
|
import androidx.media3.common.Tracks;
|
||||||
import androidx.media3.common.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
import androidx.media3.common.text.CueGroup;
|
import androidx.media3.common.text.CueGroup;
|
||||||
import androidx.media3.common.util.Log;
|
import androidx.media3.common.util.Log;
|
||||||
@ -421,6 +423,10 @@ public class RemoteMediaSession {
|
|||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
binder.notifyTrackSelectionParametersChanged(sessionId, parameters.toBundle());
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MockPlayerConfigBuilder setCurrentTracks(Tracks tracks) {
|
||||||
|
bundle.putBundle(KEY_CURRENT_TRACKS, tracks.toBundle());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Bundle build() {
|
public Bundle build() {
|
||||||
return bundle;
|
return bundle;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user