Loading packages/MediaComponents/src/com/android/media/IMediaSession2.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ oneway interface IMediaSession2 { void playFromUri(IMediaSession2Callback caller, in Uri uri, in Bundle extra); void playFromSearch(IMediaSession2Callback caller, String query, in Bundle extra); void playFromMediaId(IMediaSession2Callback caller, String mediaId, in Bundle extra); void setRating(IMediaSession2Callback caller, String mediaId, in Bundle rating); ////////////////////////////////////////////////////////////////////////////////////////////// // Get library service specific Loading packages/MediaComponents/src/com/android/media/MediaController2Impl.java +23 −2 Original line number Diff line number Diff line Loading @@ -403,9 +403,30 @@ public class MediaController2Impl implements MediaController2Provider { // TODO(jaewan): Handle. } } @Override public void setRating_impl(Rating2 rating) { // TODO(jaewan): Implement public void setRating_impl(String mediaId, Rating2 rating) { if (mediaId == null) { throw new IllegalArgumentException("mediaId shouldn't be null"); } if (rating == null) { throw new IllegalArgumentException("rating shouldn't be null"); } // TODO (hdmoon): All 'ratingStyle' should be changed to 'ratingType'. if (rating.getRatingStyle() != getRatingType_impl()) { throw new IllegalArgumentException("rating type should be matched"); } final IMediaSession2 binder = mSessionBinder; if (binder != null) { try { binder.setRating(mSessionCallbackStub, mediaId, rating.toBundle()); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to the service or the session is gone", e); } } else { // TODO(jaewan): Handle. } } @Override Loading packages/MediaComponents/src/com/android/media/MediaSession2Stub.java +22 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.media.MediaSession2.CommandGroup; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.PlaybackState2; import android.media.Rating2; import android.media.VolumeProvider2; import android.net.Uri; import android.os.Binder; Loading Loading @@ -507,6 +508,27 @@ public class MediaSession2Stub extends IMediaSession2.Stub { }); } @Override public void setRating(final IMediaSession2Callback caller, final String mediaId, final Bundle ratingBundle) { final MediaSession2Impl sessionImpl = getSession(); final ControllerInfo controller = getController(caller); if (controller == null) { if (DEBUG) { Log.d(TAG, "Command from a controller that hasn't connected. Ignore"); } return; } sessionImpl.getCallbackExecutor().execute(() -> { final MediaSession2Impl session = mSession.get(); if (session == null) { return; } Rating2 rating = Rating2Impl.fromBundle(session.getContext(), ratingBundle); session.getCallback().onSetRating(controller, mediaId, rating); }); } ////////////////////////////////////////////////////////////////////////////////////////////// // AIDL methods for LibrarySession overrides ////////////////////////////////////////////////////////////////////////////////////////////// Loading packages/MediaComponents/test/src/android/media/MediaController2Test.java +59 −7 Original line number Diff line number Diff line Loading @@ -389,7 +389,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, query); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -413,7 +413,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, uri); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -437,7 +437,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, id); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -462,7 +462,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, query); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -486,7 +486,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, uri); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -510,7 +510,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, id); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -522,6 +522,58 @@ public class MediaController2Test extends MediaSession2TestBase { } } @Test public void testSetRating() throws InterruptedException { final int sessionRatingType = Rating2.RATING_5_STARS; final float ratingValue = 3.5f; final Rating2 rating = Rating2.newStarRating(mContext, sessionRatingType, ratingValue); final String mediaId = "media_id"; final CountDownLatch latch = new CountDownLatch(1); final SessionCallback callback = new SessionCallback(mContext) { @Override public void onSetRating(ControllerInfo controller, String mediaIdOut, Rating2 ratingOut) { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(mediaId, mediaIdOut); assertEquals(rating, ratingOut); latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) .setRatingType(sessionRatingType) .setSessionCallback(sHandlerExecutor, callback) .setId("testSetRating").build()) { MediaController2 controller = createController(session.getToken()); controller.setRating(mediaId, rating); assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); } } @Test public void testSetRatingTypeNotMatched() throws InterruptedException { final String mediaId = "media_id"; final int sessionRatingType = Rating2.RATING_5_STARS; final SessionCallback callback = new SessionCallback(mContext); try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) .setRatingType(sessionRatingType) .setSessionCallback(sHandlerExecutor, callback) .setId("testSetRatingTypeNotMatched").build()) { // Set 'Heart' type rating which is different from the session's rating type (5-Stars). MediaController2 controller = createController(session.getToken()); Rating2 nonMatchingTypeRating = Rating2.newHeartRating(mContext, true); try { controller.setRating(mediaId, nonMatchingTypeRating); fail(); } catch (IllegalArgumentException ex) { // Expected. } } } @Test public void testIsConnected() throws InterruptedException { assertTrue(mController.isConnected()); Loading Loading @@ -635,7 +687,7 @@ public class MediaController2Test extends MediaSession2TestBase { if (Process.myUid() == controller.getUid()) { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertFalse(controller.isTrusted()); latch.countDown();; latch.countDown(); } return super.onConnect(controller); } Loading Loading
packages/MediaComponents/src/com/android/media/IMediaSession2.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ oneway interface IMediaSession2 { void playFromUri(IMediaSession2Callback caller, in Uri uri, in Bundle extra); void playFromSearch(IMediaSession2Callback caller, String query, in Bundle extra); void playFromMediaId(IMediaSession2Callback caller, String mediaId, in Bundle extra); void setRating(IMediaSession2Callback caller, String mediaId, in Bundle rating); ////////////////////////////////////////////////////////////////////////////////////////////// // Get library service specific Loading
packages/MediaComponents/src/com/android/media/MediaController2Impl.java +23 −2 Original line number Diff line number Diff line Loading @@ -403,9 +403,30 @@ public class MediaController2Impl implements MediaController2Provider { // TODO(jaewan): Handle. } } @Override public void setRating_impl(Rating2 rating) { // TODO(jaewan): Implement public void setRating_impl(String mediaId, Rating2 rating) { if (mediaId == null) { throw new IllegalArgumentException("mediaId shouldn't be null"); } if (rating == null) { throw new IllegalArgumentException("rating shouldn't be null"); } // TODO (hdmoon): All 'ratingStyle' should be changed to 'ratingType'. if (rating.getRatingStyle() != getRatingType_impl()) { throw new IllegalArgumentException("rating type should be matched"); } final IMediaSession2 binder = mSessionBinder; if (binder != null) { try { binder.setRating(mSessionCallbackStub, mediaId, rating.toBundle()); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to the service or the session is gone", e); } } else { // TODO(jaewan): Handle. } } @Override Loading
packages/MediaComponents/src/com/android/media/MediaSession2Stub.java +22 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.media.MediaSession2.CommandGroup; import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.PlaybackState2; import android.media.Rating2; import android.media.VolumeProvider2; import android.net.Uri; import android.os.Binder; Loading Loading @@ -507,6 +508,27 @@ public class MediaSession2Stub extends IMediaSession2.Stub { }); } @Override public void setRating(final IMediaSession2Callback caller, final String mediaId, final Bundle ratingBundle) { final MediaSession2Impl sessionImpl = getSession(); final ControllerInfo controller = getController(caller); if (controller == null) { if (DEBUG) { Log.d(TAG, "Command from a controller that hasn't connected. Ignore"); } return; } sessionImpl.getCallbackExecutor().execute(() -> { final MediaSession2Impl session = mSession.get(); if (session == null) { return; } Rating2 rating = Rating2Impl.fromBundle(session.getContext(), ratingBundle); session.getCallback().onSetRating(controller, mediaId, rating); }); } ////////////////////////////////////////////////////////////////////////////////////////////// // AIDL methods for LibrarySession overrides ////////////////////////////////////////////////////////////////////////////////////////////// Loading
packages/MediaComponents/test/src/android/media/MediaController2Test.java +59 −7 Original line number Diff line number Diff line Loading @@ -389,7 +389,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, query); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -413,7 +413,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, uri); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -437,7 +437,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, id); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -462,7 +462,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, query); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -486,7 +486,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, uri); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -510,7 +510,7 @@ public class MediaController2Test extends MediaSession2TestBase { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(request, id); assertTrue(TestUtils.equals(bundle, extras)); latch.countDown();; latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) Loading @@ -522,6 +522,58 @@ public class MediaController2Test extends MediaSession2TestBase { } } @Test public void testSetRating() throws InterruptedException { final int sessionRatingType = Rating2.RATING_5_STARS; final float ratingValue = 3.5f; final Rating2 rating = Rating2.newStarRating(mContext, sessionRatingType, ratingValue); final String mediaId = "media_id"; final CountDownLatch latch = new CountDownLatch(1); final SessionCallback callback = new SessionCallback(mContext) { @Override public void onSetRating(ControllerInfo controller, String mediaIdOut, Rating2 ratingOut) { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertEquals(mediaId, mediaIdOut); assertEquals(rating, ratingOut); latch.countDown(); } }; try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) .setRatingType(sessionRatingType) .setSessionCallback(sHandlerExecutor, callback) .setId("testSetRating").build()) { MediaController2 controller = createController(session.getToken()); controller.setRating(mediaId, rating); assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); } } @Test public void testSetRatingTypeNotMatched() throws InterruptedException { final String mediaId = "media_id"; final int sessionRatingType = Rating2.RATING_5_STARS; final SessionCallback callback = new SessionCallback(mContext); try (MediaSession2 session = new MediaSession2.Builder(mContext, mPlayer) .setRatingType(sessionRatingType) .setSessionCallback(sHandlerExecutor, callback) .setId("testSetRatingTypeNotMatched").build()) { // Set 'Heart' type rating which is different from the session's rating type (5-Stars). MediaController2 controller = createController(session.getToken()); Rating2 nonMatchingTypeRating = Rating2.newHeartRating(mContext, true); try { controller.setRating(mediaId, nonMatchingTypeRating); fail(); } catch (IllegalArgumentException ex) { // Expected. } } } @Test public void testIsConnected() throws InterruptedException { assertTrue(mController.isConnected()); Loading Loading @@ -635,7 +687,7 @@ public class MediaController2Test extends MediaSession2TestBase { if (Process.myUid() == controller.getUid()) { assertEquals(mContext.getPackageName(), controller.getPackageName()); assertFalse(controller.isTrusted()); latch.countDown();; latch.countDown(); } return super.onConnect(controller); } Loading