Merge changes Ifda931c3,Ibdfc5d84 into androidx-master-dev

* changes:
  Version-compat-test: Move MediaSession2LegacyTest
  Version-compat-test: Add RemoteMediaSession2#updatePlayerConnector()
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/MediaTestUtils.java b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/MediaTestUtils.java
index c74f672..5c12a69 100644
--- a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/MediaTestUtils.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/MediaTestUtils.java
@@ -97,7 +97,7 @@
                 .putString(MediaMetadata2.METADATA_KEY_MEDIA_ID, mediaId).build();
     }
 
-    private static DataSourceDesc2 createDSD() {
+    public static DataSourceDesc2 createDSD() {
         return new FileDataSourceDesc2.Builder(new FileDescriptor()).build();
     }
 
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/RemoteMediaSession2.java b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/RemoteMediaSession2.java
index dc02669..ca81e8f 100644
--- a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/RemoteMediaSession2.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/RemoteMediaSession2.java
@@ -17,6 +17,18 @@
 package androidx.media.test.client;
 
 import static androidx.media.test.lib.CommonConstants.ACTION_MEDIA_SESSION2;
+import static androidx.media.test.lib.CommonConstants.KEY_AUDIO_ATTRIBUTES;
+import static androidx.media.test.lib.CommonConstants.KEY_BUFFERED_POSITION;
+import static androidx.media.test.lib.CommonConstants.KEY_BUFFERING_STATE;
+import static androidx.media.test.lib.CommonConstants.KEY_CURRENT_POSITION;
+import static androidx.media.test.lib.CommonConstants.KEY_CURRENT_VOLUME;
+import static androidx.media.test.lib.CommonConstants.KEY_MAX_VOLUME;
+import static androidx.media.test.lib.CommonConstants.KEY_MEDIA_ITEM;
+import static androidx.media.test.lib.CommonConstants.KEY_METADATA;
+import static androidx.media.test.lib.CommonConstants.KEY_PLAYER_STATE;
+import static androidx.media.test.lib.CommonConstants.KEY_PLAYLIST;
+import static androidx.media.test.lib.CommonConstants.KEY_SPEED;
+import static androidx.media.test.lib.CommonConstants.KEY_VOLUME_CONTROL_TYPE;
 import static androidx.media.test.lib.CommonConstants.REMOTE_MEDIA_SESSION2_SERVICE;
 import static androidx.media.test.lib.TestUtils.WAIT_TIME_MS;
 
@@ -36,9 +48,12 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.media.AudioAttributesCompat;
 import androidx.media.test.lib.MediaSession2Constants;
 import androidx.media2.MediaItem2;
 import androidx.media2.MediaMetadata2;
+import androidx.media2.MediaPlayerConnector;
+import androidx.media2.MediaPlaylistAgent;
 import androidx.media2.MediaSession2;
 import androidx.media2.MediaSession2.CommandButton;
 import androidx.media2.MediaSession2.ControllerInfo;
@@ -120,6 +135,69 @@
         return mRemotePlaylistAgent;
     }
 
+    /**
+     * Create a {@link Bundle} which represents a configuration of local
+     * {@link MediaPlayerConnector} in order to create a new mock player in the service app.
+     * <p>
+     * The returned value can be used in {@link #updatePlayerConnector(Bundle, Bundle)}.
+     */
+    public static Bundle createMockPlayerConnectorConfig(
+            int state, int buffState, long pos, long buffPos, float speed,
+            @Nullable AudioAttributesCompat attr) {
+        Bundle playerBundle = new Bundle();
+        playerBundle.putInt(KEY_PLAYER_STATE, state);
+        playerBundle.putInt(KEY_BUFFERING_STATE, buffState);
+        playerBundle.putLong(KEY_CURRENT_POSITION, pos);
+        playerBundle.putLong(KEY_BUFFERED_POSITION, buffPos);
+        playerBundle.putFloat(KEY_SPEED, speed);
+        if (attr != null) {
+            playerBundle.putBundle(KEY_AUDIO_ATTRIBUTES, attr.toBundle());
+        }
+        return playerBundle;
+    }
+
+    /**
+     * Create a {@link Bundle} which represents a configuration of remote
+     * {@link MediaPlayerConnector} in order to create a new mock player in the service app.
+     * <p>
+     * The returned value can be used in {@link #updatePlayerConnector(Bundle, Bundle)}.
+     */
+    public static Bundle createMockPlayerConnectorConfig(
+            int volumeControlType, int maxVolume, int currentVolume,
+            @Nullable AudioAttributesCompat attr) {
+        Bundle playerBundle = new Bundle();
+        playerBundle.putInt(KEY_VOLUME_CONTROL_TYPE, volumeControlType);
+        playerBundle.putInt(KEY_MAX_VOLUME, maxVolume);
+        playerBundle.putInt(KEY_CURRENT_VOLUME, currentVolume);
+        if (attr != null) {
+            playerBundle.putBundle(KEY_AUDIO_ATTRIBUTES, attr.toBundle());
+        }
+        return playerBundle;
+    }
+
+    /**
+     * Create a {@link Bundle} which represents a configuration of {@link MediaPlaylistAgent}
+     * in order to create a new mock playlist agent in the service app.
+     * <p>
+     * The returned value can be used in {@link #updatePlayerConnector(Bundle, Bundle)}.
+     */
+    public static Bundle createMockPlaylistAgentConfig(
+            @Nullable List<MediaItem2> playlist, @Nullable MediaItem2 currentItem,
+            @Nullable MediaMetadata2 metadata) {
+        Bundle agentBundle = new Bundle();
+        if (playlist != null) {
+            agentBundle.putParcelableArrayList(KEY_PLAYLIST,
+                    MediaTestUtils.playlistToParcelableArrayList(playlist));
+        }
+        if (currentItem != null) {
+            agentBundle.putBundle(KEY_MEDIA_ITEM, currentItem.toBundle());
+        }
+        if (metadata != null) {
+            agentBundle.putBundle(KEY_METADATA, metadata.toBundle());
+        }
+        return agentBundle;
+    }
+
     ////////////////////////////////////////////////////////////////////////////////
     // MediaSession2 methods
     ////////////////////////////////////////////////////////////////////////////////
@@ -164,6 +242,14 @@
         return token;
     }
 
+    public void updatePlayerConnector(@NonNull Bundle playerConfig, @Nullable Bundle agentConfig) {
+        try {
+            mBinder.updatePlayerConnector(mSessionId, playerConfig, agentConfig);
+        } catch (RemoteException ex) {
+            Log.e(TAG, "Failed to call updatePlayerConnector()");
+        }
+    }
+
     public void sendCustomCommand(@NonNull SessionCommand2 command, @Nullable Bundle args) {
         try {
             mBinder.sendCustomCommand(mSessionId, command.toBundle(), args);
@@ -343,12 +429,12 @@
             }
         }
 
