Loading packages/MediaComponents/src/com/android/media/MediaController2Impl.java +23 −0 Original line number Diff line number Diff line Loading @@ -387,6 +387,11 @@ public class MediaController2Impl implements MediaController2Provider { return null; } @Override public void setPlaylistParams_impl(PlaylistParams params) { // TODO(hdmoon): Implement } /////////////////////////////////////////////////// // Protected or private methods /////////////////////////////////////////////////// Loading Loading @@ -503,6 +508,24 @@ public class MediaController2Impl implements MediaController2Provider { controller.pushPlaybackStateChanges(PlaybackState2.fromBundle(state)); } @Override public void onPlaylistParamsChanged(Bundle params) throws RuntimeException { final MediaController2Impl controller; try { controller = getController(); } catch (IllegalStateException e) { 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)); }); } @Override public void onConnectionChanged(IMediaSession2 sessionBinder, Bundle commandGroup) throws RuntimeException { Loading packages/MediaComponents/src/com/android/media/MediaSession2Impl.java +17 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ public class MediaSession2Impl implements MediaSession2Provider { private MediaPlayerInterface mPlayer; @GuardedBy("mLock") private MyPlaybackListener mListener; private PlaylistParams mPlaylistParams; /** * Can be only called by the {@link Builder#build()}. Loading Loading @@ -237,6 +238,22 @@ public class MediaSession2Impl implements MediaSession2Provider { mSessionStub.notifyCustomLayoutNotLocked(controller, layout); } @Override public void setPlaylistParams_impl(PlaylistParams params) { if (params == null) { throw new IllegalArgumentException("PlaylistParams should not be null!"); } mPlaylistParams = params; mPlayer.setPlaylistParams(params); mSessionStub.notifyPlaylistParamsChanged(params); } @Override public PlaylistParams getPlaylistParams_impl() { // TODO: Do we need to synchronize here for preparing Controller2.setPlaybackParams? return mPlaylistParams; } ////////////////////////////////////////////////////////////////////////////////////// // TODO(jaewan): Implement follows ////////////////////////////////////////////////////////////////////////////////////// Loading packages/MediaComponents/src/com/android/media/MediaSession2Stub.java +14 −0 Original line number Diff line number Diff line Loading @@ -344,4 +344,18 @@ public class MediaSession2Stub extends IMediaSession2.Stub { // TODO(jaewan): What to do when the controller is gone? } } public void notifyPlaylistParamsChanged(MediaSession2.PlaylistParams params) { final List<ControllerInfo> list = getControllers(); for (int i = 0; i < list.size(); i++) { IMediaSession2Callback callbackBinder = ControllerInfoImpl.from(list.get(i)).getControllerBinder(); try { callbackBinder.onPlaylistParamsChanged(params.toBundle()); } catch (RemoteException e) { Log.w(TAG, "Controller is gone", e); // TODO(jaewan): What to do when the controller is gone? } } } } packages/MediaComponents/test/src/android/media/MediaSession2Test.java +30 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,14 @@ package android.media; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import android.media.MediaSession2.Builder; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.MediaSession2.SessionCallback; import android.os.Bundle; import android.os.Process; import android.support.annotation.NonNull; import android.support.test.filters.SmallTest; Loading @@ -30,6 +35,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; Loading Loading @@ -129,6 +135,30 @@ public class MediaSession2Test extends MediaSession2TestBase { }); } @Test public void testSetPlaylistParams() 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); mSession.setPlaylistParams(params); assertTrue(mPlayer.mSetPlaylistParamsCalled); TestUtils.equals(params.toBundle(), mPlayer.mPlaylistParams.toBundle()); TestUtils.equals(params.toBundle(), mSession.getPlaylistParams().toBundle()); assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); } @Test public void testPlaybackStateChangedListener() throws InterruptedException { // TODO(jaewan): Add equivalent tests again Loading packages/MediaComponents/test/src/android/media/MediaSession2TestBase.java +8 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.test.InstrumentationRegistry; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; Loading Loading @@ -57,7 +58,8 @@ abstract class MediaSession2TestBase { } interface TestControllerCallbackInterface { // Currently empty. Add methods in ControllerCallback/BrowserCallback that you want to test. // Add methods in ControllerCallback/BrowserCallback that you want to test. default void onPlaylistParamsChanged(MediaSession2.PlaylistParams params) {} // Browser specific callbacks default void onGetRootResult(Bundle rootHints, String rootMediaId, Bundle rootExtra) {} Loading Loading @@ -191,6 +193,11 @@ abstract class MediaSession2TestBase { assertFalse(disconnectLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); } } @Override public void onPlaylistParamsChanged(MediaSession2.PlaylistParams params) { mCallbackProxy.onPlaylistParamsChanged(params); } } public class TestMediaController extends MediaController2 implements TestControllerInterface { Loading Loading
packages/MediaComponents/src/com/android/media/MediaController2Impl.java +23 −0 Original line number Diff line number Diff line Loading @@ -387,6 +387,11 @@ public class MediaController2Impl implements MediaController2Provider { return null; } @Override public void setPlaylistParams_impl(PlaylistParams params) { // TODO(hdmoon): Implement } /////////////////////////////////////////////////// // Protected or private methods /////////////////////////////////////////////////// Loading Loading @@ -503,6 +508,24 @@ public class MediaController2Impl implements MediaController2Provider { controller.pushPlaybackStateChanges(PlaybackState2.fromBundle(state)); } @Override public void onPlaylistParamsChanged(Bundle params) throws RuntimeException { final MediaController2Impl controller; try { controller = getController(); } catch (IllegalStateException e) { 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)); }); } @Override public void onConnectionChanged(IMediaSession2 sessionBinder, Bundle commandGroup) throws RuntimeException { Loading
packages/MediaComponents/src/com/android/media/MediaSession2Impl.java +17 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ public class MediaSession2Impl implements MediaSession2Provider { private MediaPlayerInterface mPlayer; @GuardedBy("mLock") private MyPlaybackListener mListener; private PlaylistParams mPlaylistParams; /** * Can be only called by the {@link Builder#build()}. Loading Loading @@ -237,6 +238,22 @@ public class MediaSession2Impl implements MediaSession2Provider { mSessionStub.notifyCustomLayoutNotLocked(controller, layout); } @Override public void setPlaylistParams_impl(PlaylistParams params) { if (params == null) { throw new IllegalArgumentException("PlaylistParams should not be null!"); } mPlaylistParams = params; mPlayer.setPlaylistParams(params); mSessionStub.notifyPlaylistParamsChanged(params); } @Override public PlaylistParams getPlaylistParams_impl() { // TODO: Do we need to synchronize here for preparing Controller2.setPlaybackParams? return mPlaylistParams; } ////////////////////////////////////////////////////////////////////////////////////// // TODO(jaewan): Implement follows ////////////////////////////////////////////////////////////////////////////////////// Loading
packages/MediaComponents/src/com/android/media/MediaSession2Stub.java +14 −0 Original line number Diff line number Diff line Loading @@ -344,4 +344,18 @@ public class MediaSession2Stub extends IMediaSession2.Stub { // TODO(jaewan): What to do when the controller is gone? } } public void notifyPlaylistParamsChanged(MediaSession2.PlaylistParams params) { final List<ControllerInfo> list = getControllers(); for (int i = 0; i < list.size(); i++) { IMediaSession2Callback callbackBinder = ControllerInfoImpl.from(list.get(i)).getControllerBinder(); try { callbackBinder.onPlaylistParamsChanged(params.toBundle()); } catch (RemoteException e) { Log.w(TAG, "Controller is gone", e); // TODO(jaewan): What to do when the controller is gone? } } } }
packages/MediaComponents/test/src/android/media/MediaSession2Test.java +30 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,14 @@ package android.media; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import android.media.MediaSession2.Builder; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.MediaSession2.SessionCallback; import android.os.Bundle; import android.os.Process; import android.support.annotation.NonNull; import android.support.test.filters.SmallTest; Loading @@ -30,6 +35,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; Loading Loading @@ -129,6 +135,30 @@ public class MediaSession2Test extends MediaSession2TestBase { }); } @Test public void testSetPlaylistParams() 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); mSession.setPlaylistParams(params); assertTrue(mPlayer.mSetPlaylistParamsCalled); TestUtils.equals(params.toBundle(), mPlayer.mPlaylistParams.toBundle()); TestUtils.equals(params.toBundle(), mSession.getPlaylistParams().toBundle()); assertTrue(latch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); } @Test public void testPlaybackStateChangedListener() throws InterruptedException { // TODO(jaewan): Add equivalent tests again Loading
packages/MediaComponents/test/src/android/media/MediaSession2TestBase.java +8 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.test.InstrumentationRegistry; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; Loading Loading @@ -57,7 +58,8 @@ abstract class MediaSession2TestBase { } interface TestControllerCallbackInterface { // Currently empty. Add methods in ControllerCallback/BrowserCallback that you want to test. // Add methods in ControllerCallback/BrowserCallback that you want to test. default void onPlaylistParamsChanged(MediaSession2.PlaylistParams params) {} // Browser specific callbacks default void onGetRootResult(Bundle rootHints, String rootMediaId, Bundle rootExtra) {} Loading Loading @@ -191,6 +193,11 @@ abstract class MediaSession2TestBase { assertFalse(disconnectLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); } } @Override public void onPlaylistParamsChanged(MediaSession2.PlaylistParams params) { mCallbackProxy.onPlaylistParamsChanged(params); } } public class TestMediaController extends MediaController2 implements TestControllerInterface { Loading