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

Commit 3a22f853 authored by Cheney Ni's avatar Cheney Ni
Browse files

Keep those MediaControllers of none addressed players to be up-to-date

We moniter both changes of session and player from MediaSessionManager
and only update the MediaController of activated player. In case if
session changes serveral times before player activated, the old
MediaController would be deprecated but still was in used.  Without
session changed again to update the MediaController, it causes AVRCP
can't receive callbacks from MediaSessionManager after player activated.

We now always update the MediaController to new one no matter the
player is activated or not so can receive player's callbacks as well.

Bug: 110408992
Bug: 111622139
Test: manually switching players
Change-Id: Idfa144f68743679613f4e11f8cd75dd889f01f0e
parent e1f1620d
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -240,7 +240,7 @@ class MediaPlayerWrapper {
                getPlaybackState(),
                Util.toMetadataList(getQueue()));

        mControllerCallbacks = new MediaControllerListener(mLooper);
        mControllerCallbacks = new MediaControllerListener(mMediaController, mLooper);
    }

    /**
@@ -260,14 +260,16 @@ class MediaPlayerWrapper {
    void updateMediaController(MediaController newController) {
        if (newController == mMediaController) return;

        mMediaController = newController;

        synchronized (mCallbackLock) {
            if (mRegisteredCallback == null || mControllerCallbacks == null) {
                d("Controller for " + mPackageName + " maybe is not activated.");
                return;
            }
        }

        mControllerCallbacks.cleanup();
        mMediaController = newController;

        // Update the current data since it could be different on the new controller for the player
        mCurrentData = new MediaData(
@@ -275,7 +277,7 @@ class MediaPlayerWrapper {
                getPlaybackState(),
                Util.toMetadataList(getQueue()));

        mControllerCallbacks = new MediaControllerListener(mLooper);
        mControllerCallbacks = new MediaControllerListener(mMediaController, mLooper);
        d("Controller for " + mPackageName + " was updated.");
    }

@@ -295,7 +297,7 @@ class MediaPlayerWrapper {
        synchronized (mCallbackLock) {
            if (mRegisteredCallback == null) {
                Log.e(TAG, mPackageName
                        + "Trying to send an update with no registered callback");
                        + ": Trying to send an update with no registered callback");
                return;
            }

@@ -340,20 +342,23 @@ class MediaPlayerWrapper {
    class MediaControllerListener extends MediaController.Callback {
        private final Object mTimeoutHandlerLock = new Object();
        private Handler mTimeoutHandler;
        private MediaController mController;

        MediaControllerListener(Looper newLooper) {
        MediaControllerListener(MediaController controller, Looper newLooper) {
            synchronized (mTimeoutHandlerLock) {
                mTimeoutHandler = new TimeoutHandler(newLooper);

                mController = controller;
                // Register the callbacks to execute on the same thread as the timeout thread. This
                // prevents a race condition where a timeout happens at the same time as an update.
                mMediaController.registerCallback(this, mTimeoutHandler);
                mController.registerCallback(this, mTimeoutHandler);
            }
        }

        void cleanup() {
            synchronized (mTimeoutHandlerLock) {
                mMediaController.unregisterCallback(this);
                mController.unregisterCallback(this);
                mController = null;
                mTimeoutHandler.removeMessages(TimeoutHandler.MSG_TIMEOUT);
                mTimeoutHandler = null;
            }