-        public void setPlaylistNewDsd(List<MediaItem2> playlist) {
+        public void setPlaylistWithDummyDsd(List<MediaItem2> playlist) {
             try {
-                mBinder.setPlaylistWithNewDsd(
+                mBinder.setPlaylistWithDummyDsd(
                         mSessionId, MediaTestUtils.mediaItem2ListToBundleList(playlist));
             } catch (RemoteException ex) {
-                Log.e(TAG, "Failed to call setPlaylistNewDsd()");
+                Log.e(TAG, "Failed to call setPlaylistWithDummyDsd()");
             }
         }
 
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2CallbackTest.java b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2CallbackTest.java
index 5da6b01..27d9a5f 100644
--- a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2CallbackTest.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2CallbackTest.java
@@ -22,16 +22,7 @@
 import static androidx.media.test.lib.CommonConstants.DEFAULT_TEST_NAME;
 import static androidx.media.test.lib.CommonConstants.INDEX_FOR_NULL_DSD;
 import static androidx.media.test.lib.CommonConstants.INDEX_FOR_UNKONWN_DSD;
-import static androidx.media.test.lib.CommonConstants.KEY_AUDIO_ATTRIBUTES;
-import static androidx.media.test.lib.CommonConstants.KEY_CURRENT_VOLUME;
-import static androidx.media.test.lib.CommonConstants.KEY_MAX_VOLUME;
-import static androidx.media.test.lib.CommonConstants.KEY_PLAYER_STATE;
-import static androidx.media.test.lib.CommonConstants.KEY_PLAYLIST;
-import static androidx.media.test.lib.CommonConstants.KEY_VOLUME_CONTROL_TYPE;
 import static androidx.media.test.lib.CommonConstants.MOCK_MEDIA_LIBRARY_SERVICE;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands.UPDATE_PLAYER;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands
-        .UPDATE_PLAYER_WITH_VOLUME_PROVIDER;
 import static androidx.media.test.lib.MediaSession2Constants
         .TEST_CONTROLLER_CALLBACK_SESSION_REJECTS;
 import static androidx.media2.MediaMetadata2.METADATA_KEY_DURATION;
@@ -218,13 +209,13 @@
                     }
                 });
 
-        Bundle args = new Bundle();
-        args.putInt(KEY_PLAYER_STATE, testState);
-        args.putParcelableArrayList(
-                KEY_PLAYLIST, MediaTestUtils.playlistToParcelableArrayList(testPlaylist));
-        args.putBundle(KEY_AUDIO_ATTRIBUTES, testAudioAttributes.toBundle());
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                testState, 0 /* buffState */, 0 /* position */, 0 /* buffPosition */,
+                0f /* speed */, testAudioAttributes);
+        Bundle agentConfig = RemoteMediaSession2.createMockPlaylistAgentConfig(
+                testPlaylist, null /* currentItem */, null /* metadata */);
 
-        mRemoteSession2.runCustomTestCommands(UPDATE_PLAYER, args);
+        mRemoteSession2.updatePlayerConnector(playerConfig, agentConfig);
         assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
     }
 
@@ -233,7 +224,7 @@
         prepareLooper();
         final int listSize = 5;
         final List<MediaItem2> list = MediaTestUtils.createPlaylist(listSize);
-        mRemoteSession2.getMockPlaylistAgent().setPlaylistNewDsd(list);
+        mRemoteSession2.getMockPlaylistAgent().setPlaylistWithDummyDsd(list);
 
         final int currentItemIndex = 3;
         final MediaItem2 currentItem = list.get(currentItemIndex);
@@ -317,12 +308,9 @@
         };
         MediaController2 controller = createController(mRemoteSession2.getToken(), true, callback);
 
-        Bundle args = new Bundle();
-        args.putInt(KEY_MAX_VOLUME, maxVolume);
-        args.putInt(KEY_CURRENT_VOLUME, currentVolume);
-        args.putInt(KEY_VOLUME_CONTROL_TYPE, volumeControlType);
-        args.putParcelable(KEY_AUDIO_ATTRIBUTES, attrs.toBundle());
-        mRemoteSession2.runCustomTestCommands(UPDATE_PLAYER_WITH_VOLUME_PROVIDER, args);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                volumeControlType, maxVolume, currentVolume, attrs);
+        mRemoteSession2.updatePlayerConnector(playerConfig, null);
         assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
 
         PlaybackInfo info = controller.getPlaybackInfo();
@@ -376,7 +364,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         RemoteMediaSession2.RemoteMockPlaylistAgent agent = mRemoteSession2.getMockPlaylistAgent();
-        agent.setPlaylistNewDsd(playlist);
+        agent.setPlaylistWithDummyDsd(playlist);
         agent.setCurrentMediaItem(testItemIndex);
 
         RemoteMediaSession2.RemoteMockPlayer player = mRemoteSession2.getMockPlayer();
@@ -550,7 +538,7 @@
             }
         };
 
-        mRemoteSession2.getMockPlaylistAgent().setPlaylistNewDsd(testPlaylist);
+        mRemoteSession2.getMockPlaylistAgent().setPlaylistWithDummyDsd(testPlaylist);
 
         RemoteMediaSession2.RemoteMockPlayer player = mRemoteSession2.getMockPlayer();
         player.setBufferedPosition(testBufferingPosition);
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2Test.java b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2Test.java
index a518f4c2..e758798 100644
--- a/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2Test.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaController2Test.java
@@ -22,19 +22,6 @@
 import static androidx.media.VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
 import static androidx.media.VolumeProviderCompat.VOLUME_CONTROL_FIXED;
 import static androidx.media.test.lib.CommonConstants.DEFAULT_TEST_NAME;
-import static androidx.media.test.lib.CommonConstants.KEY_AUDIO_ATTRIBUTES;
-import static androidx.media.test.lib.CommonConstants.KEY_BUFFERED_POSITION;
-import static androidx.media.test.lib.CommonConstants.KEY_BUFFERING_STATE;
-import static androidx.media.test.lib.CommonConstants.KEY_CURRENT_POSITION;
-import static androidx.media.test.lib.CommonConstants.KEY_MEDIA_ITEM;
-import static androidx.media.test.lib.CommonConstants.KEY_PLAYER_STATE;
-import static androidx.media.test.lib.CommonConstants.KEY_SPEED;
-import static androidx.media.test.lib.CommonConstants.KEY_STREAM;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands
-        .CUSTOM_METHOD_SET_MULTIPLE_VALUES;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands.UPDATE_PLAYER;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands
-        .UPDATE_PLAYER_FOR_SETTING_STREAM_TYPE;
 import static androidx.media.test.lib.MediaSession2Constants.TEST_GET_SESSION_ACTIVITY;
 
 import static org.junit.Assert.assertEquals;
