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

Commit e71339cb authored by Hyundo Moon's avatar Hyundo Moon
Browse files

MediaController2: Implement get/setPlaylistParams

Bug: 72537520
Test: Passed MediaController2Test
Change-Id: If9b3107084f3f4b063967f079bf229bb43b95cbd
parent 4a842111
Loading
Loading
Loading
Loading
+40 −22
Original line number Diff line number Diff line
@@ -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.
@@ -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);
            }
@@ -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
@@ -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);
    }

    ///////////////////////////////////////////////////
@@ -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;
@@ -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.
@@ -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
+16 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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.

@@ -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) {
@@ -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.
+25 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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());
+3 −1
Original line number Diff line number Diff line
@@ -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;