Loading packages/MediaComponents/src/com/android/media/MediaController2Impl.java +40 −22 Original line number Diff line number Diff line Loading @@ -71,6 +71,8 @@ public class MediaController2Impl implements MediaController2Provider { private boolean mIsReleased; @GuardedBy("mLock") private PlaybackState2 mPlaybackState; @GuardedBy("mLock") private PlaylistParams mPlaylistParams; // Assignment should be used with the lock hold, but should be used without a lock to prevent // potential deadlock. Loading Loading @@ -244,14 +246,14 @@ public class MediaController2Impl implements MediaController2Provider { } private void sendTransportControlCommand(int commandCode) { sendTransportControlCommand(commandCode, 0); sendTransportControlCommand(commandCode, null); } private void sendTransportControlCommand(int commandCode, long arg) { private void sendTransportControlCommand(int commandCode, Bundle args) { final IMediaSession2 binder = mSessionBinder; if (binder != null) { try { binder.sendTransportControlCommand(mSessionCallbackStub, commandCode, arg); binder.sendTransportControlCommand(mSessionCallbackStub, commandCode, args); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to the service or the session is gone", e); } Loading Loading @@ -354,13 +356,17 @@ public class MediaController2Impl implements MediaController2Provider { @Override public void seekTo_impl(long pos) { sendTransportControlCommand(MediaSession2.COMMAND_CODE_PLAYBACK_SEEK_TO, pos); Bundle args = new Bundle(); args.putLong(MediaSession2Stub.ARGUMENT_KEY_POSITION, pos); sendTransportControlCommand(MediaSession2.COMMAND_CODE_PLAYBACK_SEEK_TO, args); } @Override public void setCurrentPlaylistItem_impl(int index) { Bundle args = new Bundle(); args.putInt(MediaSession2Stub.ARGUMENT_KEY_ITEM_INDEX, index); sendTransportControlCommand( MediaSession2.COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM, index); MediaSession2.COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM, args); } @Override Loading @@ -381,14 +387,20 @@ public class MediaController2Impl implements MediaController2Provider { } @Override public PlaylistParams getPlaylistParam_impl() { // TODO(jaewan): Implement return null; public PlaylistParams getPlaylistParams_impl() { synchronized (mLock) { return mPlaylistParams; } } @Override public void setPlaylistParams_impl(PlaylistParams params) { // TODO(hdmoon): Implement if (params == null) { throw new IllegalArgumentException("PlaylistParams should not be null!"); } Bundle args = new Bundle(); args.putBundle(MediaSession2Stub.ARGUMENT_KEY_PLAYLIST_PARAMS, params.toBundle()); sendTransportControlCommand(MediaSession2.COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS, args); } /////////////////////////////////////////////////// Loading @@ -397,6 +409,7 @@ public class MediaController2Impl implements MediaController2Provider { private void pushPlaybackStateChanges(final PlaybackState2 state) { synchronized (mLock) { mPlaybackState = state; } mCallbackExecutor.execute(() -> { if (!mInstance.isConnected()) { return; Loading @@ -404,6 +417,17 @@ public class MediaController2Impl implements MediaController2Provider { mCallback.onPlaybackStateChanged(state); }); } private void pushPlaylistParamsChanges(final PlaylistParams params) { synchronized (mLock) { mPlaylistParams = params; } mCallbackExecutor.execute(() -> { if (!mInstance.isConnected()) { return; } mCallback.onPlaylistParamsChanged(params); }); } // Called when the result for connecting to the session was delivered. Loading Loading @@ -508,13 +532,7 @@ public class MediaController2Impl implements MediaController2Provider { Log.w(TAG, "Don't fail silently here. Highly likely a bug"); return; } controller.getCallbackExecutor().execute(() -> { final MediaController2Impl impl = mController.get(); if (impl == null) { return; } impl.mCallback.onPlaylistParamsChanged(PlaylistParams.fromBundle(params)); }); controller.pushPlaylistParamsChanges(PlaylistParams.fromBundle(params)); } @Override Loading packages/MediaComponents/src/com/android/media/MediaSession2Stub.java +16 −3 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.media.MediaSession2.Command; import android.media.MediaSession2.CommandButton; import android.media.MediaSession2.CommandGroup; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.PlaybackState2; import android.os.Binder; import android.os.Bundle; Loading @@ -39,6 +40,12 @@ import java.util.ArrayList; import java.util.List; public class MediaSession2Stub extends IMediaSession2.Stub { static final String ARGUMENT_KEY_POSITION = "android.media.media_session2.key_position"; static final String ARGUMENT_KEY_ITEM_INDEX = "android.media.media_session2.key_item_index"; static final String ARGUMENT_KEY_PLAYLIST_PARAMS = "android.media.media_session2.key_playlist_params"; private static final String TAG = "MediaSession2Stub"; private static final boolean DEBUG = true; // TODO(jaewan): Rename. Loading Loading @@ -154,7 +161,7 @@ public class MediaSession2Stub extends IMediaSession2.Stub { @Override public void sendTransportControlCommand(IMediaSession2Callback caller, int commandCode, long arg) throws RuntimeException { int commandCode, Bundle args) throws RuntimeException { final MediaSession2Impl sessionImpl = getSession(); final ControllerInfo controller = getController(caller); if (controller == null) { Loading Loading @@ -206,10 +213,16 @@ public class MediaSession2Stub extends IMediaSession2.Stub { session.getInstance().rewind(); break; case MediaSession2.COMMAND_CODE_PLAYBACK_SEEK_TO: session.getInstance().seekTo(arg); session.getInstance().seekTo(args.getLong(ARGUMENT_KEY_POSITION)); break; case MediaSession2.COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM: session.getInstance().setCurrentPlaylistItem((int) arg); session.getInstance().setCurrentPlaylistItem( args.getInt(ARGUMENT_KEY_ITEM_INDEX)); break; case MediaSession2.COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS: session.getInstance().setPlaylistParams( PlaylistParams.fromBundle( args.getBundle(ARGUMENT_KEY_PLAYLIST_PARAMS))); break; default: // TODO(jaewan): Resend unknown (new) commands through the custom command. Loading packages/MediaComponents/test/src/android/media/MediaController2Test.java +25 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.media; import android.media.MediaController2.ControllerCallback; import android.media.MediaPlayerInterface.PlaybackListener; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.MediaSession2.SessionCallback; import android.media.TestUtils.SyncHandler; import android.media.session.PlaybackState; Loading Loading @@ -194,6 +195,30 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(itemIndex, mPlayer.mItemIndex); } @Test public void testGetSetPlaylistParams() throws Exception { final PlaylistParams params = new PlaylistParams( PlaylistParams.REPEAT_MODE_ALL, PlaylistParams.SHUFFLE_MODE_ALL, null /* PlaylistMetadata */); final CountDownLatch latch = new CountDownLatch(1); final TestControllerCallbackInterface callback = new TestControllerCallbackInterface() { @Override public void onPlaylistParamsChanged(PlaylistParams givenParams) { TestUtils.equals(params.toBundle(), givenParams.toBundle()); latch.countDown(); } }; final MediaController2 controller = createController(mSession.getToken(), true, callback); controller.setPlaylistParams(params); assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); TestUtils.equals(params.toBundle(), mSession.getPlaylistParams().toBundle()); TestUtils.equals(params.toBundle(), controller.getPlaylistParams().toBundle()); } @Test public void testGetPackageName() { assertEquals(mContext.getPackageName(), mController.getSessionToken().getPackageName()); Loading packages/MediaComponents/test/src/android/media/MediaSession2TestBase.java +3 −1 Original line number Diff line number Diff line Loading @@ -207,9 +207,11 @@ abstract class MediaSession2TestBase { @Override public void onPlaylistParamsChanged(MediaSession2.PlaylistParams params) { if (mCallbackProxy != null) { mCallbackProxy.onPlaylistParamsChanged(params); } } } public class TestMediaController extends MediaController2 implements TestControllerInterface { private final ControllerCallback mCallback; Loading Loading
packages/MediaComponents/src/com/android/media/MediaController2Impl.java +40 −22 Original line number Diff line number Diff line Loading @@ -71,6 +71,8 @@ public class MediaController2Impl implements MediaController2Provider { private boolean mIsReleased; @GuardedBy("mLock") private PlaybackState2 mPlaybackState; @GuardedBy("mLock") private PlaylistParams mPlaylistParams; // Assignment should be used with the lock hold, but should be used without a lock to prevent // potential deadlock. Loading Loading @@ -244,14 +246,14 @@ public class MediaController2Impl implements MediaController2Provider { } private void sendTransportControlCommand(int commandCode) { sendTransportControlCommand(commandCode, 0); sendTransportControlCommand(commandCode, null); } private void sendTransportControlCommand(int commandCode, long arg) { private void sendTransportControlCommand(int commandCode, Bundle args) { final IMediaSession2 binder = mSessionBinder; if (binder != null) { try { binder.sendTransportControlCommand(mSessionCallbackStub, commandCode, arg); binder.sendTransportControlCommand(mSessionCallbackStub, commandCode, args); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to the service or the session is gone", e); } Loading Loading @@ -354,13 +356,17 @@ public class MediaController2Impl implements MediaController2Provider { @Override public void seekTo_impl(long pos) { sendTransportControlCommand(MediaSession2.COMMAND_CODE_PLAYBACK_SEEK_TO, pos); Bundle args = new Bundle(); args.putLong(MediaSession2Stub.ARGUMENT_KEY_POSITION, pos); sendTransportControlCommand(MediaSession2.COMMAND_CODE_PLAYBACK_SEEK_TO, args); } @Override public void setCurrentPlaylistItem_impl(int index) { Bundle args = new Bundle(); args.putInt(MediaSession2Stub.ARGUMENT_KEY_ITEM_INDEX, index); sendTransportControlCommand( MediaSession2.COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM, index); MediaSession2.COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM, args); } @Override Loading @@ -381,14 +387,20 @@ public class MediaController2Impl implements MediaController2Provider { } @Override public PlaylistParams getPlaylistParam_impl() { // TODO(jaewan): Implement return null; public PlaylistParams getPlaylistParams_impl() { synchronized (mLock) { return mPlaylistParams; } } @Override public void setPlaylistParams_impl(PlaylistParams params) { // TODO(hdmoon): Implement if (params == null) { throw new IllegalArgumentException("PlaylistParams should not be null!"); } Bundle args = new Bundle(); args.putBundle(MediaSession2Stub.ARGUMENT_KEY_PLAYLIST_PARAMS, params.toBundle()); sendTransportControlCommand(MediaSession2.COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS, args); } /////////////////////////////////////////////////// Loading @@ -397,6 +409,7 @@ public class MediaController2Impl implements MediaController2Provider { private void pushPlaybackStateChanges(final PlaybackState2 state) { synchronized (mLock) { mPlaybackState = state; } mCallbackExecutor.execute(() -> { if (!mInstance.isConnected()) { return; Loading @@ -404,6 +417,17 @@ public class MediaController2Impl implements MediaController2Provider { mCallback.onPlaybackStateChanged(state); }); } private void pushPlaylistParamsChanges(final PlaylistParams params) { synchronized (mLock) { mPlaylistParams = params; } mCallbackExecutor.execute(() -> { if (!mInstance.isConnected()) { return; } mCallback.onPlaylistParamsChanged(params); }); } // Called when the result for connecting to the session was delivered. Loading Loading @@ -508,13 +532,7 @@ public class MediaController2Impl implements MediaController2Provider { Log.w(TAG, "Don't fail silently here. Highly likely a bug"); return; } controller.getCallbackExecutor().execute(() -> { final MediaController2Impl impl = mController.get(); if (impl == null) { return; } impl.mCallback.onPlaylistParamsChanged(PlaylistParams.fromBundle(params)); }); controller.pushPlaylistParamsChanges(PlaylistParams.fromBundle(params)); } @Override Loading
packages/MediaComponents/src/com/android/media/MediaSession2Stub.java +16 −3 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.media.MediaSession2.Command; import android.media.MediaSession2.CommandButton; import android.media.MediaSession2.CommandGroup; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.PlaybackState2; import android.os.Binder; import android.os.Bundle; Loading @@ -39,6 +40,12 @@ import java.util.ArrayList; import java.util.List; public class MediaSession2Stub extends IMediaSession2.Stub { static final String ARGUMENT_KEY_POSITION = "android.media.media_session2.key_position"; static final String ARGUMENT_KEY_ITEM_INDEX = "android.media.media_session2.key_item_index"; static final String ARGUMENT_KEY_PLAYLIST_PARAMS = "android.media.media_session2.key_playlist_params"; private static final String TAG = "MediaSession2Stub"; private static final boolean DEBUG = true; // TODO(jaewan): Rename. Loading Loading @@ -154,7 +161,7 @@ public class MediaSession2Stub extends IMediaSession2.Stub { @Override public void sendTransportControlCommand(IMediaSession2Callback caller, int commandCode, long arg) throws RuntimeException { int commandCode, Bundle args) throws RuntimeException { final MediaSession2Impl sessionImpl = getSession(); final ControllerInfo controller = getController(caller); if (controller == null) { Loading Loading @@ -206,10 +213,16 @@ public class MediaSession2Stub extends IMediaSession2.Stub { session.getInstance().rewind(); break; case MediaSession2.COMMAND_CODE_PLAYBACK_SEEK_TO: session.getInstance().seekTo(arg); session.getInstance().seekTo(args.getLong(ARGUMENT_KEY_POSITION)); break; case MediaSession2.COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM: session.getInstance().setCurrentPlaylistItem((int) arg); session.getInstance().setCurrentPlaylistItem( args.getInt(ARGUMENT_KEY_ITEM_INDEX)); break; case MediaSession2.COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS: session.getInstance().setPlaylistParams( PlaylistParams.fromBundle( args.getBundle(ARGUMENT_KEY_PLAYLIST_PARAMS))); break; default: // TODO(jaewan): Resend unknown (new) commands through the custom command. Loading
packages/MediaComponents/test/src/android/media/MediaController2Test.java +25 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.media; import android.media.MediaController2.ControllerCallback; import android.media.MediaPlayerInterface.PlaybackListener; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.MediaSession2.SessionCallback; import android.media.TestUtils.SyncHandler; import android.media.session.PlaybackState; Loading Loading @@ -194,6 +195,30 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(itemIndex, mPlayer.mItemIndex); } @Test public void testGetSetPlaylistParams() throws Exception { final PlaylistParams params = new PlaylistParams( PlaylistParams.REPEAT_MODE_ALL, PlaylistParams.SHUFFLE_MODE_ALL, null /* PlaylistMetadata */); final CountDownLatch latch = new CountDownLatch(1); final TestControllerCallbackInterface callback = new TestControllerCallbackInterface() { @Override public void onPlaylistParamsChanged(PlaylistParams givenParams) { TestUtils.equals(params.toBundle(), givenParams.toBundle()); latch.countDown(); } }; final MediaController2 controller = createController(mSession.getToken(), true, callback); controller.setPlaylistParams(params); assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); TestUtils.equals(params.toBundle(), mSession.getPlaylistParams().toBundle()); TestUtils.equals(params.toBundle(), controller.getPlaylistParams().toBundle()); } @Test public void testGetPackageName() { assertEquals(mContext.getPackageName(), mController.getSessionToken().getPackageName()); Loading
packages/MediaComponents/test/src/android/media/MediaSession2TestBase.java +3 −1 Original line number Diff line number Diff line Loading @@ -207,9 +207,11 @@ abstract class MediaSession2TestBase { @Override public void onPlaylistParamsChanged(MediaSession2.PlaylistParams params) { if (mCallbackProxy != null) { mCallbackProxy.onPlaylistParamsChanged(params); } } } public class TestMediaController extends MediaController2 implements TestControllerInterface { private final ControllerCallback mCallback; Loading