@@ -53,10 +40,10 @@
 import androidx.media.AudioAttributesCompat;
 import androidx.media.test.client.MediaTestUtils;
 import androidx.media.test.client.RemoteMediaSession2;
-import androidx.media2.MediaPlayerConnector;
 import androidx.media2.MediaController2;
 import androidx.media2.MediaController2.PlaybackInfo;
 import androidx.media2.MediaItem2;
+import androidx.media2.MediaPlayerConnector;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
@@ -143,9 +130,12 @@
             return;
         }
 
-        Bundle args = new Bundle();
-        args.putInt(KEY_STREAM, stream);
-        mRemoteSession2.runCustomTestCommands(UPDATE_PLAYER_FOR_SETTING_STREAM_TYPE, args);
+        AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
+                .setLegacyStreamType(stream).build();
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                0 /* state */, 0 /* buffState */, 0 /* position */, 0 /* buffPosition */,
+                0f /* speed */, attrs);
+        mRemoteSession2.updatePlayerConnector(playerConfig, null);
 
         final int originalVolume = mAudioManager.getStreamVolume(stream);
         final int targetVolume = originalVolume == minVolume
@@ -182,9 +172,12 @@
             return;
         }
 
-        Bundle args = new Bundle();
-        args.putInt(KEY_STREAM, stream);
-        mRemoteSession2.runCustomTestCommands(UPDATE_PLAYER_FOR_SETTING_STREAM_TYPE, args);
+        AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
+                .setLegacyStreamType(stream).build();
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                0 /* state */, 0 /* buffState */, 0 /* position */, 0 /* buffPosition */,
+                0f /* speed */, attrs);
+        mRemoteSession2.updatePlayerConnector(playerConfig, null);
 
         final int originalVolume = mAudioManager.getStreamVolume(stream);
         final int direction = originalVolume == minVolume
@@ -248,14 +241,11 @@
         final long timeDiff = 102;
         final MediaItem2 currentMediaItem = MediaTestUtils.createMediaItemWithMetadata();
 
-        Bundle args = new Bundle();
-        args.putInt(KEY_PLAYER_STATE, state);
-        args.putInt(KEY_BUFFERING_STATE, bufferingState);
-        args.putLong(KEY_CURRENT_POSITION, position);
-        args.putLong(KEY_BUFFERED_POSITION, bufferedPosition);
-        args.putFloat(KEY_SPEED, speed);
-        args.putBundle(KEY_MEDIA_ITEM, currentMediaItem.toBundle());
-        mRemoteSession2.runCustomTestCommands(CUSTOM_METHOD_SET_MULTIPLE_VALUES, args);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                state, bufferingState, position, bufferedPosition, speed, null /* audioAttrs */);
+        Bundle agentConfig = RemoteMediaSession2.createMockPlaylistAgentConfig(
+                null /* playlist */, currentMediaItem, null /* metadata */);
+        mRemoteSession2.updatePlayerConnector(playerConfig, agentConfig);
 
         MediaController2 controller = createController(mRemoteSession2.getToken());
         controller.setTimeDiff(timeDiff);
@@ -273,9 +263,10 @@
                 .setContentType(CONTENT_TYPE_MUSIC)
                 .build();
 
-        Bundle args = new Bundle();
-        args.putBundle(KEY_AUDIO_ATTRIBUTES, attrs.toBundle());
-        mRemoteSession2.runCustomTestCommands(UPDATE_PLAYER, args);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                0 /* state */, 0 /* buffState */, 0 /* position */, 0 /* buffPosition */,
+                0f /* speed */, attrs);
+        mRemoteSession2.updatePlayerConnector(playerConfig, null);
 
         final MediaController2 controller = createController(mRemoteSession2.getToken());
         PlaybackInfo info = controller.getPlaybackInfo();
diff --git a/media2/src/androidTest/java/androidx/media2/MediaSession2LegacyTest.java b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaControllerCompatCallbackTestWithMediaSession2.java
similarity index 69%
rename from media2/src/androidTest/java/androidx/media2/MediaSession2LegacyTest.java
rename to media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaControllerCompatCallbackTestWithMediaSession2.java
index ed7a56c..4c3bab7 100644
--- a/media2/src/androidTest/java/androidx/media2/MediaSession2LegacyTest.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/androidx/media/test/client/tests/MediaControllerCompatCallbackTestWithMediaSession2.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.media2;
+package androidx.media.test.client.tests;
 
 import static androidx.media2.MediaItem2.FLAG_PLAYABLE;
 
@@ -25,17 +25,22 @@
 import android.media.AudioManager;
 import android.os.Build;
 import android.os.Bundle;
-import android.os.Process;
 import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.session.MediaControllerCompat;
-import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.media.session.MediaSessionCompat.QueueItem;
 import android.support.v4.media.session.PlaybackStateCompat;
 
 import androidx.media.AudioAttributesCompat;
 import androidx.media.VolumeProviderCompat;
-import androidx.media2.MediaSession2.ControllerInfo;
-import androidx.media2.MediaSession2.SessionCallback;
+import androidx.media.test.client.MediaTestUtils;
+import androidx.media.test.client.RemoteMediaSession2;
+import androidx.media.test.lib.TestUtils;
+import androidx.media2.MediaItem2;
+import androidx.media2.MediaMetadata2;
+import androidx.media2.MediaPlayerConnector;
+import androidx.media2.MediaPlaylistAgent;
+import androidx.media2.MediaSession2;
+import androidx.media2.MediaUtils2;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
@@ -55,35 +60,20 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN)
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public class MediaSession2LegacyTest extends MediaSession2TestBase {
-    private static final String TAG = "MediaSession2LegacyTest";
+public class MediaControllerCompatCallbackTestWithMediaSession2 extends MediaSession2TestBase {
+    private static final String TAG = "MCCCallbackTestWithMS2";
 
     private static final long WAIT_TIME_MS = 1000L;
 
-    private MediaSession2 mSession;
-    private MockPlayer mPlayer;
-    private MockPlaylistAgent mMockAgent;
+    private RemoteMediaSession2 mSession;
+    private MediaControllerCompat mControllerCompat;
 
     @Before
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        mPlayer = new MockPlayer(0);
-        mMockAgent = new MockPlaylistAgent();
-
-        mSession = new MediaSession2.Builder(mContext)
-                .setPlayer(mPlayer)
-                .setPlaylistAgent(mMockAgent)
-                .setSessionCallback(sHandlerExecutor, new SessionCallback() {
-                    @Override
-                    public SessionCommandGroup2 onConnect(MediaSession2 session,
-                            ControllerInfo controller) {
-                        if (Process.myUid() == controller.getUid()) {
-                            return super.onConnect(session, controller);
-                        }
-                        return null;
-                    }
-                }).build();
+        mSession = new RemoteMediaSession2(TAG, mContext);
+        mControllerCompat = new MediaControllerCompat(mContext, mSession.getCompatToken());
     }
 
     @After
@@ -94,58 +84,43 @@
     }
 
     @Test
