From e1c62df256329e4152a85508c4f68a4469af3e50 Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 18 Apr 2024 05:28:51 -0700 Subject: [PATCH] Remove media1 public API dependencies from session module This is the preparation to import the media1 classes as private copies into media3. - Reword Javadoc to use @code instead of @link to media1 types. This avoids accidentally linking to the future internal types. - Use fully qualified names for the converter methods to and from MediaSessionCompat.Token to ensure they keep the publicly available type. - Add new public variable that is directly referenced from our code instead of referring the the media1 equivalent. - Clean up tests that are using media1 types to make assertions on media3 fields and vice versa (mostly when using LegacyConversions in the test method). This also makes the tests more DAMP than DRY. (also moved LegacyConversionsTest to a unit test as it doesn't test cross-process communication) PiperOrigin-RevId: 626000082 --- api.txt | 1 + .../media3/session/LibraryResult.java | 7 +- .../androidx/media3/session/MediaBrowser.java | 3 +- .../media3/session/MediaConstants.java | 13 +- .../media3/session/MediaController.java | 71 +++++---- .../media3/session/MediaLibraryService.java | 25 ++- .../androidx/media3/session/MediaSession.java | 93 +++++++---- .../media3/session/MediaSessionService.java | 8 +- .../MediaSessionServiceLegacyStub.java | 2 +- .../session/MediaStyleNotificationHelper.java | 6 +- .../media3/session/SessionCommand.java | 6 +- .../media3/session/SessionResult.java | 7 +- .../androidx/media3/session/SessionToken.java | 27 ++-- .../media3/session/LegacyConversionsTest.java | 90 ++++++++--- ...lerCompatCallbackWithMediaSessionTest.java | 64 ++++---- ...tateCompatActionsWithMediaSessionTest.java | 65 +++++--- .../session/MediaControllerListenerTest.java | 53 +++---- ...aSessionCompatCallbackAggregationTest.java | 71 ++++++--- ...aControllerWithMediaSessionCompatTest.java | 77 +++------- ...CallbackWithMediaControllerCompatTest.java | 145 +++++++++--------- ...CompatCallbackWithMediaControllerTest.java | 6 +- .../session/MediaSessionPlayerTest.java | 9 +- .../session/MediaSessionServiceTest.java | 32 +++- .../media3/session/MediaSessionTest.java | 10 +- ...aSessionWithMediaControllerCompatTest.java | 9 +- 25 files changed, 509 insertions(+), 391 deletions(-) rename libraries/{test_session_current/src/androidTest => session/src/test}/java/androidx/media3/session/LegacyConversionsTest.java (93%) 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);