Further media3 session cleanup
* Remove casting getInstance and getCallback methods and just use member variables that have the more specific types. I didn't manage to get rid of casting completely; there are still one-off casts during construction. We should look at removing those in the future, but it's not completely trivial due to the way the Impl classes back-reference their wrapping classes. * Move all callback invocations inside the Impl classes for consistency, and properly encapsulate the callbacks there. Sticking with the "OnHandler" naming convention for these methods, but we should probably tweak that in a subsequent change. * Encapsulate MediaItemFiller in MediaSessionImpl. * Some misc cleanup (e.g., converting anonymous inner classes to lambdas where possible). PiperOrigin-RevId: 414401978
This commit is contained in:
parent
e59e15d29d
commit
e765f7a8eb
@ -128,7 +128,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
if (sessionImpl.isReleased()) {
|
if (sessionImpl.isReleased()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sessionImpl.getCallback().onDisconnected(sessionImpl.getInstance(), controllerInfo);
|
sessionImpl.onDisconnectedOnHandler(controllerInfo);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,7 +465,14 @@ public abstract class MediaLibraryService extends MediaSessionService {
|
|||||||
MediaItemFiller mediaItemFiller,
|
MediaItemFiller mediaItemFiller,
|
||||||
Bundle tokenExtras) {
|
Bundle tokenExtras) {
|
||||||
return new MediaLibrarySessionImpl(
|
return new MediaLibrarySessionImpl(
|
||||||
this, context, id, player, sessionActivity, callback, mediaItemFiller, tokenExtras);
|
this,
|
||||||
|
context,
|
||||||
|
id,
|
||||||
|
player,
|
||||||
|
sessionActivity,
|
||||||
|
(MediaLibrarySession.MediaLibrarySessionCallback) callback,
|
||||||
|
mediaItemFiller,
|
||||||
|
tokenExtras);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -308,11 +308,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ListenableFuture<SessionResult> future =
|
ListenableFuture<SessionResult> future =
|
||||||
checkNotNull(
|
librarySessionImpl.onCustomCommandOnHandler(controller, command, extras);
|
||||||
librarySessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onCustomCommand(
|
|
||||||
librarySessionImpl.getInstance(), controller, command, extras));
|
|
||||||
sendCustomActionResultWhenReady(result, future);
|
sendCustomActionResultWhenReady(result, future);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -47,19 +47,25 @@ import java.util.concurrent.Future;
|
|||||||
|
|
||||||
/* package */ class MediaLibrarySessionImpl extends MediaSessionImpl {
|
/* package */ class MediaLibrarySessionImpl extends MediaSessionImpl {
|
||||||
|
|
||||||
|
private final MediaLibrarySession instance;
|
||||||
|
private final MediaLibrarySession.MediaLibrarySessionCallback callback;
|
||||||
|
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
private final ArrayMap<ControllerCb, Set<String>> subscriptions = new ArrayMap<>();
|
private final ArrayMap<ControllerCb, Set<String>> subscriptions;
|
||||||
|
|
||||||
public MediaLibrarySessionImpl(
|
public MediaLibrarySessionImpl(
|
||||||
MediaSession instance,
|
MediaLibrarySession instance,
|
||||||
Context context,
|
Context context,
|
||||||
String id,
|
String id,
|
||||||
Player player,
|
Player player,
|
||||||
@Nullable PendingIntent sessionActivity,
|
@Nullable PendingIntent sessionActivity,
|
||||||
MediaSession.SessionCallback callback,
|
MediaLibrarySession.MediaLibrarySessionCallback callback,
|
||||||
MediaSession.MediaItemFiller mediaItemFiller,
|
MediaSession.MediaItemFiller mediaItemFiller,
|
||||||
Bundle tokenExtras) {
|
Bundle tokenExtras) {
|
||||||
super(instance, context, id, player, sessionActivity, callback, mediaItemFiller, tokenExtras);
|
super(instance, context, id, player, sessionActivity, callback, mediaItemFiller, tokenExtras);
|
||||||
|
this.instance = instance;
|
||||||
|
this.callback = callback;
|
||||||
|
subscriptions = new ArrayMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -115,7 +121,7 @@ import java.util.concurrent.Future;
|
|||||||
// onGetLibraryRoot is defined to return a non-null result but it's implemented by applications,
|
// onGetLibraryRoot is defined to return a non-null result but it's implemented by applications,
|
||||||
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
||||||
return checkNotNull(
|
return checkNotNull(
|
||||||
getCallback().onGetLibraryRoot(getInstance(), browser, params),
|
callback.onGetLibraryRoot(instance, browser, params),
|
||||||
"onGetLibraryRoot must return non-null future");
|
"onGetLibraryRoot must return non-null future");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,8 +130,7 @@ import java.util.concurrent.Future;
|
|||||||
// onGetItem is defined to return a non-null result but it's implemented by applications,
|
// onGetItem is defined to return a non-null result but it's implemented by applications,
|
||||||
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
||||||
return checkNotNull(
|
return checkNotNull(
|
||||||
getCallback().onGetItem(getInstance(), browser, mediaId),
|
callback.onGetItem(instance, browser, mediaId), "onGetItem must return non-null future");
|
||||||
"onGetItem must return non-null future");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> onGetChildrenOnHandler(
|
public ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> onGetChildrenOnHandler(
|
||||||
@ -138,7 +143,7 @@ import java.util.concurrent.Future;
|
|||||||
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
||||||
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> future =
|
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> future =
|
||||||
checkNotNull(
|
checkNotNull(
|
||||||
getCallback().onGetChildren(getInstance(), browser, parentId, page, pageSize, params),
|
callback.onGetChildren(instance, browser, parentId, page, pageSize, params),
|
||||||
"onGetChildren must return non-null future");
|
"onGetChildren must return non-null future");
|
||||||
future.addListener(
|
future.addListener(
|
||||||
() -> {
|
() -> {
|
||||||
@ -170,7 +175,7 @@ import java.util.concurrent.Future;
|
|||||||
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
||||||
ListenableFuture<LibraryResult<Void>> future =
|
ListenableFuture<LibraryResult<Void>> future =
|
||||||
checkNotNull(
|
checkNotNull(
|
||||||
getCallback().onSubscribe(getInstance(), browser, parentId, params),
|
callback.onSubscribe(instance, browser, parentId, params),
|
||||||
"onSubscribe must return non-null future");
|
"onSubscribe must return non-null future");
|
||||||
|
|
||||||
// When error happens, remove from the subscription list.
|
// When error happens, remove from the subscription list.
|
||||||
@ -194,7 +199,7 @@ import java.util.concurrent.Future;
|
|||||||
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
||||||
ListenableFuture<LibraryResult<Void>> future =
|
ListenableFuture<LibraryResult<Void>> future =
|
||||||
checkNotNull(
|
checkNotNull(
|
||||||
getCallback().onUnsubscribe(getInstance(), browser, parentId),
|
callback.onUnsubscribe(instance, browser, parentId),
|
||||||
"onUnsubscribe must return non-null future");
|
"onUnsubscribe must return non-null future");
|
||||||
|
|
||||||
future.addListener(
|
future.addListener(
|
||||||
@ -213,7 +218,7 @@ import java.util.concurrent.Future;
|
|||||||
// onSearch is defined to return a non-null result but it's implemented by applications,
|
// onSearch is defined to return a non-null result but it's implemented by applications,
|
||||||
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
// so we explicitly null-check the result to fail early if an app accidentally returns null.
|
||||||
return checkNotNull(
|
return checkNotNull(
|
||||||
getCallback().onSearch(getInstance(), browser, query, params),
|
callback.onSearch(instance, browser, query, params),
|
||||||
"onSearch must return non-null future");
|
"onSearch must return non-null future");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +233,7 @@ import java.util.concurrent.Future;
|
|||||||
// returns null.
|
// returns null.
|
||||||
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> future =
|
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> future =
|
||||||
checkNotNull(
|
checkNotNull(
|
||||||
getCallback().onGetSearchResult(getInstance(), browser, query, page, pageSize, params),
|
callback.onGetSearchResult(instance, browser, query, page, pageSize, params),
|
||||||
"onGetSearchResult must return non-null future");
|
"onGetSearchResult must return non-null future");
|
||||||
future.addListener(
|
future.addListener(
|
||||||
() -> {
|
() -> {
|
||||||
@ -241,16 +246,6 @@ import java.util.concurrent.Future;
|
|||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected MediaLibrarySession getInstance() {
|
|
||||||
return (MediaLibrarySession) super.getInstance();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected MediaLibrarySession.MediaLibrarySessionCallback getCallback() {
|
|
||||||
return (MediaLibrarySession.MediaLibrarySessionCallback) super.getCallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
protected MediaLibraryServiceLegacyStub getLegacyBrowserService() {
|
protected MediaLibraryServiceLegacyStub getLegacyBrowserService() {
|
||||||
|
@ -1018,21 +1018,6 @@ public class MediaSession {
|
|||||||
* Called to fill in the {@link MediaItem#localConfiguration} of the media item from
|
* Called to fill in the {@link MediaItem#localConfiguration} of the media item from
|
||||||
* controllers.
|
* controllers.
|
||||||
*
|
*
|
||||||
* <p>Specifically, it's called by the following methods
|
|
||||||
*
|
|
||||||
* <ol>
|
|
||||||
* <li>{@link MediaController#setMediaItem(MediaItem)}
|
|
||||||
* <li>{@link MediaController#setMediaItem(MediaItem,long)}
|
|
||||||
* <li>{@link MediaController#setMediaItem(MediaItem, boolean)}
|
|
||||||
* <li>{@link MediaController#setMediaItems(List)}
|
|
||||||
* <li>{@link MediaController#setMediaItems(List, boolean)}
|
|
||||||
* <li>{@link MediaController#setMediaItems(List, int, long)}
|
|
||||||
* <li>{@link MediaController#addMediaItem(MediaItem)}
|
|
||||||
* <li>{@link MediaController#addMediaItem(int, MediaItem)}
|
|
||||||
* <li>{@link MediaController#addMediaItems(List)}
|
|
||||||
* <li>{@link MediaController#addMediaItems(int, List)}
|
|
||||||
* </ol>
|
|
||||||
*
|
|
||||||
* @param session The session for this event.
|
* @param session The session for this event.
|
||||||
* @param controller The controller information.
|
* @param controller The controller information.
|
||||||
* @param mediaItem The media item whose local configuration will be filled in.
|
* @param mediaItem The media item whose local configuration will be filled in.
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.session;
|
package androidx.media3.session;
|
||||||
|
|
||||||
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.common.util.Assertions.checkStateNotNull;
|
import static androidx.media3.common.util.Assertions.checkStateNotNull;
|
||||||
import static androidx.media3.common.util.Util.castNonNull;
|
import static androidx.media3.common.util.Util.castNonNull;
|
||||||
import static androidx.media3.common.util.Util.postOrRun;
|
import static androidx.media3.common.util.Util.postOrRun;
|
||||||
@ -57,6 +58,7 @@ import androidx.media3.common.Player;
|
|||||||
import androidx.media3.common.Player.DiscontinuityReason;
|
import androidx.media3.common.Player.DiscontinuityReason;
|
||||||
import androidx.media3.common.Player.PositionInfo;
|
import androidx.media3.common.Player.PositionInfo;
|
||||||
import androidx.media3.common.Player.RepeatMode;
|
import androidx.media3.common.Player.RepeatMode;
|
||||||
|
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.VideoSize;
|
import androidx.media3.common.VideoSize;
|
||||||
@ -346,13 +348,7 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
public ListenableFuture<SessionResult> setCustomLayout(
|
public ListenableFuture<SessionResult> setCustomLayout(
|
||||||
ControllerInfo controller, List<CommandButton> layout) {
|
ControllerInfo controller, List<CommandButton> layout) {
|
||||||
return dispatchRemoteControllerTask(
|
return dispatchRemoteControllerTask(
|
||||||
controller,
|
controller, (controller1, seq) -> controller1.setCustomLayout(seq, layout));
|
||||||
new RemoteControllerTask() {
|
|
||||||
@Override
|
|
||||||
public void run(ControllerCb controller, int seq) throws RemoteException {
|
|
||||||
controller.setCustomLayout(seq, layout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAvailableCommands(
|
public void setAvailableCommands(
|
||||||
@ -363,12 +359,8 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
.updateCommandsFromSession(controller, sessionCommands, playerCommands);
|
.updateCommandsFromSession(controller, sessionCommands, playerCommands);
|
||||||
dispatchRemoteControllerTaskWithoutReturn(
|
dispatchRemoteControllerTaskWithoutReturn(
|
||||||
controller,
|
controller,
|
||||||
new RemoteControllerTask() {
|
(callback, seq) ->
|
||||||
@Override
|
callback.onAvailableCommandsChangedFromSession(seq, sessionCommands, playerCommands));
|
||||||
public void run(ControllerCb callback, int seq) throws RemoteException {
|
|
||||||
callback.onAvailableCommandsChangedFromSession(seq, sessionCommands, playerCommands);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
onPlayerInfoChangedHandler.sendPlayerInfoChangedMessage(/* excludeTimeline= */ false);
|
onPlayerInfoChangedHandler.sendPlayerInfoChangedMessage(/* excludeTimeline= */ false);
|
||||||
} else {
|
} else {
|
||||||
sessionLegacyStub
|
sessionLegacyStub
|
||||||
@ -438,6 +430,50 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
controller, (cb, seq) -> cb.sendCustomCommand(seq, command, args));
|
controller, (cb, seq) -> cb.sendCustomCommand(seq, command, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MediaSession.ConnectionResult onConnectOnHandler(ControllerInfo controller) {
|
||||||
|
return checkNotNull(
|
||||||
|
callback.onConnect(instance, controller), "onConntext must return non-null future");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPostConnectOnHandler(ControllerInfo controller) {
|
||||||
|
callback.onPostConnect(instance, controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDisconnectedOnHandler(ControllerInfo controller) {
|
||||||
|
callback.onDisconnected(instance, controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
public @SessionResult.Code int onSetMediaUriOnHandler(
|
||||||
|
ControllerInfo controller, Uri uri, Bundle extras) {
|
||||||
|
return callback.onSetMediaUri(instance, controller, uri, extras);
|
||||||
|
}
|
||||||
|
|
||||||
|
public @SessionResult.Code int onPlayerCommandRequestOnHandler(
|
||||||
|
ControllerInfo controller, @Player.Command int playerCommand) {
|
||||||
|
return callback.onPlayerCommandRequest(instance, controller, playerCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListenableFuture<SessionResult> onSetRatingOnHandler(
|
||||||
|
ControllerInfo controller, String mediaId, Rating rating) {
|
||||||
|
return checkNotNull(
|
||||||
|
callback.onSetRating(instance, controller, mediaId, rating),
|
||||||
|
"onSetRating must return non-null future");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListenableFuture<SessionResult> onSetRatingOnHandler(
|
||||||
|
ControllerInfo controller, Rating rating) {
|
||||||
|
return checkNotNull(
|
||||||
|
callback.onSetRating(instance, controller, rating),
|
||||||
|
"onSetRating must return non-null future");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListenableFuture<SessionResult> onCustomCommandOnHandler(
|
||||||
|
ControllerInfo browser, SessionCommand command, Bundle extras) {
|
||||||
|
return checkNotNull(
|
||||||
|
callback.onCustomCommand(instance, browser, command, extras),
|
||||||
|
"onCustomCommandOnHandler must return non-null future");
|
||||||
|
}
|
||||||
|
|
||||||
public void connectFromService(
|
public void connectFromService(
|
||||||
IMediaController caller,
|
IMediaController caller,
|
||||||
int controllerVersion,
|
int controllerVersion,
|
||||||
@ -457,10 +493,6 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
sessionLegacyStub.setLegacyControllerDisconnectTimeoutMs(timeoutMs);
|
sessionLegacyStub.setLegacyControllerDisconnectTimeoutMs(timeoutMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MediaSession getInstance() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Context getContext() {
|
protected Context getContext() {
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
@ -469,12 +501,9 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
return applicationHandler;
|
return applicationHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SessionCallback getCallback() {
|
protected MediaItem fillInLocalConfiguration(
|
||||||
return callback;
|
MediaSession.ControllerInfo controller, MediaItem mediaItem) {
|
||||||
}
|
return mediaItemFiller.fillInLocalConfiguration(instance, controller, mediaItem);
|
||||||
|
|
||||||
protected MediaItemFiller getMediaItemFiller() {
|
|
||||||
return mediaItemFiller;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isReleased() {
|
protected boolean isReleased() {
|
||||||
|
@ -177,15 +177,8 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
command,
|
command,
|
||||||
controller -> {
|
controller -> {
|
||||||
ListenableFuture<SessionResult> future =
|
ListenableFuture<SessionResult> future =
|
||||||
checkNotNull(
|
sessionImpl.onCustomCommandOnHandler(
|
||||||
sessionImpl
|
controller, command, args == null ? Bundle.EMPTY : args);
|
||||||
.getCallback()
|
|
||||||
.onCustomCommand(
|
|
||||||
sessionImpl.getInstance(),
|
|
||||||
controller,
|
|
||||||
command,
|
|
||||||
args == null ? Bundle.EMPTY : args),
|
|
||||||
"SessionCallback#onCustomCommand must not return null");
|
|
||||||
if (cb != null) {
|
if (cb != null) {
|
||||||
sendCustomCommandResultWhenReady(cb, future);
|
sendCustomCommandResultWhenReady(cb, future);
|
||||||
} else {
|
} else {
|
||||||
@ -280,13 +273,8 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
dispatchSessionTaskWithSessionCommand(
|
dispatchSessionTaskWithSessionCommand(
|
||||||
SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI,
|
SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI,
|
||||||
controller -> {
|
controller -> {
|
||||||
if (sessionImpl
|
if (sessionImpl.onSetMediaUriOnHandler(
|
||||||
.getCallback()
|
controller, mediaUri, extras == null ? Bundle.EMPTY : extras)
|
||||||
.onSetMediaUri(
|
|
||||||
sessionImpl.getInstance(),
|
|
||||||
controller,
|
|
||||||
mediaUri,
|
|
||||||
extras == null ? Bundle.EMPTY : extras)
|
|
||||||
== RESULT_SUCCESS) {
|
== RESULT_SUCCESS) {
|
||||||
sessionImpl.getPlayerWrapper().prepare();
|
sessionImpl.getPlayerWrapper().prepare();
|
||||||
}
|
}
|
||||||
@ -330,13 +318,8 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
dispatchSessionTaskWithSessionCommand(
|
dispatchSessionTaskWithSessionCommand(
|
||||||
SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI,
|
SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI,
|
||||||
controller -> {
|
controller -> {
|
||||||
if (sessionImpl
|
if (sessionImpl.onSetMediaUriOnHandler(
|
||||||
.getCallback()
|
controller, mediaUri, extras == null ? Bundle.EMPTY : extras)
|
||||||
.onSetMediaUri(
|
|
||||||
sessionImpl.getInstance(),
|
|
||||||
controller,
|
|
||||||
mediaUri,
|
|
||||||
extras == null ? Bundle.EMPTY : extras)
|
|
||||||
== RESULT_SUCCESS) {
|
== RESULT_SUCCESS) {
|
||||||
sessionImpl.getPlayerWrapper().play();
|
sessionImpl.getPlayerWrapper().play();
|
||||||
}
|
}
|
||||||
@ -440,10 +423,7 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// MediaControllerCompat#setRating doesn't return a value.
|
// MediaControllerCompat#setRating doesn't return a value.
|
||||||
ignoreFuture(
|
ignoreFuture(sessionImpl.onSetRatingOnHandler(controller, currentItem.mediaId, rating));
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onSetRating(sessionImpl.getInstance(), controller, currentItem.mediaId, rating));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,10 +577,7 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
if (!connectedControllersManager.isPlayerCommandAvailable(controller, command)) {
|
if (!connectedControllersManager.isPlayerCommandAvailable(controller, command)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int resultCode =
|
int resultCode = sessionImpl.onPlayerCommandRequestOnHandler(controller, command);
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onPlayerCommandRequest(sessionImpl.getInstance(), controller, command);
|
|
||||||
if (resultCode != RESULT_SUCCESS) {
|
if (resultCode != RESULT_SUCCESS) {
|
||||||
// Don't run rejected command.
|
// Don't run rejected command.
|
||||||
return;
|
return;
|
||||||
@ -702,8 +679,7 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
|||||||
sessionManager.isTrustedForMediaControl(remoteUserInfo),
|
sessionManager.isTrustedForMediaControl(remoteUserInfo),
|
||||||
controllerCb,
|
controllerCb,
|
||||||
/* connectionHints= */ Bundle.EMPTY);
|
/* connectionHints= */ Bundle.EMPTY);
|
||||||
MediaSession.ConnectionResult connectionResult =
|
MediaSession.ConnectionResult connectionResult = sessionImpl.onConnectOnHandler(controller);
|
||||||
sessionImpl.getCallback().onConnect(sessionImpl.getInstance(), controller);
|
|
||||||
if (!connectionResult.isAccepted) {
|
if (!connectionResult.isAccepted) {
|
||||||
try {
|
try {
|
||||||
controllerCb.onDisconnected(/* seq= */ 0);
|
controllerCb.onDisconnected(/* seq= */ 0);
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.session;
|
package androidx.media3.session;
|
||||||
|
|
||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
|
||||||
import static androidx.media3.common.util.Util.postOrRun;
|
import static androidx.media3.common.util.Util.postOrRun;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -69,10 +68,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
|||||||
postOrRun(
|
postOrRun(
|
||||||
sessionImpl.getApplicationHandler(),
|
sessionImpl.getApplicationHandler(),
|
||||||
() -> {
|
() -> {
|
||||||
resultReference.set(
|
resultReference.set(sessionImpl.onConnectOnHandler(controller));
|
||||||
checkNotNull(
|
|
||||||
sessionImpl.getCallback().onConnect(sessionImpl.getInstance(), controller),
|
|
||||||
"onConnect must return non-null future"));
|
|
||||||
haveResult.open();
|
haveResult.open();
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
|
@ -220,10 +220,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@SessionResult.Code
|
@SessionResult.Code
|
||||||
int resultCode =
|
int resultCode = sessionImpl.onPlayerCommandRequestOnHandler(controller, command);
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onPlayerCommandRequest(sessionImpl.getInstance(), controller, command);
|
|
||||||
if (resultCode != SessionResult.RESULT_SUCCESS) {
|
if (resultCode != SessionResult.RESULT_SUCCESS) {
|
||||||
// Don't run rejected command.
|
// Don't run rejected command.
|
||||||
sendSessionResult(controller, seq, new SessionResult(resultCode));
|
sendSessionResult(controller, seq, new SessionResult(resultCode));
|
||||||
@ -346,7 +343,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
checkStateNotNull((Controller2Cb) controllerInfo.getControllerCb())
|
checkStateNotNull((Controller2Cb) controllerInfo.getControllerCb())
|
||||||
.getCallbackBinder();
|
.getCallbackBinder();
|
||||||
MediaSession.ConnectionResult connectionResult =
|
MediaSession.ConnectionResult connectionResult =
|
||||||
sessionImpl.getCallback().onConnect(sessionImpl.getInstance(), controllerInfo);
|
sessionImpl.onConnectOnHandler(controllerInfo);
|
||||||
// Don't reject connection for the request from trusted app.
|
// Don't reject connection for the request from trusted app.
|
||||||
// Otherwise server will fail to retrieve session's information to dispatch
|
// Otherwise server will fail to retrieve session's information to dispatch
|
||||||
// media keys to.
|
// media keys to.
|
||||||
@ -406,7 +403,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
// Controller may be died prematurely.
|
// Controller may be died prematurely.
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionImpl.getCallback().onPostConnect(sessionImpl.getInstance(), controllerInfo);
|
sessionImpl.onPostConnectOnHandler(controllerInfo);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
caller.onDisconnected(0);
|
caller.onDisconnected(0);
|
||||||
@ -674,10 +671,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
seq,
|
seq,
|
||||||
command,
|
command,
|
||||||
(sessionImpl, controller) ->
|
(sessionImpl, controller) ->
|
||||||
checkNotNull(
|
sessionImpl.onCustomCommandOnHandler(controller, command, args),
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onCustomCommand(sessionImpl.getInstance(), controller, command, args)),
|
|
||||||
MediaSessionStub::sendSessionResultWhenReady);
|
MediaSessionStub::sendSessionResultWhenReady);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -702,11 +696,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
caller,
|
caller,
|
||||||
seq,
|
seq,
|
||||||
COMMAND_CODE_SESSION_SET_RATING,
|
COMMAND_CODE_SESSION_SET_RATING,
|
||||||
(sessionImpl, controller) ->
|
(sessionImpl, controller) -> sessionImpl.onSetRatingOnHandler(controller, mediaId, rating),
|
||||||
checkNotNull(
|
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onSetRating(sessionImpl.getInstance(), controller, mediaId, rating)),
|
|
||||||
MediaSessionStub::sendSessionResultWhenReady);
|
MediaSessionStub::sendSessionResultWhenReady);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -726,11 +716,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
caller,
|
caller,
|
||||||
seq,
|
seq,
|
||||||
COMMAND_CODE_SESSION_SET_RATING,
|
COMMAND_CODE_SESSION_SET_RATING,
|
||||||
(sessionImpl, controller) ->
|
(sessionImpl, controller) -> sessionImpl.onSetRatingOnHandler(controller, rating),
|
||||||
checkNotNull(
|
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onSetRating(sessionImpl.getInstance(), controller, rating)),
|
|
||||||
MediaSessionStub::sendSessionResultWhenReady);
|
MediaSessionStub::sendSessionResultWhenReady);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -788,9 +774,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
COMMAND_CHANGE_MEDIA_ITEMS,
|
COMMAND_CHANGE_MEDIA_ITEMS,
|
||||||
(sessionImpl, controller) -> {
|
(sessionImpl, controller) -> {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
sessionImpl.getPlayerWrapper().setMediaItem(mediaItemWithPlaybackProperties);
|
sessionImpl.getPlayerWrapper().setMediaItem(mediaItemWithPlaybackProperties);
|
||||||
return SessionResult.RESULT_SUCCESS;
|
return SessionResult.RESULT_SUCCESS;
|
||||||
},
|
},
|
||||||
@ -819,9 +803,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
COMMAND_CHANGE_MEDIA_ITEMS,
|
COMMAND_CHANGE_MEDIA_ITEMS,
|
||||||
(sessionImpl, controller) -> {
|
(sessionImpl, controller) -> {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
sessionImpl
|
sessionImpl
|
||||||
.getPlayerWrapper()
|
.getPlayerWrapper()
|
||||||
.setMediaItem(mediaItemWithPlaybackProperties, startPositionMs);
|
.setMediaItem(mediaItemWithPlaybackProperties, startPositionMs);
|
||||||
@ -852,9 +834,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
COMMAND_CHANGE_MEDIA_ITEMS,
|
COMMAND_CHANGE_MEDIA_ITEMS,
|
||||||
(sessionImpl, controller) -> {
|
(sessionImpl, controller) -> {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
sessionImpl
|
sessionImpl
|
||||||
.getPlayerWrapper()
|
.getPlayerWrapper()
|
||||||
.setMediaItem(mediaItemWithPlaybackProperties, resetPosition);
|
.setMediaItem(mediaItemWithPlaybackProperties, resetPosition);
|
||||||
@ -888,9 +868,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
ImmutableList.builder();
|
ImmutableList.builder();
|
||||||
for (MediaItem mediaItem : mediaItemList) {
|
for (MediaItem mediaItem : mediaItemList) {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
mediaItemWithPlaybackPropertiesListBuilder.add(mediaItemWithPlaybackProperties);
|
mediaItemWithPlaybackPropertiesListBuilder.add(mediaItemWithPlaybackProperties);
|
||||||
}
|
}
|
||||||
sessionImpl
|
sessionImpl
|
||||||
@ -928,9 +906,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
ImmutableList.builder();
|
ImmutableList.builder();
|
||||||
for (MediaItem mediaItem : mediaItemList) {
|
for (MediaItem mediaItem : mediaItemList) {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
mediaItemWithPlaybackPropertiesListBuilder.add(mediaItemWithPlaybackProperties);
|
mediaItemWithPlaybackPropertiesListBuilder.add(mediaItemWithPlaybackProperties);
|
||||||
}
|
}
|
||||||
sessionImpl
|
sessionImpl
|
||||||
@ -969,9 +945,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
ImmutableList.builder();
|
ImmutableList.builder();
|
||||||
for (MediaItem mediaItem : mediaItemList) {
|
for (MediaItem mediaItem : mediaItemList) {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
mediaItemWithPlaybackPropertiesListBuilder.add(mediaItemWithPlaybackProperties);
|
mediaItemWithPlaybackPropertiesListBuilder.add(mediaItemWithPlaybackProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -995,10 +969,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
seq,
|
seq,
|
||||||
COMMAND_CODE_SESSION_SET_MEDIA_URI,
|
COMMAND_CODE_SESSION_SET_MEDIA_URI,
|
||||||
(sessionImpl, controller) ->
|
(sessionImpl, controller) ->
|
||||||
new SessionResult(
|
new SessionResult(sessionImpl.onSetMediaUriOnHandler(controller, uri, extras)),
|
||||||
sessionImpl
|
|
||||||
.getCallback()
|
|
||||||
.onSetMediaUri(sessionImpl.getInstance(), controller, uri, extras)),
|
|
||||||
MediaSessionStub::sendSessionResult);
|
MediaSessionStub::sendSessionResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1044,9 +1015,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
COMMAND_CHANGE_MEDIA_ITEMS,
|
COMMAND_CHANGE_MEDIA_ITEMS,
|
||||||
(sessionImpl, controller) -> {
|
(sessionImpl, controller) -> {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
sessionImpl.getPlayerWrapper().addMediaItem(mediaItemWithPlaybackProperties);
|
sessionImpl.getPlayerWrapper().addMediaItem(mediaItemWithPlaybackProperties);
|
||||||
return SessionResult.RESULT_SUCCESS;
|
return SessionResult.RESULT_SUCCESS;
|
||||||
},
|
},
|
||||||
@ -1072,9 +1041,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
COMMAND_CHANGE_MEDIA_ITEMS,
|
COMMAND_CHANGE_MEDIA_ITEMS,
|
||||||
(sessionImpl, controller) -> {
|
(sessionImpl, controller) -> {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
sessionImpl.getPlayerWrapper().addMediaItem(index, mediaItemWithPlaybackProperties);
|
sessionImpl.getPlayerWrapper().addMediaItem(index, mediaItemWithPlaybackProperties);
|
||||||
return SessionResult.RESULT_SUCCESS;
|
return SessionResult.RESULT_SUCCESS;
|
||||||
},
|
},
|
||||||
@ -1105,9 +1072,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
ImmutableList.builder();
|
ImmutableList.builder();
|
||||||
for (MediaItem mediaItem : mediaItems) {
|
for (MediaItem mediaItem : mediaItems) {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
mediaItemsWithPlaybackPropertiesBuilder.add(mediaItemWithPlaybackProperties);
|
mediaItemsWithPlaybackPropertiesBuilder.add(mediaItemWithPlaybackProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1146,9 +1111,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
ImmutableList.builder();
|
ImmutableList.builder();
|
||||||
for (MediaItem mediaItem : mediaItems) {
|
for (MediaItem mediaItem : mediaItems) {
|
||||||
MediaItem mediaItemWithPlaybackProperties =
|
MediaItem mediaItemWithPlaybackProperties =
|
||||||
sessionImpl
|
sessionImpl.fillInLocalConfiguration(controller, mediaItem);
|
||||||
.getMediaItemFiller()
|
|
||||||
.fillInLocalConfiguration(sessionImpl.getInstance(), controller, mediaItem);
|
|
||||||
mediaItemsWithPlaybackPropertiesBuilder.add(mediaItemWithPlaybackProperties);
|
mediaItemsWithPlaybackPropertiesBuilder.add(mediaItemWithPlaybackProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user