Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eaf29912 authored by Hyundo Moon's avatar Hyundo Moon Committed by Android (Google) Code Review
Browse files

Merge "MediaController2: Implement setRating()"

parents 8b1198da af063f11
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+23 −2
Original line number Diff line number Diff line
@@ -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
+22 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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
    //////////////////////////////////////////////////////////////////////////////////////////////
+59 −7
Original line number Diff line number Diff line
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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());
@@ -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);
            }