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

Commit d21fb560 authored by Jaewan Kim's avatar Jaewan Kim Committed by Android (Google) Code Review
Browse files

Merge "Revert "Revert "MediaSession2: Add playlist parameter supports"""

parents 3090025b 621289a7
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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
    ///////////////////////////////////////////////////
@@ -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 {
+17 −0
Original line number Diff line number Diff line
@@ -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()}.
@@ -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
    //////////////////////////////////////////////////////////////////////////////////////
+14 −0
Original line number Diff line number Diff line
@@ -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?
            }
        }
    }
}
+30 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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.*;
@@ -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
+8 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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) {}
@@ -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