-    public void testRepeatModeChange() throws InterruptedException {
+    public void testRepeatModeChange() throws Exception {
         prepareLooper();
         final int testRepeatMode = MediaPlaylistAgent.REPEAT_MODE_GROUP;
-        final MediaPlaylistAgent agent = new MockPlaylistAgent() {
-            @Override
-            public int getRepeatMode() {
-                return testRepeatMode;
-            }
-        };
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mSession.updatePlayerConnector(mPlayer, agent);
-        agent.notifyRepeatModeChanged();
+        mSession.getMockPlaylistAgent().setRepeatMode(testRepeatMode);
+        mSession.getMockPlaylistAgent().notifyRepeatModeChanged();
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
         assertTrue(controllerCallback.mOnRepeatModeChangedCalled);
-        assertEquals(testRepeatMode, controller.getRepeatMode());
+        assertEquals(testRepeatMode, mControllerCompat.getRepeatMode());
     }
 
     @Test
-    public void testShuffleModeChange() throws InterruptedException {
+    public void testShuffleModeChange() throws Exception {
         prepareLooper();
         final int testShuffleMode = MediaPlaylistAgent.SHUFFLE_MODE_GROUP;
-        final MediaPlaylistAgent agent = new MockPlaylistAgent() {
-            @Override
-            public int getShuffleMode() {
-                return testShuffleMode;
-            }
-        };
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mSession.updatePlayerConnector(mPlayer, agent);
-        agent.notifyShuffleModeChanged();
+        mSession.getMockPlaylistAgent().setShuffleMode(testShuffleMode);
+        mSession.getMockPlaylistAgent().notifyShuffleModeChanged();
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
         assertTrue(controllerCallback.mOnShuffleModeChangedCalled);
-        assertEquals(testShuffleMode, controller.getShuffleMode());
+        assertEquals(testShuffleMode, mControllerCompat.getShuffleMode());
     }
 
     @Test
-    public void testClose() throws InterruptedException {
+    public void testClose() throws Exception {
         prepareLooper();
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
         mSession.close();
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
@@ -153,17 +128,16 @@
     }
 
     @Test
-    public void testUpdatePlayer() throws InterruptedException {
+    public void testUpdatePlayer() throws Exception {
         prepareLooper();
         final int testState = MediaPlayerConnector.PLAYER_STATE_PLAYING;
         final int testBufferingPosition = 1500;
         final float testSpeed = 1.5f;
-        final List<MediaItem2> testPlaylist = TestUtils.createPlaylist(3);
+        final List<MediaItem2> testPlaylist = MediaTestUtils.createPlaylist(3);
         final String testPlaylistTitle = "testPlaylistTitle";
         final MediaMetadata2 testPlaylistMetadata = new MediaMetadata2.Builder()
                 .putText(MediaMetadata2.METADATA_KEY_DISPLAY_TITLE, testPlaylistTitle).build();
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         // TODO: Make each callback method use their own CountDownLatch.
         if (Build.VERSION.SDK_INT < 21) {
@@ -174,18 +148,14 @@
             // the playback type (local -> local), onAudioInfoChanged will not be called.
             controllerCallback.reset(6);
         }
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        MockPlayer player = new MockPlayer(0);
-        player.mLastPlayerState = testState;
-        player.mBufferedPosition = testBufferingPosition;
-        player.mPlaybackSpeed = testSpeed;
-
-        MockPlaylistAgent agent = new MockPlaylistAgent();
-        agent.mPlaylist = testPlaylist;
-        agent.mCurrentMediaItem = testPlaylist.get(0);
-        agent.mMetadata = testPlaylistMetadata;
-        mSession.updatePlayerConnector(player, agent);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                testState, 0 /* buffState */, 0 /* pos */, testBufferingPosition,
+                testSpeed, null /* audioAttrs */);
+        Bundle agentConfig = RemoteMediaSession2.createMockPlaylistAgentConfig(
+                testPlaylist, testPlaylist.get(0), testPlaylistMetadata);
+        mSession.updatePlayerConnector(playerConfig, agentConfig);
 
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
         assertTrue(controllerCallback.mOnPlaybackStateChangedCalled);
@@ -198,7 +168,7 @@
         assertTrue(controllerCallback.mOnMetadataChangedCalled);
         assertTrue(controllerCallback.mOnQueueChangedCalled);
         assertTrue(controllerCallback.mOnQueueTitleChangedCalled);
-        List<QueueItem> queue = controller.getQueue();
+        List<QueueItem> queue = mControllerCompat.getQueue();
         assertNotNull(queue);
         assertEquals(testPlaylist.size(), queue.size());
         for (int i = 0; i < testPlaylist.size(); i++) {
@@ -209,14 +179,13 @@
     }
 
     @Test
-    public void testUpdatePlayer_playbackTypeChangedToRemote() throws InterruptedException {
+    public void testUpdatePlayer_playbackTypeChangedToRemote() throws Exception {
         prepareLooper();
         final int controlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
-        final float maxVolume = 25;
-        final float currentVolume = 10;
+        final int maxVolume = 25;
+        final int currentVolume = 10;
 
         final CountDownLatch latch = new CountDownLatch(1);
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCompat.Callback controllerCallback =
                 new MediaControllerCompat.Callback() {
                     @Override
@@ -228,32 +197,34 @@
                         latch.countDown();
                     }
                 };
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        MockRemotePlayer remotePlayer = new MockRemotePlayer(controlType, maxVolume, currentVolume);
-        mSession.updatePlayerConnector(remotePlayer, null);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                controlType, maxVolume, currentVolume, null);
+        mSession.updatePlayerConnector(playerConfig, null);
         assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
 
-        MediaControllerCompat.PlaybackInfo info = controller.getPlaybackInfo();
+        MediaControllerCompat.PlaybackInfo info = mControllerCompat.getPlaybackInfo();
         assertEquals(MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE,
                 info.getPlaybackType());
         assertEquals(controlType, info.getVolumeControl());
-        assertEquals(maxVolume, info.getMaxVolume(), 0.0f);
-        assertEquals(currentVolume, info.getCurrentVolume(), 0.0f);
+        assertEquals(maxVolume, info.getMaxVolume());
+        assertEquals(currentVolume, info.getCurrentVolume());
     }
 
     @Test
-    public void testUpdatePlayer_playbackTypeChangedToLocal() throws InterruptedException {
+    public void testUpdatePlayer_playbackTypeChangedToLocal() throws Exception {
         prepareLooper();
-        mSession.updatePlayerConnector(
-                new MockRemotePlayer(VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, 10, 1), null);
+        Bundle prevPlayerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, 10 /* maxVolume */,
+                1 /* currentVolume */, null /* audioAttrs */);
+        mSession.updatePlayerConnector(prevPlayerConfig, null);
 
         final int legacyStream = AudioManager.STREAM_RING;
         final AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
                 .setLegacyStreamType(legacyStream).build();
 
         final CountDownLatch latch = new CountDownLatch(1);
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCompat.Callback controllerCallback =
                 new MediaControllerCompat.Callback() {
                     @Override
@@ -265,11 +236,12 @@
                         }
                     }
                 };
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        MockPlayer player = new MockPlayer(0);
-        player.setAudioAttributes(attrs);
-        mSession.updatePlayerConnector(player, null);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                0 /* state */, 0 /* buffState */, 0 /* pos */, 0 /* bufferingPosition */,
+                1.0f /* speed */, attrs);
+        mSession.updatePlayerConnector(playerConfig, null);
 
         // In API 21 and 22, onAudioInfoChanged is not called when playback is changed to local.
         if (Build.VERSION.SDK_INT == 21 || Build.VERSION.SDK_INT == 22) {
@@ -278,20 +250,19 @@
             assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         }
 
-        MediaControllerCompat.PlaybackInfo info = controller.getPlaybackInfo();
+        MediaControllerCompat.PlaybackInfo info = mControllerCompat.getPlaybackInfo();
         assertEquals(MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL,
                 info.getPlaybackType());
         assertEquals(legacyStream, info.getAudioStream());
     }
 
     @Test
