diff --git a/api.txt b/api.txt index f61a17607b..b644792397 100644 --- a/api.txt +++ b/api.txt @@ -1761,6 +1761,7 @@ package androidx.media3.session { method public int getControllerVersion(); method public String getPackageName(); method public int getUid(); + field public static final String LEGACY_CONTROLLER_PACKAGE_NAME = "android.media.session.MediaController"; field public static final int LEGACY_CONTROLLER_VERSION = 0; // 0x0 } diff --git a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java index 148c6372c7..d4ad90736c 100644 --- a/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java +++ b/libraries/session/src/main/java/androidx/media3/session/LibraryResult.java @@ -23,8 +23,6 @@ import static java.lang.annotation.ElementType.TYPE_USE; import android.os.Bundle; import android.os.IBinder; import android.os.SystemClock; -import android.support.v4.media.session.MediaControllerCompat; -import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.core.app.BundleCompat; @@ -78,8 +76,9 @@ public final class LibraryResult implements Bundleable { * Result code representing that the command is successfully completed. * *

Interoperability: This code is also used to tell that the command was successfully sent, but - * the result is unknown when connected with {@link MediaSessionCompat} or {@link - * MediaControllerCompat}. + * the result is unknown when connected with {@code + * android.support.v4.media.session.MediaSessionCompat} or {@code + * android.support.v4.media.session.MediaControllerCompat}. */ public static final int RESULT_SUCCESS = 0; diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaBrowser.java b/libraries/session/src/main/java/androidx/media3/session/MediaBrowser.java index 2ca3302c53..d039c0e965 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaBrowser.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaBrowser.java @@ -26,7 +26,6 @@ import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.media3.common.MediaItem; @@ -87,7 +86,7 @@ public final class MediaBrowser extends MediaController { * of this bundle may affect the connection result. * *

The hints are only used when connecting to the {@link MediaSession}. They will be ignored - * when connecting to {@link MediaSessionCompat}. + * when connecting to {@code android.support.v4.media.session.MediaSessionCompat}. * * @param connectionHints A bundle containing the connection hints. * @return The builder to allow chaining. diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaConstants.java b/libraries/session/src/main/java/androidx/media3/session/MediaConstants.java index 902c766e13..b15dc34abd 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaConstants.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaConstants.java @@ -19,9 +19,6 @@ import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; -import android.support.v4.media.MediaDescriptionCompat; -import android.support.v4.media.session.MediaControllerCompat; -import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaMetadata; @@ -108,9 +105,7 @@ public final class MediaConstants { * androidx.media3.common.Player#COMMAND_SEEK_TO_NEXT} by design. * * @see MediaSession#setSessionExtras(Bundle) - * @see MediaSessionCompat#setExtras(Bundle) * @see MediaController.Listener#onExtrasChanged(MediaController, Bundle) - * @see MediaControllerCompat.Callback#onExtrasChanged(Bundle) * @see androidx.media3.common.Player#COMMAND_SEEK_TO_NEXT * @see androidx.media3.common.Player#COMMAND_SEEK_TO_NEXT_MEDIA_ITEM */ @@ -126,9 +121,7 @@ public final class MediaConstants { * androidx.media3.common.Player#COMMAND_SEEK_TO_PREVIOUS} by design. * * @see MediaSession#setSessionExtras(Bundle) - * @see MediaSessionCompat#setExtras(Bundle) * @see MediaController.Listener#onExtrasChanged(MediaController, Bundle) - * @see MediaControllerCompat.Callback#onExtrasChanged(Bundle) * @see androidx.media3.common.Player#COMMAND_SEEK_TO_PREVIOUS * @see androidx.media3.common.Player#COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM */ @@ -457,9 +450,9 @@ public final class MediaConstants { .BROWSER_SERVICE_EXTRAS_KEY_APPLICATION_PREFERENCES_USING_CAR_APP_LIBRARY_INTENT; /** - * {@link Bundle} key used to indicate the {@link MediaMetadata.MediaType} in the legacy {@link - * MediaDescriptionCompat} as a long {@link MediaDescriptionCompat#getExtras() extra} and as a - * long value in {@link android.support.v4.media.MediaMetadataCompat}. + * {@link Bundle} key used to indicate the {@link MediaMetadata.MediaType} in the legacy {@code + * android.support.v4.media.MediaDescriptionCompat} as a long extra and as a long value in {@code + * android.support.v4.media.MediaMetadataCompat}. */ @UnstableApi public static final String EXTRAS_KEY_MEDIA_TYPE_COMPAT = diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaController.java b/libraries/session/src/main/java/androidx/media3/session/MediaController.java index 7b09c3d223..c31f3fdc09 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaController.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaController.java @@ -28,8 +28,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v4.media.MediaBrowserCompat; -import android.support.v4.media.session.MediaControllerCompat; -import android.support.v4.media.session.MediaSessionCompat; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -119,7 +117,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * *

The app targeting API level 30 or higher must include a {@code } element in their * manifest to connect to a service component of another app like {@link MediaSessionService}, - * {@link MediaLibraryService}, or {@link androidx.media.MediaBrowserServiceCompat}). See the + * {@link MediaLibraryService}, or {@code androidx.media.MediaBrowserServiceCompat}). See the * following example and this * guide for more information. * @@ -141,28 +139,29 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; *

Backward Compatibility with legacy media sessions

* *

In addition to {@link MediaSession}, the controller also supports connecting to a legacy media - * session - {@linkplain android.media.session.MediaSession framework session} and {@linkplain - * MediaSessionCompat AndroidX session compat}. + * session - {@link android.media.session.MediaSession} and {@code + * android.support.v4.media.session.MediaSessionCompat}. * *

To request legacy sessions to play media, use one of the {@link #setMediaItem} methods and set * either {@link MediaItem#mediaId}, {@link MediaItem.RequestMetadata#mediaUri} or {@link * MediaItem.RequestMetadata#searchQuery}. Once the controller is {@linkplain #prepare() prepared}, - * the controller triggers one of the following callbacks depending on the provided information and - * the value of {@link #getPlayWhenReady()}: + * the controller triggers one of the following methods on {@code + * android.support.v4.media.session.MediaSessionCompat.Callback} depending on the provided + * information and the value of {@link #getPlayWhenReady()}: * *

* * Other playlist change methods, like {@link #addMediaItem} or {@link #removeMediaItem}, trigger - * the {@link MediaSessionCompat.Callback#onAddQueueItem onAddQueueItem} and {@link - * MediaSessionCompat.Callback#onRemoveQueueItem} onRemoveQueueItem} callbacks. Check {@link - * #getAvailableCommands()} to see if playlist modifications are {@linkplain + * the {@code MediaSessionCompat.Callback.onAddQueueItem} and {@code + * MediaSessionCompat.Callback.onRemoveQueueItem} callbacks. Check {@link #getAvailableCommands()} + * to see if playlist modifications are {@linkplain * androidx.media3.common.Player#COMMAND_CHANGE_MEDIA_ITEMS supported} by the legacy session. */ @DoNotMock @@ -247,7 +246,7 @@ public class MediaController implements Player { * of this bundle may affect the connection result. * *

The hints are only used when connecting to the {@link MediaSession}. They will be ignored - * when connecting to {@link MediaSessionCompat}. + * when connecting to {@code android.support.v4.media.session.MediaSessionCompat}. * * @param connectionHints A bundle containing the connection hints. * @return The builder to allow chaining. @@ -664,7 +663,8 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link MediaSessionCompat}, it returns {code 0}. + *

Interoperability: When connected to {@code + * android.support.v4.media.session.MediaSessionCompat}, it returns {code 0}. */ @Override public final long getSeekBackIncrement() { @@ -675,8 +675,9 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link MediaSessionCompat}, it calls {@link - * MediaControllerCompat.TransportControls#rewind()}. + *

Interoperability: When connected to {@code + * android.support.v4.media.session.MediaSessionCompat}, it calls {@code + * android.support.v4.media.session.MediaControllerCompat.TransportControls.rewind()}. */ @Override public final void seekBack() { @@ -691,7 +692,8 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link MediaSessionCompat}, it returns {code 0}. + *

Interoperability: When connected to {@code + * android.support.v4.media.session.MediaSessionCompat}, it returns {code 0}. */ @Override public final long getSeekForwardIncrement() { @@ -702,8 +704,9 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link MediaSessionCompat}, it calls {@link - * MediaControllerCompat.TransportControls#fastForward()}. + *

Interoperability: When connected to {@code + * android.support.v4.media.session.MediaSessionCompat}, it calls {@code + * android.support.v4.media.session.MediaControllerCompat.TransportControls.fastForward()}. */ @Override public final void seekForward() { @@ -808,7 +811,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link #getDuration()} * to match the behavior with {@link #getContentPosition()} and {@link * #getContentBufferedPosition()}. @@ -822,7 +825,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link * #getCurrentPosition()} because content position isn't available. */ @@ -835,7 +838,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link * #getBufferedPosition()} because content buffered position isn't available. */ @@ -950,7 +953,7 @@ public class MediaController implements Player { *

A command is not accepted if it is not a custom command or the command is not in the list of * {@linkplain #getAvailableSessionCommands() available session commands}. * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, {@link SessionResult#resultCode} will * return the custom result code from the {@code android.os.ResultReceiver#onReceiveResult(int, * Bundle)} instead of the standard result codes defined in the {@link SessionResult}. @@ -1345,7 +1348,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, this will always return {@link * C#INDEX_UNSET} even when {@link #hasPreviousMediaItem()} is {@code true}. */ @@ -1368,7 +1371,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, this will always return {@link * C#INDEX_UNSET} even when {@link #hasNextMediaItem()} is {@code true}. */ @@ -1463,7 +1466,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link #seekToPrevious}. */ @Override @@ -1489,7 +1492,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it's the same as {@link #seekToNext}. */ @Override @@ -1505,7 +1508,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it won't update the current media item * index immediately because the previous media item index is unknown. */ @@ -1522,7 +1525,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it always returns {@code 0}. */ @Override @@ -1534,7 +1537,7 @@ public class MediaController implements Player { /** * {@inheritDoc} * - *

Interoperability: When connected to {@link + *

Interoperability: When connected to {@code * android.support.v4.media.session.MediaSessionCompat}, it won't update the current media item * index immediately because the previous media item index is unknown. */ diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaLibraryService.java b/libraries/session/src/main/java/androidx/media3/session/MediaLibraryService.java index 2968be8f87..20fcbf53c4 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaLibraryService.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaLibraryService.java @@ -30,7 +30,6 @@ import android.os.Bundle; import android.os.IBinder; import androidx.annotation.IntRange; import androidx.annotation.Nullable; -import androidx.media.MediaSessionManager.RemoteUserInfo; import androidx.media3.common.Bundleable; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaMetadata; @@ -63,7 +62,7 @@ import java.util.List; * } * *

You may also declare {@code android.media.browse.MediaBrowserService} for compatibility with - * {@link android.support.v4.media.MediaBrowserCompat} so that this service can handle the case. + * {@code android.support.v4.media.MediaBrowserCompat} so that this service can handle the case. * * @see MediaSessionService */ @@ -78,7 +77,7 @@ public abstract class MediaLibraryService extends MediaSessionService { * *

Backward compatibility with legacy media browser APIs

* - *

A library session supports connection from both {@link MediaBrowser} and {@link + *

A library session supports connection from both {@link MediaBrowser} and {@code * android.support.v4.media.MediaBrowserCompat}, but the {@link ControllerInfo} may not be * precise. Here are the details. * @@ -107,7 +106,7 @@ public abstract class MediaLibraryService extends MediaSessionService { * {@code 21 <= SDK_INT < 28}
* for other {@link Callback callbacks} * - * {@link RemoteUserInfo#LEGACY_CONTROLLER} + * {@link ControllerInfo#LEGACY_CONTROLLER_PACKAGE_NAME} * Negative value * * @@ -144,10 +143,10 @@ public abstract class MediaLibraryService extends MediaSessionService { * MediaItem#mediaId}. The media id is required for the browser to get the children under the * root. * - *

Interoperability: If this callback is called because a legacy {@link - * android.support.v4.media.MediaBrowserCompat} has requested a {@link + *

Interoperability: If this callback is called because a legacy {@code + * android.support.v4.media.MediaBrowserCompat} has requested a {@code * androidx.media.MediaBrowserServiceCompat.BrowserRoot}, then the main thread may be blocked - * until the returned future is done. If your service may be queried by a legacy {@link + * until the returned future is done. If your service may be queried by a legacy {@code * android.support.v4.media.MediaBrowserCompat}, you should ensure that the future completes * quickly to avoid blocking the main thread for a long period of time. * @@ -246,8 +245,8 @@ public abstract class MediaLibraryService extends MediaSessionService { *

The {@link LibraryResult#params} returned to the caller should be the same as the {@link * LibraryParams params} passed into this method. * - *

Interoperability: This will be called by {@link - * android.support.v4.media.MediaBrowserCompat#subscribe}, but won't be called by {@link + *

Interoperability: This will be called by {@code + * android.support.v4.media.MediaBrowserCompat.subscribe()}, but won't be called by {@link * android.media.browse.MediaBrowser#subscribe}. * * @param session The session for this event. @@ -300,8 +299,8 @@ public abstract class MediaLibraryService extends MediaSessionService { * #getSubscribedControllers(String)} to get subscribed controllers for which to call {@link * #notifyChildrenChanged}. * - *

Interoperability: This will be called by {@link - * android.support.v4.media.MediaBrowserCompat#unsubscribe}, but won't be called by {@link + *

Interoperability: This will be called by {@code + * android.support.v4.media.MediaBrowserCompat.unsubscribe()}, but won't be called by {@link * android.media.browse.MediaBrowser#unsubscribe}. * * @param session The session for this event. @@ -363,8 +362,8 @@ public abstract class MediaLibraryService extends MediaSessionService { * list for no children rather than using error codes. * *

Typically, the {@code query} is requested through {@link #onSearch(MediaLibrarySession, - * ControllerInfo, String, LibraryParams)} before, but it may not especially when {@link - * android.support.v4.media.MediaBrowserCompat#search} is used. + * ControllerInfo, String, LibraryParams)} before, but it may not especially when {@code + * android.support.v4.media.MediaBrowserCompat.search()} is used. * * @param session The session for this event. * @param browser The browser information. diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSession.java b/libraries/session/src/main/java/androidx/media3/session/MediaSession.java index 8ec0c33b54..015fbaa463 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSession.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSession.java @@ -211,17 +211,17 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * *

Backward Compatibility with Legacy Session APIs

* - *

An active {@link MediaSessionCompat} is internally created with the session for backwards - * compatibility. It's used to handle incoming connections and commands from {@link - * MediaControllerCompat} instances, and helps to utilize existing APIs that are built with legacy - * media session APIs. + *

An active {@code android.support.v4.media.session.MediaSessionCompat} is internally created + * with the session for backwards compatibility. It's used to handle incoming connections and + * commands from {@code android.support.v4.media.session.MediaControllerCompat} instances, and helps + * to utilize existing APIs that are built with legacy media session APIs. * *

Backward Compatibility with Legacy Controller APIs

* *

In addition to {@link MediaController}, the session also supports connections from the legacy - * controller APIs - {@linkplain android.media.session.MediaController framework controller} and - * {@linkplain MediaControllerCompat AndroidX controller compat}. However, {@link ControllerInfo} - * may not be precise for legacy controllers. See {@link ControllerInfo} for the details. + * controller APIs - {@link android.media.session.MediaController} and {@code + * android.support.v4.media.session.MediaControllerCompat}. However, {@link ControllerInfo} may not + * be precise for legacy controllers. See {@link ControllerInfo} for the details. * *

Neither an unknown package name nor an unknown UID mean that you should disallow a connection * or commands per se. For SDK levels where such issues happen, session tokens can only be obtained @@ -466,6 +466,12 @@ public class MediaSession { /** The {@linkplain #getInterfaceVersion()} interface version} of legacy controllers. */ @UnstableApi public static final int LEGACY_CONTROLLER_INTERFACE_VERSION = 0; + /** + * The {@link #getPackageName()} of legacy controllers if a more precise package cannot be + * obtained. + */ + public static final String LEGACY_CONTROLLER_PACKAGE_NAME = RemoteUserInfo.LEGACY_CONTROLLER; + private final RemoteUserInfo remoteUserInfo; private final int libraryVersion; private final int interfaceVersion; @@ -478,9 +484,10 @@ public class MediaSession { * * @param remoteUserInfo The remote user info. * @param trusted {@code true} if trusted, {@code false} otherwise. - * @param cb ControllerCb. Can be {@code null} only when a MediaBrowserCompat connects to - * MediaSessionService and ControllerInfo is needed for {@link - * MediaSession.Callback#onConnect(MediaSession, ControllerInfo)}. + * @param cb ControllerCb. Can be {@code null} only when a {@code + * android.support.v4.media.MediaBrowserCompat} connects to {@link MediaSessionService} and + * {@link ControllerInfo} is needed for {@link MediaSession.Callback#onConnect(MediaSession, + * ControllerInfo)}. * @param connectionHints A session-specific argument sent from the controller for the * connection. The contents of this bundle may affect the connection result. */ @@ -520,7 +527,7 @@ public class MediaSession { } /** - * Returns the package name. Can be {@link RemoteUserInfo#LEGACY_CONTROLLER} for + * Returns the package name. Can be {@link #LEGACY_CONTROLLER_PACKAGE_NAME} for * interoperability. * *

Interoperability: Package name may not be precisely obtained for legacy controller API on @@ -535,7 +542,7 @@ public class MediaSession { * It's sufficient for most cases, but doesn't precisely distinguish caller if it * uses shared user ID. * {@code 21 <= SDK_INT < 24} - * {@link RemoteUserInfo#LEGACY_CONTROLLER} + * {@link #LEGACY_CONTROLLER_PACKAGE_NAME} * */ public String getPackageName() { @@ -616,16 +623,40 @@ public class MediaSession { /* connectionHints= */ Bundle.EMPTY); } - /** Returns a {@link ControllerInfo} suitable for use when testing client code. */ + /** + * @deprecated Use {@link #createTestOnlyControllerInfo(String, int, int, int, int, boolean, + * Bundle)} instead. + */ @VisibleForTesting(otherwise = PRIVATE) + @Deprecated public static ControllerInfo createTestOnlyControllerInfo( RemoteUserInfo remoteUserInfo, int libraryVersion, int interfaceVersion, boolean trusted, Bundle connectionHints) { + return createTestOnlyControllerInfo( + remoteUserInfo.getPackageName(), + remoteUserInfo.getPid(), + remoteUserInfo.getUid(), + libraryVersion, + interfaceVersion, + trusted, + connectionHints); + } + + /** Returns a {@link ControllerInfo} suitable for use when testing client code. */ + @VisibleForTesting(otherwise = PRIVATE) + public static ControllerInfo createTestOnlyControllerInfo( + String packageName, + int pid, + int uid, + int libraryVersion, + int interfaceVersion, + boolean trusted, + Bundle connectionHints) { return new MediaSession.ControllerInfo( - remoteUserInfo, + new RemoteUserInfo(packageName, pid, uid), libraryVersion, interfaceVersion, trusted, @@ -1111,8 +1142,8 @@ public class MediaSession { } /** - * Returns the {@link MediaSessionCompat.Token} of the {@link MediaSessionCompat} created - * internally by this session. + * Returns the legacy {@code android.support.v4.media.session.MediaSessionCompat.Token} of the + * {@code android.support.v4.media.session.MediaSessionCompat} created internally by this session. */ @UnstableApi public final MediaSessionCompat.Token getSessionCompatToken() { @@ -1309,9 +1340,9 @@ public class MediaSession { * been added to the {@link MediaSession.ConnectionResult#availableSessionCommands list of * available session commands} in {@link #onConnect} or set via {@link #setAvailableCommands}. * - *

Interoperability: This will be also called by {@link - * android.support.v4.media.MediaBrowserCompat#sendCustomAction}. If so, {@code extras} from - * {@link android.support.v4.media.MediaBrowserCompat#sendCustomAction} will be considered as + *

Interoperability: This will be also called by {@code + * android.support.v4.media.MediaBrowserCompat.sendCustomAction()}. If so, {@code extras} from + * {@code android.support.v4.media.MediaBrowserCompat.sendCustomAction()} will be considered as * {@code args} and the custom command will have {@code null} {@link * SessionCommand#customExtras}. * @@ -1340,9 +1371,10 @@ public class MediaSession { * Callback#onSetMediaItems} will direct {@code Player.setMediaItem(s)} to this method as well. * *

In addition, unless {@link Callback#onSetMediaItems} is overridden, this callback is also - * called when an app is using a legacy {@link MediaControllerCompat.TransportControls} to - * prepare or play media (for instance when browsing the catalogue and then selecting an item - * for preparation from Android Auto that is using the legacy Media1 library). + * called when an app is using a legacy {@link + * android.support.v4.media.session.MediaControllerCompat.TransportControls} to prepare or play + * media (for instance when browsing the catalogue and then selecting an item for preparation + * from Android Auto that is using the legacy Media1 library). * *

By default, if and only if each of the provided {@linkplain MediaItem media items} has a * set {@link MediaItem.LocalConfiguration} (for example, a URI), then the callback returns the @@ -1361,16 +1393,17 @@ public class MediaSession { * Player#setMediaItems} or {@link Player#addMediaItems} as requested. * *

Interoperability: This method will be called, unless {@link Callback#onSetMediaItems} is - * overridden, in response to the following {@link MediaControllerCompat} methods: + * overridden, in response to the following {@link + * android.support.v4.media.session.MediaControllerCompat} methods: * *

* * The values of {@link MediaItem#mediaId}, {@link MediaItem.RequestMetadata#mediaUri}, {@link diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java index 120a5a5501..32b93afb0e 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java @@ -77,7 +77,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * } * *

You may also declare the action {@code android.media.browse.MediaBrowserService} for - * compatibility with {@link android.support.v4.media.MediaBrowserCompat}. This service can handle + * compatibility with {@code android.support.v4.media.MediaBrowserCompat}. This service can handle * the case automatically. * *

It's recommended for an app to have a single service declared in the manifest. Otherwise, your @@ -227,10 +227,10 @@ public abstract class MediaSessionService extends Service { *

  • When the service is started by a media button event, the package name will be {@link * Intent#ACTION_MEDIA_BUTTON}. If you want to allow the service to be started by media * button events, do not return {@code null}. - *
  • When a legacy {@link android.media.browse.MediaBrowser} or a {@link + *
  • When a legacy {@link android.media.browse.MediaBrowser} or a {@code * android.support.v4.media.MediaBrowserCompat} tries to connect, the package name will be - * {@link MediaBrowserServiceCompat#SERVICE_INTERFACE}. If you want to allow the service to - * be bound by the legacy media browsers, do not return {@code null}. + * {@link android.service.media.MediaBrowserService#SERVICE_INTERFACE}. If you want to allow + * the service to be bound by the legacy media browsers, do not return {@code null}. * * *

    For those special cases, the values returned by {@link ControllerInfo#getUid()} and {@link diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionServiceLegacyStub.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionServiceLegacyStub.java index f845029ed0..f44fc9ee46 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionServiceLegacyStub.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionServiceLegacyStub.java @@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicReference; /** * Implementation of {@link MediaBrowserServiceCompat} for interoperability between {@link - * MediaLibraryService} and {@link android.support.v4.media.MediaBrowserCompat}. + * MediaLibraryService} and {@code android.support.v4.media.MediaBrowserCompat}. */ /* package */ class MediaSessionServiceLegacyStub extends MediaBrowserServiceCompat { diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java b/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java index 0163f3d19e..cf4f907072 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaStyleNotificationHelper.java @@ -78,7 +78,7 @@ public class MediaStyleNotificationHelper { * *

        * Notification noti = new NotificationCompat.Builder()
    -   *     .setSmallIcon(androidx.media.R.drawable.ic_stat_player)
    +   *     .setSmallIcon(androidx.media3.R.drawable.media3_notification_small_icon)
        *     .setContentTitle("Track title")
        *     .setContentText("Artist - Album")
        *     .setLargeIcon(albumArtBitmap)
    @@ -386,7 +386,7 @@ public class MediaStyleNotificationHelper {
        *
        * 
        * Notification noti = new NotificationCompat.Builder()
    -   *     .setSmallIcon(androidx.media.R.drawable.ic_stat_player)
    +   *     .setSmallIcon(androidx.media3.R.drawable.media3_notification_small_icon)
        *     .setLargeIcon(albumArtBitmap))
        *     .setCustomContentView(contentView)
        *     .setStyle(new NotificationCompat.DecoratedMediaCustomViewStyle()
    @@ -566,7 +566,7 @@ public class MediaStyleNotificationHelper {
           if (actionsToShowInCompact != null) {
             setShowActionsInCompactView(style, actionsToShowInCompact);
           }
    -      MediaSessionCompat.Token legacyToken = session.getSessionCompatToken();
    +      MediaSessionCompat.Token legacyToken = session.getSessionCompat().getSessionToken();
           style.setMediaSession((android.media.session.MediaSession.Token) legacyToken.getToken());
           return style;
         }
    diff --git a/libraries/session/src/main/java/androidx/media3/session/SessionCommand.java b/libraries/session/src/main/java/androidx/media3/session/SessionCommand.java
    index ae8845c79a..fd5942179a 100644
    --- a/libraries/session/src/main/java/androidx/media3/session/SessionCommand.java
    +++ b/libraries/session/src/main/java/androidx/media3/session/SessionCommand.java
    @@ -124,8 +124,8 @@ public final class SessionCommand implements Bundleable {
       /**
        * The extra bundle of a custom command. It will be {@link Bundle#EMPTY} for a predefined command.
        *
    -   * 

    Interoperability: This value is not used when the command is sent to a legacy {@link - * android.support.v4.media.session.MediaSessionCompat} or {@link + *

    Interoperability: This value is not used when the command is sent to a legacy {@code + * android.support.v4.media.session.MediaSessionCompat} or {@code * android.support.v4.media.session.MediaControllerCompat}. */ public final Bundle customExtras; @@ -148,7 +148,7 @@ public final class SessionCommand implements Bundleable { * * @param action The action of this custom command. * @param extras An extra bundle for this custom command. This value is not used when the command - * is sent to a legacy {@link android.support.v4.media.session.MediaSessionCompat} or {@link + * is sent to a legacy {@code android.support.v4.media.session.MediaSessionCompat} or {@code * android.support.v4.media.session.MediaControllerCompat}. */ public SessionCommand(String action, Bundle extras) { diff --git a/libraries/session/src/main/java/androidx/media3/session/SessionResult.java b/libraries/session/src/main/java/androidx/media3/session/SessionResult.java index 94c660b53c..7e239d96d3 100644 --- a/libraries/session/src/main/java/androidx/media3/session/SessionResult.java +++ b/libraries/session/src/main/java/androidx/media3/session/SessionResult.java @@ -19,8 +19,6 @@ import static java.lang.annotation.ElementType.TYPE_USE; import android.os.Bundle; import android.os.SystemClock; -import android.support.v4.media.session.MediaControllerCompat; -import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.media3.common.Bundleable; @@ -81,8 +79,9 @@ public final class SessionResult implements Bundleable { * Result code representing that the command is successfully completed. * *

    Interoperability: This code is also used to tell that the command was successfully sent, but - * the result is unknown when connected with {@link MediaSessionCompat} or {@link - * MediaControllerCompat}. + * the result is unknown when connected with {@code + * android.support.v4.media.session.MediaSessionCompat} or {@code + * android.support.v4.media.session.MediaControllerCompat}. */ public static final int RESULT_SUCCESS = 0; diff --git a/libraries/session/src/main/java/androidx/media3/session/SessionToken.java b/libraries/session/src/main/java/androidx/media3/session/SessionToken.java index a2c3ed43db..5fcd12a5fe 100644 --- a/libraries/session/src/main/java/androidx/media3/session/SessionToken.java +++ b/libraries/session/src/main/java/androidx/media3/session/SessionToken.java @@ -55,8 +55,8 @@ import java.util.List; /** * A token that represents an ongoing {@link MediaSession} or a service ({@link - * MediaSessionService}, {@link MediaLibraryService}, or {@link MediaBrowserServiceCompat}). If it - * represents a service, it may not be ongoing. + * MediaSessionService}, {@link MediaLibraryService}, or {@code + * androix.media.MediaBrowserServiceCompat}). If it represents a service, it may not be ongoing. * *

    This may be passed to apps by the session owner to allow them to create a {@link * MediaController} or a {@link MediaBrowser} to communicate with the session. @@ -93,14 +93,15 @@ public final class SessionToken implements Bundleable { /** Type for {@link MediaSessionCompat}. */ /* package */ static final int TYPE_SESSION_LEGACY = 100; - /** Type for {@link MediaBrowserServiceCompat}. */ + /** Type for {@code androidx.media.MediaBrowserServiceCompat}. */ /* package */ static final int TYPE_BROWSER_SERVICE_LEGACY = 101; private final SessionTokenImpl impl; /** * Creates a token for {@link MediaController} or {@link MediaBrowser} to connect to one of {@link - * MediaSessionService}, {@link MediaLibraryService}, or {@link MediaBrowserServiceCompat}. + * MediaSessionService}, {@link MediaLibraryService}, or {@code + * androidx.media.MediaBrowserServiceCompat}. * * @param context The context. * @param serviceComponent The component name of the service. @@ -294,15 +295,16 @@ public final class SessionToken implements Bundleable { } /** - * Creates a token from a {@link MediaSessionCompat.Token}. + * Creates a token from a {@link android.support.v4.media.session.MediaSessionCompat.Token}. * * @param context A {@link Context}. - * @param compatToken The {@link MediaSessionCompat.Token}. + * @param compatToken The {@code android.support.v4.media.session.MediaSessionCompat.Token}. * @return A {@link ListenableFuture} for the {@link SessionToken}. */ + @SuppressWarnings("UnnecessarilyFullyQualified") // Avoiding clash with Media3 MediaSession. @UnstableApi public static ListenableFuture createSessionToken( - Context context, MediaSessionCompat.Token compatToken) { + Context context, android.support.v4.media.session.MediaSessionCompat.Token compatToken) { HandlerThread thread = new HandlerThread("SessionTokenThread"); thread.start(); ListenableFuture tokenFuture = @@ -312,18 +314,21 @@ public final class SessionToken implements Bundleable { } /** - * Creates a token from a {@link MediaSessionCompat.Token}. + * Creates a token from a {@link android.support.v4.media.session.MediaSessionCompat.Token}. * * @param context A {@link Context}. - * @param compatToken The {@link MediaSessionCompat.Token}. + * @param compatToken The {@link android.support.v4.media.session.MediaSessionCompat.Token}. * @param completionLooper The {@link Looper} on which the returned {@link ListenableFuture} * completes. This {@link Looper} can't be used to call {@code future.get()} on the returned * {@link ListenableFuture}. * @return A {@link ListenableFuture} for the {@link SessionToken}. */ + @SuppressWarnings("UnnecessarilyFullyQualified") // Avoiding clash with Media3 MediaSession. @UnstableApi public static ListenableFuture createSessionToken( - Context context, MediaSessionCompat.Token compatToken, Looper completionLooper) { + Context context, + android.support.v4.media.session.MediaSessionCompat.Token compatToken, + Looper completionLooper) { checkNotNull(context, "context must not be null"); checkNotNull(compatToken, "compatToken must not be null"); @@ -364,7 +369,7 @@ public final class SessionToken implements Bundleable { /** * Returns an {@link ImmutableSet} of {@linkplain SessionToken session tokens} for media session * services; {@link MediaSessionService}, {@link MediaLibraryService}, and {@link - * MediaBrowserServiceCompat} regardless of their activeness. + * androidx.media.MediaBrowserServiceCompat} regardless of their activeness. * *

    The app targeting API level 30 or higher must include a {@code } element in their * manifest to get service tokens of other apps. See the following example and browserItems = MediaTestUtils.createBrowserItems(size); + ImmutableList browserItems = + ImmutableList.of( + new MediaBrowserCompat.MediaItem( + new MediaDescriptionCompat.Builder().setMediaId("browserItem_1").build(), + /* flags= */ 0), + new MediaBrowserCompat.MediaItem( + new MediaDescriptionCompat.Builder().setMediaId("browserItem_2").build(), + /* flags= */ 0), + new MediaBrowserCompat.MediaItem( + new MediaDescriptionCompat.Builder().setMediaId("browserItem_3").build(), + /* flags= */ 0)); + List mediaItems = LegacyConversions.convertBrowserItemListToMediaItemList(browserItems); - assertThat(mediaItems).hasSize(size); - for (int i = 0; i < size; ++i) { - assertThat(mediaItems.get(i).mediaId).isEqualTo(browserItems.get(i).getMediaId()); - } + + assertThat(mediaItems).hasSize(3); + assertThat(mediaItems.get(0).mediaId).isEqualTo(browserItems.get(0).getMediaId()); + assertThat(mediaItems.get(1).mediaId).isEqualTo(browserItems.get(1).getMediaId()); + assertThat(mediaItems.get(2).mediaId).isEqualTo(browserItems.get(2).getMediaId()); } @Test public void convertToQueueItem_withArtworkData() throws Exception { - MediaItem mediaItem = MediaTestUtils.createMediaItemWithArtworkData("testId"); + MediaItem mediaItem = createMediaItemWithArtworkData("testId"); MediaMetadata mediaMetadata = mediaItem.mediaMetadata; ListenableFuture bitmapFuture = bitmapLoader.decodeBitmap(mediaMetadata.artworkData); @Nullable Bitmap bitmap = bitmapFuture.get(10, SECONDS); @@ -200,7 +212,7 @@ public final class LegacyConversionsTest { @Test public void convertToMediaMetadata_roundTripViaMediaMetadataCompat_returnsEqualMediaItemMetadata() throws Exception { - MediaItem testMediaItem = MediaTestUtils.createMediaItemWithArtworkData("testZZZ"); + MediaItem testMediaItem = createMediaItemWithArtworkData("testZZZ"); MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata; @Nullable Bitmap testArtworkBitmap = null; @Nullable @@ -227,7 +239,7 @@ public final class LegacyConversionsTest { public void convertToMediaMetadata_roundTripViaMediaDescriptionCompat_returnsEqualMediaItemMetadata() throws Exception { - MediaItem testMediaItem = MediaTestUtils.createMediaItemWithArtworkData("testZZZ"); + MediaItem testMediaItem = createMediaItemWithArtworkData("testZZZ"); MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata; @Nullable Bitmap testArtworkBitmap = null; @Nullable @@ -375,8 +387,7 @@ public final class LegacyConversionsTest { assertThat(LegacyConversions.convertToLibraryParams(context, null)).isNull(); Bundle rootHints = new Bundle(); rootHints.putString("key", "value"); - rootHints.putInt( - MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS, FLAG_BROWSABLE); + rootHints.putInt(BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS, FLAG_BROWSABLE); rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_OFFLINE, true); rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true); rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_SUGGESTED, true); @@ -396,7 +407,7 @@ public final class LegacyConversionsTest { @Test public void convertToLibraryParams_rootHintsBrowsableNoFlagSet_browsableOnlyFalse() { Bundle rootHints = new Bundle(); - rootHints.putInt(MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS, 0); + rootHints.putInt(BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS, 0); MediaLibraryService.LibraryParams params = LegacyConversions.convertToLibraryParams(context, rootHints); @@ -408,8 +419,7 @@ public final class LegacyConversionsTest { public void convertToLibraryParams_rootHintsPlayableFlagSet_browsableOnlyFalse() { Bundle rootHints = new Bundle(); rootHints.putInt( - MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS, - FLAG_PLAYABLE | FLAG_BROWSABLE); + BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS, FLAG_PLAYABLE | FLAG_BROWSABLE); MediaLibraryService.LibraryParams params = LegacyConversions.convertToLibraryParams(context, rootHints); @@ -490,7 +500,7 @@ public final class LegacyConversionsTest { .isTrue(); } - @SdkSuppress(minSdkVersion = 21) + @Config(minSdk = 21) @Test public void convertToSessionCommands_whenSessionIsNotReadyOnSdk21_disallowsRating() { SessionCommands sessionCommands = @@ -941,9 +951,7 @@ public final class LegacyConversionsTest { String displayName = "display_name"; int iconRes = 21; Bundle extras = new Bundle(); - extras.putInt( - androidx.media3.session.MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT, - CommandButton.ICON_FAST_FORWARD); + extras.putInt(EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT, CommandButton.ICON_FAST_FORWARD); PlaybackStateCompat.CustomAction action = new PlaybackStateCompat.CustomAction.Builder(actionStr, displayName, iconRes) .setExtras(extras) @@ -1133,4 +1141,40 @@ public final class LegacyConversionsTest { state, /* metadataCompat= */ null, /* timeDiffMs= */ C.INDEX_UNSET); assertThat(totalBufferedDurationMs).isEqualTo(testTotalBufferedDurationMs); } + + // TODO(b/254265256): Move this method to a central place. + private static ImmutableList<@Player.Command Integer> getCommandsAsList( + Player.Commands commands) { + ImmutableList.Builder<@Player.Command Integer> list = new ImmutableList.Builder<>(); + for (int i = 0; i < commands.size(); i++) { + list.add(commands.get(i)); + } + return list.build(); + } + + private static MediaItem createMediaItemWithArtworkData(String mediaId) { + MediaMetadata.Builder mediaMetadataBuilder = + new MediaMetadata.Builder() + .setMediaType(MediaMetadata.MEDIA_TYPE_PLAYLIST) + .setIsBrowsable(false) + .setIsPlayable(true); + try { + byte[] artworkData; + Bitmap bitmap = + BitmapFactory.decodeStream( + ApplicationProvider.getApplicationContext() + .getResources() + .getAssets() + .open("media/png/non-motion-photo-shortened.png")); + try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { + bitmap.compress(Bitmap.CompressFormat.PNG, /* ignored */ 0, stream); + artworkData = stream.toByteArray(); + } + mediaMetadataBuilder.setArtworkData(artworkData, MediaMetadata.PICTURE_TYPE_FRONT_COVER); + } catch (IOException e) { + fail(e.getMessage()); + } + MediaMetadata mediaMetadata = mediaMetadataBuilder.build(); + return new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(mediaMetadata).build(); + } } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java index d09535c762..e89daf4c2b 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatCallbackWithMediaSessionTest.java @@ -39,7 +39,6 @@ import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.MediaSessionCompat.QueueItem; import android.support.v4.media.session.PlaybackStateCompat; import android.text.TextUtils; -import androidx.media.AudioAttributesCompat; import androidx.media3.common.AudioAttributes; import androidx.media3.common.C; import androidx.media3.common.DeviceInfo; @@ -155,12 +154,8 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { handler); assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue(); - assertThat( - LegacyConversions.convertToPlaybackState( - controller.getPlaybackState(), - controller.getMetadata(), - /* timeDiffMs= */ C.TIME_UNSET)) - .isEqualTo(testState); + assertThat(controller.getPlaybackState().getState()) + .isEqualTo(PlaybackStateCompat.STATE_PLAYING); assertThat(controller.getPlaybackState().getBufferedPosition()) .isEqualTo(testBufferingPosition); assertThat(controller.getPlaybackState().getPlaybackSpeed()).isEqualTo(testSpeed); @@ -396,11 +391,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { assertThat(metadataRef.get().getString(METADATA_KEY_MEDIA_ID)) .isEqualTo(testMediaItems.get(testItemIndex).mediaId); assertThat(metadataRef.get().getLong(METADATA_KEY_DURATION)).isEqualTo(testDurationMs); - @PlaybackStateCompat.State - int playbackStateFromControllerCompat = - LegacyConversions.convertToPlaybackState( - playbackStateRef.get(), metadataRef.get(), /* timeDiffMs= */ C.TIME_UNSET); - assertThat(playbackStateFromControllerCompat).isEqualTo(testState); + assertThat(playbackStateRef.get().getState()).isEqualTo(PlaybackStateCompat.STATE_PLAYING); assertThat(metadataRef.get().getRating(METADATA_KEY_USER_RATING).hasHeart()).isTrue(); assertThat(latchForQueue.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); List queue = controllerCompat.getQueue(); @@ -461,9 +452,11 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { new DeviceInfo.Builder(DeviceInfo.PLAYBACK_TYPE_LOCAL).setMaxVolume(10).build(); int legacyPlaybackTypeToUpdate = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL; int legacyStream = AudioManager.STREAM_RING; - AudioAttributesCompat attrsCompat = - new AudioAttributesCompat.Builder().setLegacyStreamType(legacyStream).build(); - AudioAttributes attrs = LegacyConversions.convertToAudioAttributes(attrsCompat); + AudioAttributes attrs = + new AudioAttributes.Builder() + .setContentType(C.AUDIO_CONTENT_TYPE_SONIFICATION) + .setUsage(C.USAGE_NOTIFICATION_RINGTONE) + .build(); CountDownLatch playbackInfoNotified = new CountDownLatch(1); MediaControllerCompat.Callback callback = new MediaControllerCompat.Callback() { @@ -507,9 +500,11 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { new DeviceInfo.Builder(DeviceInfo.PLAYBACK_TYPE_LOCAL).setMaxVolume(10).build(); int legacyPlaybackType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL; int legacyStream = AudioManager.STREAM_RING; - AudioAttributesCompat attrsCompat = - new AudioAttributesCompat.Builder().setLegacyStreamType(legacyStream).build(); - AudioAttributes attrs = LegacyConversions.convertToAudioAttributes(attrsCompat); + AudioAttributes attrs = + new AudioAttributes.Builder() + .setContentType(C.AUDIO_CONTENT_TYPE_SONIFICATION) + .setUsage(C.USAGE_NOTIFICATION_RINGTONE) + .build(); CountDownLatch playbackInfoNotified = new CountDownLatch(1); MediaControllerCompat.Callback callback = new MediaControllerCompat.Callback() { @@ -961,13 +956,13 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { .setIconResId(2) .build() .copyWithIsEnabled(true)); - List> reportedCustomLayouts = new ArrayList<>(); + List reportedPlaybackStates = new ArrayList<>(); CountDownLatch latch1 = new CountDownLatch(2); MediaControllerCompat.Callback callback = new MediaControllerCompat.Callback() { @Override public void onPlaybackStateChanged(PlaybackStateCompat state) { - reportedCustomLayouts.add(LegacyConversions.convertToCustomLayout(state)); + reportedPlaybackStates.add(state); latch1.countDown(); } }; @@ -979,8 +974,27 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { Player.Commands.EMPTY); assertThat(latch1.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(reportedCustomLayouts.get(0)).containsExactly(customLayout.get(0)); - assertThat(reportedCustomLayouts.get(1)).isEqualTo(customLayout); + assertThat(reportedPlaybackStates).hasSize(2); + assertThat(reportedPlaybackStates.get(0).getCustomActions()).hasSize(1); + PlaybackStateCompat.CustomAction action0 = + reportedPlaybackStates.get(0).getCustomActions().get(0); + assertThat(action0.getAction()).isEqualTo("command1"); + assertThat(action0.getExtras().getString("key")).isEqualTo("value-1"); + assertThat(action0.getIcon()).isEqualTo(1); + assertThat(action0.getName().toString()).isEqualTo("command1"); + assertThat(reportedPlaybackStates.get(1).getCustomActions()).hasSize(2); + PlaybackStateCompat.CustomAction action1 = + reportedPlaybackStates.get(1).getCustomActions().get(0); + assertThat(action1.getAction()).isEqualTo("command1"); + assertThat(action1.getExtras().getString("key")).isEqualTo("value-1"); + assertThat(action1.getIcon()).isEqualTo(1); + assertThat(action1.getName().toString()).isEqualTo("command1"); + PlaybackStateCompat.CustomAction action2 = + reportedPlaybackStates.get(1).getCustomActions().get(1); + assertThat(action2.getAction()).isEqualTo("command2"); + assertThat(action2.getExtras().getString("key")).isEqualTo("value-2"); + assertThat(action2.getIcon()).isEqualTo(2); + assertThat(action2.getName().toString()).isEqualTo("command2"); } @Test @@ -1128,10 +1142,8 @@ public class MediaControllerCompatCallbackWithMediaSessionTest { assertThat(latchForPlaybackState.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); assertThat(playbackStateRef.get().getPosition()).isEqualTo(testPosition); assertThat(controllerCompat.getPlaybackState().getPosition()).isEqualTo(testPosition); - assertThat(playbackStateRef.get().getActiveQueueItemId()) - .isEqualTo(LegacyConversions.convertToQueueItemId(testItemIndex)); - assertThat(controllerCompat.getPlaybackState().getActiveQueueItemId()) - .isEqualTo(LegacyConversions.convertToQueueItemId(testItemIndex)); + assertThat(playbackStateRef.get().getActiveQueueItemId()).isEqualTo(testItemIndex); + assertThat(controllerCompat.getPlaybackState().getActiveQueueItemId()).isEqualTo(testItemIndex); assertThat(callbackOrder) .containsExactly("onMetadataChanged", "onPlaybackStateChanged") .inOrder(); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest.java index ced1f07d54..a75f1d5bef 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest.java @@ -45,6 +45,7 @@ import androidx.media3.common.util.Consumer; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.session.MediaSession.ConnectionResult; import androidx.media3.session.MediaSession.ConnectionResult.AcceptedResultBuilder; +import androidx.media3.test.session.R; import androidx.media3.test.session.common.HandlerThreadTestRule; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -1482,8 +1483,15 @@ public class MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest connectMediaNotificationController(mediaSession); MediaControllerCompat controllerCompat = createMediaControllerCompat(mediaSession); - assertThat(LegacyConversions.convertToCustomLayout(controllerCompat.getPlaybackState())) - .containsExactly(customLayout.get(0).copyWithIsEnabled(true)); + assertThat(controllerCompat.getPlaybackState().getCustomActions()).hasSize(1); + PlaybackStateCompat.CustomAction customAction = + controllerCompat.getPlaybackState().getCustomActions().get(0); + assertThat(customAction.getAction()).isEqualTo("command1"); + assertThat(customAction.getName().toString()).isEqualTo("button1"); + assertThat(customAction.getIcon()).isEqualTo(R.drawable.media3_icon_play); + assertThat(customAction.getExtras().get("key1")).isEqualTo("value1"); + assertThat(customAction.getExtras().get(MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT)) + .isEqualTo(CommandButton.ICON_PLAY); mediaSession.release(); releasePlayer(player); } @@ -1522,15 +1530,16 @@ public class MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest MediaSession mediaSession = createMediaSession(player, callback); connectMediaNotificationController(mediaSession); MediaControllerCompat controllerCompat = createMediaControllerCompat(mediaSession); - ImmutableList initialCustomLayout = - LegacyConversions.convertToCustomLayout(controllerCompat.getPlaybackState()); - AtomicReference> reportedCustomLayout = new AtomicReference<>(); + List initialCustomActions = + controllerCompat.getPlaybackState().getCustomActions(); + AtomicReference> reportedCustomActions = + new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1); controllerCompat.registerCallback( new MediaControllerCompat.Callback() { @Override public void onPlaybackStateChanged(PlaybackStateCompat state) { - reportedCustomLayout.set(LegacyConversions.convertToCustomLayout(state)); + reportedCustomActions.set(state.getCustomActions()); latch.countDown(); } }, @@ -1539,9 +1548,19 @@ public class MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest getInstrumentation().runOnMainSync(() -> mediaSession.setCustomLayout(customLayout)); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(initialCustomLayout).isEmpty(); - assertThat(reportedCustomLayout.get()) - .containsExactly(customLayout.get(0).copyWithIsEnabled(true)); + assertThat(initialCustomActions).isEmpty(); + assertThat(reportedCustomActions.get()).hasSize(1); + assertThat(reportedCustomActions.get().get(0).getAction()).isEqualTo("command1"); + assertThat(reportedCustomActions.get().get(0).getName().toString()).isEqualTo("button1"); + assertThat(reportedCustomActions.get().get(0).getIcon()).isEqualTo(R.drawable.media3_icon_play); + assertThat(reportedCustomActions.get().get(0).getExtras().get("key1")).isEqualTo("value1"); + assertThat( + reportedCustomActions + .get() + .get(0) + .getExtras() + .get(MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT)) + .isEqualTo(CommandButton.ICON_PLAY); mediaSession.release(); releasePlayer(player); } @@ -1581,15 +1600,16 @@ public class MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest MediaSession mediaSession = createMediaSession(player, callback); connectMediaNotificationController(mediaSession); MediaControllerCompat controllerCompat = createMediaControllerCompat(mediaSession); - ImmutableList initialCustomLayout = - LegacyConversions.convertToCustomLayout(controllerCompat.getPlaybackState()); - AtomicReference> reportedCustomLayout = new AtomicReference<>(); + List initialCustomActions = + controllerCompat.getPlaybackState().getCustomActions(); + AtomicReference> reportedCustomActions = + new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1); controllerCompat.registerCallback( new MediaControllerCompat.Callback() { @Override public void onPlaybackStateChanged(PlaybackStateCompat state) { - reportedCustomLayout.set(LegacyConversions.convertToCustomLayout(state)); + reportedCustomActions.set(state.getCustomActions()); latch.countDown(); } }, @@ -1602,9 +1622,19 @@ public class MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest mediaSession.getMediaNotificationControllerInfo(), customLayout)); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); - assertThat(initialCustomLayout).isEmpty(); - assertThat(reportedCustomLayout.get()) - .containsExactly(customLayout.get(0).copyWithIsEnabled(true)); + assertThat(initialCustomActions).isEmpty(); + assertThat(reportedCustomActions.get()).hasSize(1); + assertThat(reportedCustomActions.get().get(0).getAction()).isEqualTo("command1"); + assertThat(reportedCustomActions.get().get(0).getName().toString()).isEqualTo("button1"); + assertThat(reportedCustomActions.get().get(0).getIcon()).isEqualTo(R.drawable.media3_icon_play); + assertThat(reportedCustomActions.get().get(0).getExtras().get("key1")).isEqualTo("value1"); + assertThat( + reportedCustomActions + .get() + .get(0) + .getExtras() + .get(MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT)) + .isEqualTo(CommandButton.ICON_PLAY); mediaSession.release(); releasePlayer(player); } @@ -1691,8 +1721,7 @@ public class MediaControllerCompatPlaybackStateCompatActionsWithMediaSessionTest private static MediaControllerCompat createMediaControllerCompat(MediaSession mediaSession) { return new MediaControllerCompat( - ApplicationProvider.getApplicationContext(), - mediaSession.getSessionCompat().getSessionToken()); + ApplicationProvider.getApplicationContext(), mediaSession.getSessionCompatToken()); } /** Releases the {@code player} on the main thread. */ diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java index e4c5582edc..bae4f67ff4 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerListenerTest.java @@ -38,12 +38,10 @@ import static org.junit.Assert.assertThrows; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.media.AudioManager; import android.os.Bundle; import android.os.RemoteException; import android.text.SpannedString; import androidx.annotation.Nullable; -import androidx.media.AudioAttributesCompat; import androidx.media3.common.AudioAttributes; import androidx.media3.common.C; import androidx.media3.common.DeviceInfo; @@ -189,16 +187,15 @@ public class MediaControllerListenerTest { @Test public void connection_sessionReleased() throws Exception { CountDownLatch latch = new CountDownLatch(1); - MediaController controller = - controllerTestRule.createController( - remoteSession.getToken(), - /* connectionHints= */ null, - new MediaController.Listener() { - @Override - public void onDisconnected(MediaController controller) { - latch.countDown(); - } - }); + controllerTestRule.createController( + remoteSession.getToken(), + /* connectionHints= */ null, + new MediaController.Listener() { + @Override + public void onDisconnected(MediaController controller) { + latch.countDown(); + } + }); remoteSession.release(); assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); } @@ -236,7 +233,7 @@ public class MediaControllerListenerTest { @LargeTest public void noInteractionAfterSessionClose_session() throws Exception { SessionToken token = remoteSession.getToken(); - MediaController controller = controllerTestRule.createController(token); + controllerTestRule.createController(token); testControllerAfterSessionIsClosed(DEFAULT_TEST_NAME); } @@ -322,10 +319,10 @@ public class MediaControllerListenerTest { Timeline testTimeline = MediaTestUtils.createTimeline(/* windowCount= */ 3); MediaMetadata testPlaylistMetadata = new MediaMetadata.Builder().setTitle("title").build(); AudioAttributes testAudioAttributes = - LegacyConversions.convertToAudioAttributes( - new AudioAttributesCompat.Builder() - .setLegacyStreamType(AudioManager.STREAM_RING) - .build()); + new AudioAttributes.Builder() + .setUsage(C.USAGE_ALARM) + .setContentType(C.AUDIO_CONTENT_TYPE_SONIFICATION) + .build(); boolean testShuffleModeEnabled = true; @Player.RepeatMode int testRepeatMode = Player.REPEAT_MODE_ALL; int testCurrentAdGroupIndex = 33; @@ -2173,9 +2170,8 @@ public class MediaControllerListenerTest { latch.countDown(); } }; - MediaController controller = - controllerTestRule.createController( - remoteSession.getToken(), /* connectionHints= */ null, listener); + controllerTestRule.createController( + remoteSession.getToken(), /* connectionHints= */ null, listener); SessionCommands commands = new SessionCommands.Builder() @@ -2392,9 +2388,8 @@ public class MediaControllerListenerTest { return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS)); } }; - MediaController controller = - controllerTestRule.createController( - remoteSession.getToken(), /* connectionHints= */ null, listener); + controllerTestRule.createController( + remoteSession.getToken(), /* connectionHints= */ null, listener); // TODO(b/245724167): Test with multiple controllers remoteSession.broadcastCustomCommand(testCommand, testArgs); @@ -2448,9 +2443,7 @@ public class MediaControllerListenerTest { } }; RemoteMediaSession session = createRemoteMediaSession(TEST_WITH_CUSTOM_COMMANDS); - MediaController controller = - controllerTestRule.createController( - session.getToken(), /* connectionHints= */ null, listener); + controllerTestRule.createController(session.getToken(), /* connectionHints= */ null, listener); session.setCustomLayout(buttons); @@ -2480,9 +2473,8 @@ public class MediaControllerListenerTest { latch.countDown(); } }; - MediaController controller = - controllerTestRule.createController( - remoteSession.getToken(), /* connectionHints= */ null, listener); + controllerTestRule.createController( + remoteSession.getToken(), /* connectionHints= */ null, listener); remoteSession.setSessionExtras(sessionExtras); @@ -2511,8 +2503,7 @@ public class MediaControllerListenerTest { }; Bundle connectionHints = new Bundle(); connectionHints.putString(KEY_CONTROLLER, "controller_key_1"); - MediaController controller = - controllerTestRule.createController(remoteSession.getToken(), connectionHints, listener); + controllerTestRule.createController(remoteSession.getToken(), connectionHints, listener); remoteSession.setSessionExtras("controller_key_1", sessionExtras); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerMediaSessionCompatCallbackAggregationTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerMediaSessionCompatCallbackAggregationTest.java index 9de288bdae..f520a1ae8b 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerMediaSessionCompatCallbackAggregationTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerMediaSessionCompatCallbackAggregationTest.java @@ -15,6 +15,7 @@ */ package androidx.media3.session; +import static androidx.media3.common.MediaMetadata.MEDIA_TYPE_PLAYLIST; import static androidx.media3.common.Player.DISCONTINUITY_REASON_AUTO_TRANSITION; import static androidx.media3.common.Player.EVENT_MEDIA_ITEM_TRANSITION; import static androidx.media3.common.Player.EVENT_MEDIA_METADATA_CHANGED; @@ -30,6 +31,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; import android.content.Context; import android.graphics.Bitmap; +import android.os.Bundle; import android.support.v4.media.MediaDescriptionCompat; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.RatingCompat; @@ -38,6 +40,7 @@ import android.support.v4.media.session.MediaSessionCompat.QueueItem; import android.support.v4.media.session.PlaybackStateCompat; import androidx.annotation.Nullable; import androidx.media3.common.FlagSet; +import androidx.media3.common.HeartRating; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaMetadata; import androidx.media3.common.Player; @@ -52,6 +55,7 @@ import androidx.media3.test.session.common.HandlerThreadTestRule; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.MediumTest; +import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -99,10 +103,22 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { List testMediaItems = MediaTestUtils.createMediaItemsWithArtworkData(testSize); List testQueue = convertToQueueItems(testMediaItems); int testMediaItemIndex = 1; - MediaMetadataCompat testMediaMetadataCompat = createMediaMetadataCompat(); + MediaMetadataCompat testMediaMetadataCompat = + new MediaMetadataCompat.Builder() + .putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist") + .putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title") + .putLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, MEDIA_TYPE_PLAYLIST) + .build(); @RatingCompat.Style int testRatingType = RatingCompat.RATING_HEART; MediaMetadata testMediaMetadata = - LegacyConversions.convertToMediaMetadata(testMediaMetadataCompat, testRatingType); + new MediaMetadata.Builder() + .setArtist("artist") + .setTitle("title") + .setUserRating(new HeartRating()) + .setMediaType(MEDIA_TYPE_PLAYLIST) + .setIsBrowsable(false) + .setIsPlayable(true) + .build(); MediaItem testCurrentMediaItem = new MediaItem.Builder() .setMediaId(testMediaItems.get(testMediaItemIndex).mediaId) @@ -231,10 +247,20 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { int testSize = 3; List testMediaItems = MediaTestUtils.createMediaItems(testSize); List testQueue = MediaTestUtils.convertToQueueItemsWithoutBitmap(testMediaItems); - MediaMetadataCompat testMediaMetadataCompat = createMediaMetadataCompat(); + MediaMetadataCompat testMediaMetadataCompat = + new MediaMetadataCompat.Builder() + .putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist") + .putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title") + .build(); @RatingCompat.Style int testRatingType = RatingCompat.RATING_HEART; MediaMetadata testMediaMetadata = - LegacyConversions.convertToMediaMetadata(testMediaMetadataCompat, testRatingType); + new MediaMetadata.Builder() + .setArtist("artist") + .setTitle("title") + .setUserRating(new HeartRating()) + .setIsBrowsable(false) + .setIsPlayable(true) + .build(); Events testEvents = new Events( new FlagSet.Builder() @@ -245,8 +271,7 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { EVENT_TIMELINE_CHANGED) .build()); int testMediaItemIndex = testSize; // Index of fake item. - testMediaItems.add( - LegacyConversions.convertToMediaItem(testMediaMetadataCompat, testRatingType)); + testMediaItems.add(new MediaItem.Builder().setMediaMetadata(testMediaMetadata).build()); MediaController controller = controllerTestRule.createController(session.getSessionToken()); CountDownLatch latch = new CountDownLatch(5); @@ -425,10 +450,20 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { @Test public void getters_withMetadata() throws Exception { - MediaMetadataCompat testMediaMetadataCompat = createMediaMetadataCompat(); + MediaMetadataCompat testMediaMetadataCompat = + new MediaMetadataCompat.Builder() + .putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist") + .putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title") + .build(); @RatingCompat.Style int testRatingType = RatingCompat.RATING_HEART; MediaMetadata testMediaMetadata = - LegacyConversions.convertToMediaMetadata(testMediaMetadataCompat, testRatingType); + new MediaMetadata.Builder() + .setArtist("artist") + .setTitle("title") + .setUserRating(new HeartRating()) + .setIsBrowsable(false) + .setIsPlayable(true) + .build(); Events testEvents = new Events( new FlagSet.Builder() @@ -439,9 +474,8 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { EVENT_TIMELINE_CHANGED) .build()); int testMediaItemIndex = 0; - List testMediaItems = new ArrayList<>(); - testMediaItems.add( - LegacyConversions.convertToMediaItem(testMediaMetadataCompat, testRatingType)); + ImmutableList testMediaItems = + ImmutableList.of(new MediaItem.Builder().setMediaMetadata(testMediaMetadata).build()); MediaController controller = controllerTestRule.createController(session.getSessionToken()); CountDownLatch latch = new CountDownLatch(5); @@ -523,13 +557,6 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { assertThat(currentMediaMetadata).isEqualTo(currentMediaItem.mediaMetadata); } - private static MediaMetadataCompat createMediaMetadataCompat() { - return new MediaMetadataCompat.Builder() - .putText(MediaMetadataCompat.METADATA_KEY_ARTIST, "artist") - .putText(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "title") - .build(); - } - private static void assertTimelineEqualsToMediaItems( Timeline currentTimeline, List mediaItems) { assertThat(currentTimeline.getWindowCount()).isEqualTo(mediaItems.size()); @@ -549,8 +576,14 @@ public class MediaControllerMediaSessionCompatCallbackAggregationTest { MediaItem item = mediaItems.get(i); @Nullable Bitmap bitmap = bitmapLoader.decodeBitmap(item.mediaMetadata.artworkData).get(10, SECONDS); + Bundle extras = new Bundle(); + extras.putLong(MediaConstants.EXTRAS_KEY_MEDIA_TYPE_COMPAT, item.mediaMetadata.mediaType); MediaDescriptionCompat description = - LegacyConversions.convertToMediaDescriptionCompat(item, bitmap); + new MediaDescriptionCompat.Builder() + .setMediaId(item.mediaId) + .setIconBitmap(bitmap) + .setExtras(extras) + .build(); long id = LegacyConversions.convertToQueueItemId(i); list.add(new MediaSessionCompat.QueueItem(description, id)); } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java index 3f205b6f63..cf5ba53b27 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java @@ -16,6 +16,8 @@ package androidx.media3.session; import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_ADVERTISEMENT; +import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_ALBUM_ART; +import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_ARTIST; import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION; import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI; import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE; @@ -31,6 +33,7 @@ import static androidx.media3.session.MediaConstants.ARGUMENT_CAPTIONING_ENABLED import static androidx.media3.session.MediaConstants.SESSION_COMMAND_ON_CAPTIONING_ENABLED_CHANGED; import static androidx.media3.session.SessionResult.RESULT_SUCCESS; import static androidx.media3.test.session.common.CommonConstants.DEFAULT_TEST_NAME; +import static androidx.media3.test.session.common.CommonConstants.KEY_DURATION; import static androidx.media3.test.session.common.CommonConstants.METADATA_ALBUM_TITLE; import static androidx.media3.test.session.common.CommonConstants.METADATA_ARTIST; import static androidx.media3.test.session.common.CommonConstants.METADATA_DESCRIPTION; @@ -818,14 +821,8 @@ public class MediaControllerWithMediaSessionCompatTest { throws Exception { List testList = MediaTestUtils.createMediaItems(3); List testQueue = MediaTestUtils.convertToQueueItemsWithoutBitmap(testList); - MediaItem testRemoveMediaItem = MediaTestUtils.createMediaItem("removed"); MediaMetadataCompat testMetadataCompat = - LegacyConversions.convertToMediaMetadataCompat( - testRemoveMediaItem.mediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 100L, - /* artworkBitmap= */ null); + new MediaMetadataCompat.Builder().putString(METADATA_KEY_MEDIA_ID, "mediaId").build(); session.setQueue(testQueue); session.setMetadata(testMetadataCompat); MediaController controller = controllerTestRule.createController(session.getSessionToken()); @@ -840,14 +837,8 @@ public class MediaControllerWithMediaSessionCompatTest { throws Exception { List testList = MediaTestUtils.createMediaItems(3); List testQueue = MediaTestUtils.convertToQueueItemsWithoutBitmap(testList); - MediaItem testRemoveMediaItem = MediaTestUtils.createMediaItem("removed"); MediaMetadataCompat testMetadataCompat = - LegacyConversions.convertToMediaMetadataCompat( - testRemoveMediaItem.mediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 100L, - /* artworkBitmap= */ null); + new MediaMetadataCompat.Builder().putString(METADATA_KEY_MEDIA_ID, "mediaId").build(); session.setQueue(testQueue); session.setMetadata(testMetadataCompat); MediaController controller = controllerTestRule.createController(session.getSessionToken()); @@ -879,14 +870,8 @@ public class MediaControllerWithMediaSessionCompatTest { throws Exception { List testList = MediaTestUtils.createMediaItems(3); List testQueue = MediaTestUtils.convertToQueueItemsWithoutBitmap(testList); - MediaItem testRemoveMediaItem = MediaTestUtils.createMediaItem("removed"); MediaMetadataCompat testMetadataCompat = - LegacyConversions.convertToMediaMetadataCompat( - testRemoveMediaItem.mediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 100L, - /* artworkBitmap= */ null); + new MediaMetadataCompat.Builder().putString(METADATA_KEY_MEDIA_ID, "mediaId").build(); session.setQueue(testQueue); session.setMetadata(testMetadataCompat); MediaController controller = controllerTestRule.createController(session.getSessionToken()); @@ -900,22 +885,15 @@ public class MediaControllerWithMediaSessionCompatTest { @Test public void getMediaMetadata_withMediaMetadataCompat_returnsConvertedMediaMetadata() throws Exception { - MediaItem testMediaItem = MediaTestUtils.createMediaItem("test"); - MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata; MediaMetadataCompat testMediaMetadataCompat = - LegacyConversions.convertToMediaMetadataCompat( - testMediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 100L, - /* artworkBitmap= */ null); + new MediaMetadataCompat.Builder().putString(METADATA_KEY_ARTIST, "artist").build(); session.setMetadata(testMediaMetadataCompat); MediaController controller = controllerTestRule.createController(session.getSessionToken()); MediaMetadata mediaMetadata = threadTestRule.getHandler().postAndSync(controller::getMediaMetadata); - assertThat(mediaMetadata).isEqualTo(testMediaMetadata); + assertThat(mediaMetadata.artist.toString()).isEqualTo("artist"); } @Test @@ -925,12 +903,7 @@ public class MediaControllerWithMediaSessionCompatTest { MediaMetadata testMediaMetadata = testMediaItem.mediaMetadata; @Nullable Bitmap artworkBitmap = getBitmapFromMetadata(testMediaMetadata); MediaMetadataCompat testMediaMetadataCompat = - LegacyConversions.convertToMediaMetadataCompat( - testMediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 100L, - artworkBitmap); + new MediaMetadataCompat.Builder().putBitmap(METADATA_KEY_ALBUM_ART, artworkBitmap).build(); session.setMetadata(testMediaMetadataCompat); MediaController controller = controllerTestRule.createController(session.getSessionToken()); @@ -951,7 +924,7 @@ public class MediaControllerWithMediaSessionCompatTest { .setArtworkData(/* artworkData= */ null, /* artworkDataType= */ null) .build(); } - assertThat(mediaMetadata).isEqualTo(testMediaMetadata); + assertThat(mediaMetadata.artworkData).isEqualTo(testMediaMetadata.artworkData); } @Test @@ -1004,7 +977,7 @@ public class MediaControllerWithMediaSessionCompatTest { .putText( MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, testMediaMetadataCompatDescription) - .putText(MediaMetadataCompat.METADATA_KEY_ARTIST, METADATA_ARTIST) + .putText(METADATA_KEY_ARTIST, METADATA_ARTIST) .putText(MediaMetadataCompat.METADATA_KEY_ALBUM, METADATA_ALBUM_TITLE) .build(); long testActiveQueueId = 0; @@ -1269,15 +1242,8 @@ public class MediaControllerWithMediaSessionCompatTest { @Test public void setPlaybackState_fromStateBufferingToPlaying_notifiesReadyState() throws Exception { - List testPlaylist = MediaTestUtils.createMediaItems(/* size= */ 1); - MediaItem firstMediaItemInPlaylist = testPlaylist.get(0); MediaMetadataCompat metadata = - LegacyConversions.convertToMediaMetadataCompat( - firstMediaItemInPlaylist.mediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 50_000, - /* artworkBitmap= */ null); + new MediaMetadataCompat.Builder().putLong(KEY_DURATION, 50_000L).build(); long testBufferedPosition = 5_000; session.setMetadata(metadata); session.setPlaybackState( @@ -1319,15 +1285,12 @@ public class MediaControllerWithMediaSessionCompatTest { @Test public void setPlaybackState_fromStatePlayingToBuffering_notifiesBufferingState() throws Exception { - List testPlaylist = MediaTestUtils.createMediaItems(1); - MediaItem firstMediaItemInPlaylist = testPlaylist.get(0); MediaMetadataCompat metadata = - LegacyConversions.convertToMediaMetadataCompat( - firstMediaItemInPlaylist.mediaMetadata, - "mediaId", - Uri.parse("http://example.com"), - /* durationMs= */ 1_000, - /* artworkBitmap= */ null); + new MediaMetadataCompat.Builder() + .putString(METADATA_KEY_MEDIA_ID, "mediaId") + .putString(METADATA_KEY_MEDIA_URI, "http://example.com") + .putLong(KEY_DURATION, 1000L) + .build(); long testBufferingPosition = 0; session.setMetadata(metadata); session.setPlaybackState( @@ -2001,7 +1964,7 @@ public class MediaControllerWithMediaSessionCompatTest { .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, "mediaItem_2") .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Title") .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Subtitle") - .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "Artist") + .putString(METADATA_KEY_ARTIST, "Artist") .build()); MediaController controller = controllerTestRule.createController(session.getSessionToken()); CountDownLatch countDownLatch = new CountDownLatch(1); @@ -2044,7 +2007,7 @@ public class MediaControllerWithMediaSessionCompatTest { .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, "mediaItem_2") .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Title") .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Subtitle") - .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "Artist") + .putString(METADATA_KEY_ARTIST, "Artist") .build()); MediaController controller = controllerTestRule.createController(session.getSessionToken()); CountDownLatch countDownLatch = new CountDownLatch(1); @@ -2163,7 +2126,7 @@ public class MediaControllerWithMediaSessionCompatTest { .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, "mediaItem_2") .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, "Title") .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Subtitle") - .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "Artist") + .putString(METADATA_KEY_ARTIST, "Artist") .build()); session.setQueue(testQueue); MediaController controller = controllerTestRule.createController(session.getSessionToken()); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java index eb5a3f76ab..31fffe067f 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCallbackWithMediaControllerCompatTest.java @@ -42,7 +42,6 @@ import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.MediaSessionCompat.QueueItem; import android.support.v4.media.session.PlaybackStateCompat; import android.view.KeyEvent; -import androidx.media.AudioAttributesCompat; import androidx.media.AudioManagerCompat; import androidx.media3.common.AudioAttributes; import androidx.media3.common.C; @@ -51,6 +50,7 @@ import androidx.media3.common.ForwardingPlayer; import androidx.media3.common.MediaItem; import androidx.media3.common.Player; import androidx.media3.common.Rating; +import androidx.media3.common.StarRating; import androidx.media3.common.util.Log; import androidx.media3.common.util.Util; import androidx.media3.session.MediaSession.ControllerInfo; @@ -161,7 +161,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); // Invoke any command for session to recognize the controller compat. controller.getTransportControls().seekTo(111); @@ -202,7 +202,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { session.setLegacyControllerConnectionTimeoutMs(0); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); // Invoke any command for session to recognize the controller compat. controller.getTransportControls().seekTo(111); assertThat(disconnectedLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); @@ -223,7 +223,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().play(); player.awaitMethodCalled(MockPlayer.METHOD_PLAY, TIMEOUT_MS); @@ -242,7 +242,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().play(); player.awaitMethodCalled(MockPlayer.METHOD_PREPARE, TIMEOUT_MS); @@ -263,7 +263,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().play(); player.awaitMethodCalled(MockPlayer.METHOD_PLAY, TIMEOUT_MS); @@ -282,7 +282,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().play(); player.awaitMethodCalled(MockPlayer.METHOD_SEEK_TO_DEFAULT_POSITION, TIMEOUT_MS); @@ -307,7 +307,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().play(); player.awaitMethodCalled(MockPlayer.METHOD_PLAY, TIMEOUT_MS); @@ -325,7 +325,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().pause(); player.awaitMethodCalled(MockPlayer.METHOD_PAUSE, TIMEOUT_MS); @@ -340,7 +340,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().stop(); player.awaitMethodCalled(MockPlayer.METHOD_STOP, TIMEOUT_MS); @@ -355,7 +355,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().prepare(); player.awaitMethodCalled(MockPlayer.METHOD_PREPARE, TIMEOUT_MS); @@ -370,7 +370,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); long seekPosition = 12125L; controller.getTransportControls().seekTo(seekPosition); @@ -388,7 +388,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); float testSpeed = 2.0f; controller.getTransportControls().setPlaybackSpeed(testSpeed); @@ -406,7 +406,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().setPlaybackSpeed(-0.0001f); controller.getTransportControls().setPlaybackSpeed(Float.NaN); @@ -437,7 +437,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); handler.postAndSync( () -> { @@ -483,7 +483,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); handler.postAndSync( () -> { @@ -529,7 +529,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); handler.postAndSync( () -> { @@ -561,7 +561,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); List mediaItems = MediaTestUtils.createMediaItems(/* size= */ 10); handler.postAndSync( @@ -591,7 +591,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().skipToPrevious(); player.awaitMethodCalled(MockPlayer.METHOD_SEEK_TO_PREVIOUS, TIMEOUT_MS); @@ -612,7 +612,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().skipToPrevious(); player.awaitMethodCalled(MockPlayer.METHOD_SEEK_TO_PREVIOUS_MEDIA_ITEM, TIMEOUT_MS); @@ -627,7 +627,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().skipToNext(); player.awaitMethodCalled(MockPlayer.METHOD_SEEK_TO_NEXT, TIMEOUT_MS); @@ -645,7 +645,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().skipToNext(); player.awaitMethodCalled(MockPlayer.METHOD_SEEK_TO_NEXT_MEDIA_ITEM, TIMEOUT_MS); @@ -660,7 +660,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); handler.postAndSync( () -> { @@ -669,7 +669,8 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { }); // Get Queue from local MediaControllerCompat. - List queue = session.getSessionCompat().getController().getQueue(); + List queue = + new MediaControllerCompat(context, session.getSessionCompatToken()).getQueue(); int targetIndex = 3; controller.getTransportControls().skipToQueueItem(queue.get(targetIndex).getQueueId()); player.awaitMethodCalled( @@ -687,7 +688,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); handler.postAndSync( () -> { player.timeline = MediaTestUtils.createTimeline(/* windowCount= */ 10); @@ -726,9 +727,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build())); controller = new RemoteMediaControllerCompat( - context, - session.get().getSessionCompat().getSessionToken(), - /* waitForConnection= */ true); + context, session.get().getSessionCompatToken(), /* waitForConnection= */ true); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); session.get().getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); @@ -758,7 +757,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { session = new MediaSession.Builder(context, player).setId("dispatchMediaButtonEvent").build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); session.getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); @@ -782,7 +781,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { session = new MediaSession.Builder(context, player).setId("dispatchMediaButtonEvent").build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); session.getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); @@ -821,7 +820,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); session.getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); @@ -860,9 +859,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build())); controller = new RemoteMediaControllerCompat( - context, - session.get().getSessionCompat().getSessionToken(), - /* waitForConnection= */ true); + context, session.get().getSessionCompatToken(), /* waitForConnection= */ true); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); Bundle connectionHints = new Bundle(); connectionHints.putBoolean(MediaController.KEY_MEDIA_NOTIFICATION_CONTROLLER_FLAG, true); @@ -909,7 +906,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); session.getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); @@ -940,9 +937,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build())); controller = new RemoteMediaControllerCompat( - context, - session.get().getSessionCompat().getSessionToken(), - /* waitForConnection= */ true); + context, session.get().getSessionCompatToken(), /* waitForConnection= */ true); session.get().getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); player.awaitMethodCalled(MockPlayer.METHOD_PLAY, TIMEOUT_MS); @@ -982,9 +977,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .get(); controller = new RemoteMediaControllerCompat( - context, - session.get().getSessionCompat().getSessionToken(), - /* waitForConnection= */ true); + context, session.get().getSessionCompatToken(), /* waitForConnection= */ true); session.get().getSessionCompat().getController().dispatchMediaButtonEvent(keyEvent); @@ -1008,7 +1001,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); @PlaybackStateCompat.ShuffleMode int testShuffleMode = PlaybackStateCompat.SHUFFLE_MODE_GROUP; controller.getTransportControls().setShuffleMode(testShuffleMode); @@ -1026,7 +1019,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); int testRepeatMode = Player.REPEAT_MODE_ALL; controller.getTransportControls().setRepeatMode(testRepeatMode); @@ -1044,7 +1037,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); MockPlayer remotePlayer = new MockPlayer.Builder().setApplicationLooper(handler.getLooper()).build(); remotePlayer.commands = @@ -1076,7 +1069,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); MockPlayer remotePlayer = new MockPlayer.Builder().setApplicationLooper(handler.getLooper()).build(); remotePlayer.commands = new Player.Commands.Builder().addAllCommands().build(); @@ -1104,7 +1097,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); MockPlayer remotePlayer = new MockPlayer.Builder().setApplicationLooper(handler.getLooper()).build(); remotePlayer.commands = @@ -1133,7 +1126,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); MockPlayer remotePlayer = new MockPlayer.Builder().setApplicationLooper(handler.getLooper()).build(); handler.postAndSync( @@ -1157,7 +1150,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); MockPlayer remotePlayer = new MockPlayer.Builder().setApplicationLooper(handler.getLooper()).build(); remotePlayer.commands = @@ -1186,7 +1179,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); MockPlayer remotePlayer = new MockPlayer.Builder().setApplicationLooper(handler.getLooper()).build(); remotePlayer.commands = new Player.Commands.Builder().addAllCommands().build(); @@ -1216,7 +1209,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); // Here, we intentionally choose STREAM_ALARM in order not to consider // 'Do Not Disturb' or 'Volume limit'. @@ -1232,8 +1225,10 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { () -> { // Set stream of the session. AudioAttributes attrs = - LegacyConversions.convertToAudioAttributes( - new AudioAttributesCompat.Builder().setLegacyStreamType(stream).build()); + new AudioAttributes.Builder() + .setUsage(C.USAGE_ALARM) + .setContentType(C.AUDIO_CONTENT_TYPE_SONIFICATION) + .build(); player.audioAttributes = attrs; player.notifyAudioAttributesChanged(attrs); }); @@ -1264,7 +1259,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); // Here, we intentionally choose STREAM_ALARM in order not to consider // 'Do Not Disturb' or 'Volume limit'. @@ -1280,8 +1275,10 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { () -> { // Set stream of the session. AudioAttributes attrs = - LegacyConversions.convertToAudioAttributes( - new AudioAttributesCompat.Builder().setLegacyStreamType(stream).build()); + new AudioAttributes.Builder() + .setUsage(C.USAGE_ALARM) + .setContentType(C.AUDIO_CONTENT_TYPE_SONIFICATION) + .build(); player.audioAttributes = attrs; player.notifyAudioAttributesChanged(attrs); }); @@ -1345,7 +1342,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.sendCommand(testCommand, testArgs, /* cb= */ null); @@ -1397,7 +1394,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.sendCustomCommand(customCommand, testArgs); @@ -1422,7 +1419,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { // Session will not accept the controller's commands. controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().play(); @@ -1454,7 +1451,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().prepareFromUri(mediaUri, bundle); @@ -1490,7 +1487,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().playFromUri(request, bundle); @@ -1527,7 +1524,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().prepareFromMediaId(request, bundle); @@ -1571,7 +1568,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().prepareFromMediaId(request, bundle); @@ -1609,7 +1606,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().playFromMediaId(mediaId, bundle); @@ -1652,7 +1649,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().playFromMediaId(mediaId, bundle); @@ -1688,7 +1685,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().prepareFromSearch(query, bundle); @@ -1724,7 +1721,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().playFromSearch(query, bundle); @@ -1758,7 +1755,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().prepareFromUri(Uri.parse("foo://bar"), Bundle.EMPTY); @@ -1788,7 +1785,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().playFromUri(Uri.parse("foo://bar"), Bundle.EMPTY); @@ -1822,7 +1819,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().playFromUri(Uri.parse("foo://bar"), Bundle.EMPTY); @@ -1849,7 +1846,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { String mediaIdOut, Rating ratingOut) { assertThat(mediaIdOut).isEqualTo(mediaId); - assertThat(ratingOut).isEqualTo(LegacyConversions.convertToRating(rating)); + assertThat(ratingOut).isEqualTo(new StarRating(5, 3.5f)); latch.countDown(); return Futures.immediateFuture(new SessionResult(RESULT_SUCCESS)); } @@ -1863,7 +1860,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { new MediaSession.Builder(context, player).setId("setRating").setCallback(callback).build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().setRating(rating); @@ -1896,7 +1893,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); controller.getTransportControls().pause(); @@ -1925,7 +1922,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); // This may hang if deadlock happens. handler.postAndSync( () -> { @@ -1960,7 +1957,7 @@ public class MediaSessionCallbackWithMediaControllerCompatTest { .build(); controller = new RemoteMediaControllerCompat( - context, session.getSessionCompat().getSessionToken(), /* waitForConnection= */ true); + context, session.getSessionCompatToken(), /* waitForConnection= */ true); session.release(); session = null; diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCompatCallbackWithMediaControllerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCompatCallbackWithMediaControllerTest.java index 25dac2cf40..6a0be4b042 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCompatCallbackWithMediaControllerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionCompatCallbackWithMediaControllerTest.java @@ -717,7 +717,8 @@ public class MediaSessionCompatCallbackWithMediaControllerTest { controller.setRating(mediaId, rating); assertThat(sessionCallback.await(TIMEOUT_MS)).isTrue(); assertThat(sessionCallback.onSetRatingCalled).isTrue(); - assertThat(LegacyConversions.convertToRating(sessionCallback.rating)).isEqualTo(rating); + assertThat(sessionCallback.rating.getRatingStyle()).isEqualTo(RatingCompat.RATING_5_STARS); + assertThat(sessionCallback.rating.getStarRating()).isEqualTo(3.5f); } @Test @@ -730,7 +731,8 @@ public class MediaSessionCompatCallbackWithMediaControllerTest { controller.setRating(rating); assertThat(sessionCallback.await(TIMEOUT_MS)).isTrue(); assertThat(sessionCallback.onSetRatingCalled).isTrue(); - assertThat(LegacyConversions.convertToRating(sessionCallback.rating)).isEqualTo(rating); + assertThat(sessionCallback.rating.getRatingStyle()).isEqualTo(RatingCompat.RATING_5_STARS); + assertThat(sessionCallback.rating.getStarRating()).isEqualTo(3.5f); } @Test diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java index dca59228cb..106900ce6e 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionPlayerTest.java @@ -1082,7 +1082,8 @@ public class MediaSessionPlayerTest { Context context = ApplicationProvider.getApplicationContext(); MediaSession session = new MediaSession.Builder(context, player).setId("test").build(); sessionReference.set(session); - MediaControllerCompat controller = session.getSessionCompat().getController(); + MediaControllerCompat controller = + new MediaControllerCompat(context, session.getSessionCompatToken()); controller.getTransportControls().play(); eventHandled.await(); @@ -1136,7 +1137,8 @@ public class MediaSessionPlayerTest { }) .build(); sessionReference.set(session); - MediaControllerCompat controller = session.getSessionCompat().getController(); + MediaControllerCompat controller = + new MediaControllerCompat(context, session.getSessionCompatToken()); controller.getTransportControls().playFromUri(Uri.parse("test://"), Bundle.EMPTY); eventHandled.await(); @@ -1192,7 +1194,8 @@ public class MediaSessionPlayerTest { MainLooperTestRule.runOnMainSync( () -> { - MediaControllerCompat controller = session.getSessionCompat().getController(); + MediaControllerCompat controller = + new MediaControllerCompat(context, session.getSessionCompatToken()); controller.addQueueItem(new MediaDescriptionCompat.Builder().setMediaId("id").build()); }); eventHandled.await(); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionServiceTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionServiceTest.java index 73f55b153d..62348604cf 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionServiceTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionServiceTest.java @@ -298,9 +298,19 @@ public class MediaSessionServiceTest { TestServiceRegistry.getInstance().setOnGetSessionHandler(controllerInfo -> mediaSession); MediaControllerCompat mediaControllerCompat = new MediaControllerCompat( - ApplicationProvider.getApplicationContext(), mediaSession.getSessionCompat()); - ImmutableList initialCustomLayoutInControllerCompat = - LegacyConversions.convertToCustomLayout(mediaControllerCompat.getPlaybackState()); + ApplicationProvider.getApplicationContext(), mediaSession.getSessionCompatToken()); + CountDownLatch controllerReady = new CountDownLatch(1); + mediaControllerCompat.registerCallback( + new MediaControllerCompat.Callback() { + @Override + public void onSessionReady() { + controllerReady.countDown(); + } + }, + new Handler(Looper.getMainLooper())); + controllerReady.await(); + List initialCustomActionsInControllerCompat = + mediaControllerCompat.getPlaybackState().getCustomActions(); // Start the service by creating a remote controller. RemoteMediaController remoteController = @@ -322,10 +332,18 @@ public class MediaSessionServiceTest { assertThat(remoteController.getCustomLayout()) .containsExactly(button1.copyWithIsEnabled(false), button2.copyWithIsEnabled(false)) .inOrder(); - assertThat(initialCustomLayoutInControllerCompat).isEmpty(); - assertThat(LegacyConversions.convertToCustomLayout(mediaControllerCompat.getPlaybackState())) - .containsExactly(button1.copyWithIsEnabled(true), button3.copyWithIsEnabled(true)) - .inOrder(); + assertThat(initialCustomActionsInControllerCompat).isEmpty(); + assertThat(mediaControllerCompat.getPlaybackState().getCustomActions()).hasSize(2); + PlaybackStateCompat.CustomAction customAction1 = + mediaControllerCompat.getPlaybackState().getCustomActions().get(0); + PlaybackStateCompat.CustomAction customAction2 = + mediaControllerCompat.getPlaybackState().getCustomActions().get(1); + assertThat(customAction1.getAction()).isEqualTo("command1"); + assertThat(customAction1.getName().toString()).isEqualTo("button1"); + assertThat(customAction1.getIcon()).isEqualTo(R.drawable.media3_notification_small_icon); + assertThat(customAction2.getAction()).isEqualTo("command3"); + assertThat(customAction2.getName().toString()).isEqualTo("button3"); + assertThat(customAction2.getIcon()).isEqualTo(R.drawable.media3_notification_small_icon); mediaSession.release(); ((MockMediaSessionService) TestServiceRegistry.getInstance().getServiceInstance()) .blockUntilAllControllersUnbind(TIMEOUT_MS); diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionTest.java index 4d9dd28068..513a7e4ffb 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionTest.java @@ -990,15 +990,13 @@ public class MediaSessionTest { } private static ControllerInfo createMediaButtonCaller() { - return new ControllerInfo( - new MediaSessionManager.RemoteUserInfo( - "RANDOM_MEDIA_BUTTON_CALLER_PACKAGE", - MediaSessionManager.RemoteUserInfo.UNKNOWN_PID, - MediaSessionManager.RemoteUserInfo.UNKNOWN_UID), + return ControllerInfo.createTestOnlyControllerInfo( + "RANDOM_MEDIA_BUTTON_CALLER_PACKAGE", + MediaSessionManager.RemoteUserInfo.UNKNOWN_PID, + MediaSessionManager.RemoteUserInfo.UNKNOWN_UID, MediaLibraryInfo.VERSION_INT, MediaControllerStub.VERSION_INT, /* trusted= */ false, - /* cb= */ null, /* connectionHints= */ Bundle.EMPTY); } diff --git a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionWithMediaControllerCompatTest.java b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionWithMediaControllerCompatTest.java index a970d1dfda..6b3a7c5d6e 100644 --- a/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionWithMediaControllerCompatTest.java +++ b/libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionWithMediaControllerCompatTest.java @@ -87,8 +87,7 @@ public class MediaSessionWithMediaControllerCompatTest { sessionTestRule.ensureReleaseAfterTest( new MediaSession.Builder(context, player).setId(TAG).setCallback(callback).build()); RemoteMediaControllerCompat controllerCompat = - remoteControllerTestRule.createRemoteControllerCompat( - session.getSessionCompat().getSessionToken()); + remoteControllerTestRule.createRemoteControllerCompat(session.getSessionCompatToken()); // Invoke any command for session to recognize the controller compat. controllerCompat.getTransportControls().prepare(); @@ -131,8 +130,7 @@ public class MediaSessionWithMediaControllerCompatTest { .get(); RemoteMediaControllerCompat controllerCompat = - remoteControllerTestRule.createRemoteControllerCompat( - session.getSessionCompat().getSessionToken()); + remoteControllerTestRule.createRemoteControllerCompat(session.getSessionCompatToken()); controllerCompat.transportControls.play(); assertThat(connectedLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue(); @@ -143,8 +141,7 @@ public class MediaSessionWithMediaControllerCompatTest { SessionCommands.EMPTY, Player.Commands.EMPTY.buildUpon().add(Player.COMMAND_GET_TIMELINE).build()); RemoteMediaControllerCompat controllerCompat2 = - remoteControllerTestRule.createRemoteControllerCompat( - session.getSessionCompat().getSessionToken()); + remoteControllerTestRule.createRemoteControllerCompat(session.getSessionCompatToken()); controllerCompat2.transportControls.pause(); assertThat(controllerCompat.getQueueSize()).isEqualTo(2);