-    public void testUpdatePlayer_playbackTypeNotChanged_local() throws InterruptedException {
+    public void testUpdatePlayer_playbackTypeNotChanged_local() throws Exception {
         final int legacyStream = AudioManager.STREAM_RING;
         final AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
                 .setLegacyStreamType(legacyStream).build();
 
         final CountDownLatch latch = new CountDownLatch(1);
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCompat.Callback controllerCallback =
                 new MediaControllerCompat.Callback() {
                     @Override
@@ -302,11 +273,12 @@
                         latch.countDown();
                     }
                 };
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        MockPlayer player = new MockPlayer(0);
-        player.setAudioAttributes(attrs);
-        mSession.updatePlayerConnector(player, null);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                0 /* state */, 0 /* buffState */, 0 /* pos */, 0 /* bufferingPosition */,
+                1.0f /* speed */, attrs);
+        mSession.updatePlayerConnector(playerConfig, null);
 
         // In API 21+, onAudioInfoChanged() is not called when playbackType is not changed.
         if (Build.VERSION.SDK_INT >= 21) {
@@ -315,23 +287,25 @@
             assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         }
 
-        MediaControllerCompat.PlaybackInfo info = controller.getPlaybackInfo();
+        MediaControllerCompat.PlaybackInfo info = mControllerCompat.getPlaybackInfo();
         assertEquals(MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL,
                 info.getPlaybackType());
         assertEquals(legacyStream, info.getAudioStream());
     }
 
     @Test
-    public void testUpdatePlayer_playbackTypeNotChanged_remote() throws InterruptedException {
-        mSession.updatePlayerConnector(
-                new MockRemotePlayer(VolumeProviderCompat.VOLUME_CONTROL_FIXED, 10, 1), null);
+    public void testUpdatePlayer_playbackTypeNotChanged_remote() throws Exception {
+        prepareLooper();
+        Bundle prevPlayerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, 10 /* maxVolume */,
+                1 /* currentVolume */, null /* audioAttrs */);
+        mSession.updatePlayerConnector(prevPlayerConfig, null);
 
         final int controlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
-        final float maxVolume = 25;
-        final float currentVolume = 10;
+        final int maxVolume = 25;
+        final int currentVolume = 10;
 
         final CountDownLatch latch = new CountDownLatch(1);
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCompat.Callback controllerCallback =
                 new MediaControllerCompat.Callback() {
                     @Override
@@ -345,10 +319,11 @@
                         }
                     }
                 };
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        MockRemotePlayer remotePlayer = new MockRemotePlayer(controlType, maxVolume, currentVolume);
-        mSession.updatePlayerConnector(remotePlayer, null);
+        Bundle playerConfig = RemoteMediaSession2.createMockPlayerConnectorConfig(
+                controlType, maxVolume, currentVolume, null);
+        mSession.updatePlayerConnector(playerConfig, null);
 
         // In API 21+, onAudioInfoChanged() is not called when playbackType is not changed.
         if (Build.VERSION.SDK_INT >= 21) {
@@ -357,7 +332,7 @@
             assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         }
 
-        MediaControllerCompat.PlaybackInfo info = controller.getPlaybackInfo();
+        MediaControllerCompat.PlaybackInfo info = mControllerCompat.getPlaybackInfo();
         assertEquals(MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE,
                 info.getPlaybackType());
         assertEquals(controlType, info.getVolumeControl());
@@ -370,12 +345,11 @@
         prepareLooper();
         final int targetState = MediaPlayerConnector.PLAYER_STATE_PLAYING;
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mPlayer.notifyPlaybackState(targetState);
+        mSession.getMockPlayer().notifyPlayerStateChanged(targetState);
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
         assertTrue(controllerCallback.mOnSessionReadyCalled);
         assertTrue(controllerCallback.mOnPlaybackStateChangedCalled);
@@ -388,13 +362,12 @@
         prepareLooper();
         final float speed = 1.5f;
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mPlayer.setPlaybackSpeed(speed);
-        mPlayer.notifyPlaybackSpeedChanged(speed);
+        mSession.getMockPlayer().setPlaybackSpeed(speed);
+        mSession.getMockPlayer().notifyPlaybackSpeedChanged(speed);
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
         assertTrue(controllerCallback.mOnPlaybackStateChangedCalled);
         assertEquals(speed, controllerCallback.mPlaybackState.getPlaybackSpeed(), 0.0f);
@@ -403,19 +376,18 @@
     @Test
     public void testBufferingStateChange() throws Exception {
         prepareLooper();
-        final List<MediaItem2> testPlaylist = TestUtils.createPlaylist(3);
-        final MediaItem2 testItem = testPlaylist.get(0);
+        final List<MediaItem2> testPlaylist = MediaTestUtils.createPlaylist(3);
+        final int testItemIndex = 0;
         final int testBufferingState = MediaPlayerConnector.BUFFERING_STATE_BUFFERING_AND_PLAYABLE;
         final long testBufferingPosition = 500;
-        mSession.setPlaylist(testPlaylist, null);
+        mSession.getMockPlaylistAgent().setPlaylistWithDummyDsd(testPlaylist);
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mPlayer.mBufferedPosition = testBufferingPosition;
-        mPlayer.notifyBufferingStateChanged(testItem.getDataSourceDesc(), testBufferingState);
+        mSession.getMockPlayer().setBufferedPosition(testBufferingPosition);
+        mSession.getMockPlayer().notifyBufferingStateChanged(testItemIndex, testBufferingState);
         assertTrue(controllerCallback.await(WAIT_TIME_MS));
         assertTrue(controllerCallback.mOnPlaybackStateChangedCalled);
         assertEquals(testBufferingPosition,
@@ -423,34 +395,32 @@
     }
 
     @Test
-    public void testSeekComplete() throws InterruptedException {
+    public void testSeekComplete() throws Exception {
         prepareLooper();
         final long testSeekPosition = 1300;
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mPlayer.mCurrentPosition = testSeekPosition;
-        mPlayer.mLastPlayerState = MediaPlayerConnector.PLAYER_STATE_PAUSED;
-        mPlayer.notifySeekCompleted(testSeekPosition);
+        mSession.getMockPlayer().setCurrentPosition(testSeekPosition);
+        mSession.getMockPlayer().setPlayerState(MediaPlayerConnector.PLAYER_STATE_PAUSED);
+        mSession.getMockPlayer().notifySeekCompleted(testSeekPosition);
         assertTrue(controllerCallback.await(TIMEOUT_MS));
         assertTrue(controllerCallback.mOnPlaybackStateChangedCalled);
         assertEquals(testSeekPosition, controllerCallback.mPlaybackState.getPosition());
     }
 
     @Test
-    public void testNotifyError() throws InterruptedException {
+    public void testNotifyError() throws Exception {
         prepareLooper();
         final int errorCode = MediaSession2.ERROR_CODE_NOT_AVAILABLE_IN_REGION;
         final Bundle extras = new Bundle();
         extras.putString("args", "testNotifyError");
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
         mSession.notifyError(errorCode, extras);
         assertTrue(controllerCallback.await(TIMEOUT_MS));
@@ -460,26 +430,26 @@
     }
 
     @Test
-    public void testCurrentMediaItemChange() throws InterruptedException {
+    public void testCurrentMediaItemChange() throws Exception {
         prepareLooper();
 
         String displayTitle = "displayTitle";
         MediaMetadata2 metadata = new MediaMetadata2.Builder()
                 .putText(MediaMetadata2.METADATA_KEY_DISPLAY_TITLE, displayTitle).build();
         MediaItem2 currentMediaItem = new MediaItem2.Builder(FLAG_PLAYABLE)
-                .setMetadata(metadata).setDataSourceDesc(TestUtils.createDSD()).build();
+                .setMetadata(metadata).setDataSourceDesc(MediaTestUtils.createDSD()).build();
 
-        List<MediaItem2> playlist = TestUtils.createPlaylist(5);
-        playlist.set(3, currentMediaItem);
-        mMockAgent.mPlaylist = playlist;
+        List<MediaItem2> playlist = MediaTestUtils.createPlaylist(5);
+        final int testItemIndex = 3;
+        playlist.set(testItemIndex, currentMediaItem);
+        mSession.getMockPlaylistAgent().setPlaylistWithDummyDsd(playlist);
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mMockAgent.mCurrentMediaItem = currentMediaItem;
-        mPlayer.notifyCurrentDataSourceChanged(currentMediaItem.getDataSourceDesc());
+        mSession.getMockPlaylistAgent().setCurrentMediaItem(testItemIndex);
+        mSession.getMockPlayer().notifyCurrentDataSourceChanged(testItemIndex);
 
         assertTrue(controllerCallback.await(TIMEOUT_MS));
         assertTrue(controllerCallback.mOnMetadataChangedCalled);
@@ -488,27 +458,26 @@
     }
 
     @Test
-    public void testPlaylistAndPlaylistMetadataChange() throws InterruptedException {
+    public void testPlaylistAndPlaylistMetadataChange() throws Exception {
         prepareLooper();
-        final List<MediaItem2> playlist = TestUtils.createPlaylist(5);
+        final List<MediaItem2> playlist = MediaTestUtils.createPlaylist(5);
         final String playlistTitle = "playlistTitle";
         MediaMetadata2 playlistMetadata = new MediaMetadata2.Builder()
                 .putText(MediaMetadata2.METADATA_KEY_DISPLAY_TITLE, playlistTitle).build();
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(2);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mMockAgent.mPlaylist = playlist;
-        mMockAgent.mMetadata = playlistMetadata;
-        mMockAgent.notifyPlaylistChanged();
+        mSession.getMockPlaylistAgent().setPlaylist(playlist);
+        mSession.getMockPlaylistAgent().setPlaylistMetadata(playlistMetadata);
+        mSession.getMockPlaylistAgent().notifyPlaylistChanged();
 
         assertTrue(controllerCallback.await(TIMEOUT_MS));
         assertTrue(controllerCallback.mOnQueueChangedCalled);
         assertTrue(controllerCallback.mOnQueueTitleChangedCalled);
 
-        List<QueueItem> queue = controller.getQueue();
+        List<QueueItem> queue = mControllerCompat.getQueue();
         assertNotNull(queue);
         assertEquals(playlist.size(), queue.size());
         for (int i = 0; i < playlist.size(); i++) {
@@ -518,19 +487,18 @@
     }
 
     @Test
-    public void testPlaylistMetadataChange() throws InterruptedException {
+    public void testPlaylistMetadataChange() throws Exception {
         prepareLooper();
         final String playlistTitle = "playlistTitle";
         MediaMetadata2 playlistMetadata = new MediaMetadata2.Builder()
                 .putText(MediaMetadata2.METADATA_KEY_DISPLAY_TITLE, playlistTitle).build();
 
-        final MediaControllerCompat controller = mSession.getSessionCompat().getController();
         final MediaControllerCallback controllerCallback = new MediaControllerCallback();
         controllerCallback.reset(1);
-        controller.registerCallback(controllerCallback, sHandler);
+        mControllerCompat.registerCallback(controllerCallback, sHandler);
 
-        mMockAgent.mMetadata = playlistMetadata;
-        mMockAgent.notifyPlaylistMetadataChanged();
+        mSession.getMockPlaylistAgent().setPlaylistMetadata(playlistMetadata);
+        mSession.getMockPlaylistAgent().notifyPlaylistMetadataChanged();
 
         assertTrue(controllerCallback.await(TIMEOUT_MS));
         assertTrue(controllerCallback.mOnQueueTitleChangedCalled);
@@ -555,7 +523,7 @@
 
         private PlaybackStateCompat mPlaybackState;
         private MediaMetadataCompat mMediaMetadata;
-        private List<MediaSessionCompat.QueueItem> mQueue;
+        private List<QueueItem> mQueue;
         private CharSequence mTitle;
         private String mEvent;
         private Bundle mExtras;
@@ -611,7 +579,7 @@
         }
 
         @Override
-        public void onQueueChanged(List<MediaSessionCompat.QueueItem> queue) {
+        public void onQueueChanged(List<QueueItem> queue) {
             mOnQueueChangedCalled = true;
             mQueue = queue;
             mLatch.countDown();
diff --git a/media/version-compat-tests/current/service/src/androidTest/java/androidx/media/test/service/RemoteMediaSession2Service.java b/media/version-compat-tests/current/service/src/androidTest/java/androidx/media/test/service/RemoteMediaSession2Service.java
index b60edda..b75fc03 100644
--- a/media/version-compat-tests/current/service/src/androidTest/java/androidx/media/test/service/RemoteMediaSession2Service.java
+++ b/media/version-compat-tests/current/service/src/androidTest/java/androidx/media/test/service/RemoteMediaSession2Service.java
@@ -26,18 +26,11 @@
 import static androidx.media.test.lib.CommonConstants.KEY_CURRENT_VOLUME;
 import static androidx.media.test.lib.CommonConstants.KEY_MAX_VOLUME;
 import static androidx.media.test.lib.CommonConstants.KEY_MEDIA_ITEM;
+import static androidx.media.test.lib.CommonConstants.KEY_METADATA;
 import static androidx.media.test.lib.CommonConstants.KEY_PLAYER_STATE;
 import static androidx.media.test.lib.CommonConstants.KEY_PLAYLIST;
 import static androidx.media.test.lib.CommonConstants.KEY_SPEED;
-import static androidx.media.test.lib.CommonConstants.KEY_STREAM;
 import static androidx.media.test.lib.CommonConstants.KEY_VOLUME_CONTROL_TYPE;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands
-        .CUSTOM_METHOD_SET_MULTIPLE_VALUES;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands.UPDATE_PLAYER;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands
-        .UPDATE_PLAYER_FOR_SETTING_STREAM_TYPE;
-import static androidx.media.test.lib.MediaSession2Constants.CustomCommands
-        .UPDATE_PLAYER_WITH_VOLUME_PROVIDER;
 import static androidx.media.test.lib.MediaSession2Constants
         .TEST_CONTROLLER_CALLBACK_SESSION_REJECTS;
 import static androidx.media.test.lib.MediaSession2Constants.TEST_GET_SESSION_ACTIVITY;
@@ -54,6 +47,8 @@
 import android.support.mediacompat.testlib.IRemoteMediaSession2;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.media.AudioAttributesCompat;
 import androidx.media.test.lib.MockActivity;
 import androidx.media.test.lib.TestUtils.SyncHandler;
@@ -61,6 +56,8 @@
 import androidx.media2.FileDataSourceDesc2;
 import androidx.media2.MediaItem2;
 import androidx.media2.MediaMetadata2;
+import androidx.media2.MediaPlayerConnector;
+import androidx.media2.MediaPlaylistAgent;
 import androidx.media2.MediaSession2;
 import androidx.media2.MediaSession2.ControllerInfo;
 import androidx.media2.SessionCommand2;
@@ -179,56 +176,6 @@
                 throws RemoteException {
             MediaSession2 session2 = mSession2Map.get(sessionId);
             args.setClassLoader(MediaSession2.class.getClassLoader());
-
-            switch (command) {
-                case UPDATE_PLAYER: {
-                    MockPlayerConnector newPlayer = new MockPlayerConnector(0);
-                    newPlayer.mLastPlayerState = args.getInt(KEY_PLAYER_STATE);
-                    newPlayer.setAudioAttributes(AudioAttributesCompat.fromBundle(
-                            (Bundle) args.getParcelable(KEY_AUDIO_ATTRIBUTES)));
-
-                    MockPlaylistAgent newAgent = new MockPlaylistAgent();
-                    newAgent.mPlaylist = MediaTestUtils.playlistFromParcelableList(
-                            args.getParcelableArrayList(KEY_PLAYLIST), false /* createDsd */);
-
-                    session2.updatePlayerConnector(newPlayer, newAgent);
-                    break;
-                }
-                case UPDATE_PLAYER_FOR_SETTING_STREAM_TYPE: {
-                    // Set stream of the session.
-                    final int stream = args.getInt(KEY_STREAM);
-                    AudioAttributesCompat attrs = new AudioAttributesCompat.Builder()
-                            .setLegacyStreamType(stream)
-                            .build();
-                    MockPlayerConnector newPlayer = new MockPlayerConnector(0);
-                    newPlayer.setAudioAttributes(attrs);
-                    session2.updatePlayerConnector(newPlayer, null);
-                    break;
-                }
-                case UPDATE_PLAYER_WITH_VOLUME_PROVIDER: {
-                    MockRemotePlayerConnector remotePlayer = new MockRemotePlayerConnector(
-                            args.getInt(KEY_VOLUME_CONTROL_TYPE),
-                            args.getInt(KEY_MAX_VOLUME),
-                            args.getInt(KEY_CURRENT_VOLUME));
-                    remotePlayer.setAudioAttributes(AudioAttributesCompat.fromBundle(
-                            (Bundle) args.getParcelable(KEY_AUDIO_ATTRIBUTES)));
-                    session2.updatePlayerConnector(remotePlayer, null);
-                    break;
-                }
-                case CUSTOM_METHOD_SET_MULTIPLE_VALUES: {
-                    MockPlaylistAgent agent = (MockPlaylistAgent) session2.getPlaylistAgent();
-                    MockPlayerConnector player =
-                            (MockPlayerConnector) session2.getPlayerConnector();
-
-                    player.mLastPlayerState = args.getInt(KEY_PLAYER_STATE);
-                    player.mLastBufferingState = args.getInt(KEY_BUFFERING_STATE);
-                    player.mCurrentPosition = args.getLong(KEY_CURRENT_POSITION);
-                    player.mBufferedPosition = args.getLong(KEY_BUFFERED_POSITION);
-                    player.mPlaybackSpeed = args.getFloat(KEY_SPEED);
-                    agent.mCurrentMediaItem = MediaItem2.fromBundle(args.getBundle(KEY_MEDIA_ITEM));
-                    break;
-                }
-            }
         }
 
         ////////////////////////////////////////////////////////////////////////////////
@@ -238,14 +185,62 @@
         @Override
         public Bundle getToken(String sessionId) throws RemoteException {
             MediaSession2 session2 = mSession2Map.get(sessionId);
-            return session2 != null ? session2.getToken().toBundle() : null;
+            return session2.getToken().toBundle();
         }
 
         @Override
         public Bundle getCompatToken(String sessionId) throws RemoteException {
             MediaSession2 session2 = mSession2Map.get(sessionId);
-            return session2 != null ? session2.getSessionCompat().getSessionToken().toBundle()
-                    : null;
+            return session2.getSessionCompat().getSessionToken().toBundle();
+        }
+
+        @Override
+        public void updatePlayerConnector(String sessionId, @NonNull Bundle playerConfig,
+                @Nullable Bundle agentConfig) throws RemoteException {
+            playerConfig.setClassLoader(MediaSession2.class.getClassLoader());
+            if (agentConfig != null) {
+                agentConfig.setClassLoader(MediaSession2.class.getClassLoader());
+            }
+            MediaSession2 session2 = mSession2Map.get(sessionId);
+            session2.updatePlayerConnector(
+                    createMockPlayerConnector(playerConfig),
+                    createMockPlaylistAgent(agentConfig));
+        }
+
+        private MediaPlayerConnector createMockPlayerConnector(Bundle playerConfig) {
+            MediaPlayerConnector playerConnector;
+            if (playerConfig.containsKey(KEY_VOLUME_CONTROL_TYPE)) {
+                // Remote player
+                playerConnector = new MockRemotePlayerConnector(
+                        playerConfig.getInt(KEY_VOLUME_CONTROL_TYPE),
+                        playerConfig.getInt(KEY_MAX_VOLUME),
+                        playerConfig.getInt(KEY_CURRENT_VOLUME));
+            } else {
+                // Local player
+                MockPlayerConnector localPlayer = new MockPlayerConnector(0);
+                localPlayer.mLastPlayerState = playerConfig.getInt(KEY_PLAYER_STATE);
+                localPlayer.mLastBufferingState = playerConfig.getInt(KEY_BUFFERING_STATE);
+                localPlayer.mCurrentPosition = playerConfig.getLong(KEY_CURRENT_POSITION);
+                localPlayer.mBufferedPosition = playerConfig.getLong(KEY_BUFFERED_POSITION);
+                localPlayer.mPlaybackSpeed = playerConfig.getFloat(KEY_SPEED);
+                playerConnector = localPlayer;
+            }
+            playerConnector.setAudioAttributes(
+                    AudioAttributesCompat.fromBundle(
+                            playerConfig.getBundle(KEY_AUDIO_ATTRIBUTES)));
+            return playerConnector;
+        }
+
+        private MediaPlaylistAgent createMockPlaylistAgent(Bundle agentConfig) {
+            if (agentConfig == null) {
+                return null;
+            }
+            MockPlaylistAgent agent = new MockPlaylistAgent();
+            agent.mPlaylist = MediaTestUtils.playlistFromParcelableList(
+                    agentConfig.getParcelableArrayList(KEY_PLAYLIST), false /* createDsd */);
+            agent.mCurrentMediaItem = MediaItem2.fromBundle(agentConfig.getBundle(KEY_MEDIA_ITEM));
+            agent.mMetadata = MediaMetadata2.fromBundle(agentConfig.getBundle(KEY_METADATA));
+            return agent;
         }
 
         @Override
@@ -419,7 +414,7 @@
         }
 
         @Override
-        public void setPlaylistWithNewDsd(String sessionId, List<Bundle> playlist)
+        public void setPlaylistWithDummyDsd(String sessionId, List<Bundle> playlist)
                 throws RemoteException {
             MediaSession2 session2 = mSession2Map.get(sessionId);
             MockPlaylistAgent agent = (MockPlaylistAgent) session2.getPlaylistAgent();
diff --git a/media/version-compat-tests/lib/src/main/aidl/android/support/mediacompat/testlib/IRemoteMediaSession2.aidl b/media/version-compat-tests/lib/src/main/aidl/android/support/mediacompat/testlib/IRemoteMediaSession2.aidl
index a972291..96bdac9 100644
--- a/media/version-compat-tests/lib/src/main/aidl/android/support/mediacompat/testlib/IRemoteMediaSession2.aidl
+++ b/media/version-compat-tests/lib/src/main/aidl/android/support/mediacompat/testlib/IRemoteMediaSession2.aidl
@@ -27,6 +27,7 @@
     // MediaSession2 Methods
     Bundle getToken(String sessionId);
     Bundle getCompatToken(String sessionId);
+    void updatePlayerConnector(String sessionId, in Bundle playerBundle, in Bundle agentBundle);
     void sendCustomCommand(String sessionId, in Bundle command, in Bundle args);
     void sendCustomCommand2(String sessionId, in Bundle controller, in Bundle command,
             in Bundle args, in ResultReceiver receiver);
@@ -51,7 +52,7 @@
 
     // MockPlaylistAgent Methods
     void setPlaylist(String sessionId, in List<Bundle> playlist);
-    void setPlaylistWithNewDsd(String sessionId, in List<Bundle> playlist);
+    void setPlaylistWithDummyDsd(String sessionId, in List<Bundle> playlist);
     void setPlaylistMetadata(String sessionId, in Bundle metadata);
     void setShuffleMode(String sessionId, int shuffleMode);
     void setRepeatMode(String sessionId, int repeatMode);
diff --git a/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/CommonConstants.java b/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/CommonConstants.java
index 2dbb5e4..ed6b02d 100644
--- a/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/CommonConstants.java
+++ b/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/CommonConstants.java
@@ -56,6 +56,7 @@
     public static final String KEY_BUFFERING_STATE = "bufferingState";
     public static final String KEY_SPEED = "speed";
     public static final String KEY_MEDIA_ITEM = "mediaItem";
+    public static final String KEY_METADATA = "metadata";
     public static final String KEY_ARGUMENTS = "arguments";
     public static final String KEY_RESULT_RECEIVER = "resultReceiver";
     public static final String KEY_MAX_VOLUME = "maxVolume";
diff --git a/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/MediaSession2Constants.java b/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/MediaSession2Constants.java
index 3a1b3a0..e982cdc 100644
--- a/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/MediaSession2Constants.java
+++ b/media/version-compat-tests/lib/src/main/java/androidx/media/test/lib/MediaSession2Constants.java
@@ -32,10 +32,6 @@
      * Constants for test-specific custom command which will be run in the service app.
      */
     public static class CustomCommands {
-        public static final int UPDATE_PLAYER = 1000;
-        public static final int UPDATE_PLAYER_FOR_SETTING_STREAM_TYPE = 1001;
-        public static final int UPDATE_PLAYER_WITH_VOLUME_PROVIDER = 1002;
-        public static final int CUSTOM_METHOD_SET_MULTIPLE_VALUES = 1900;
 
         private CustomCommands() {
         }