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

Commit ef8c625a authored by Ajay Panicker's avatar Ajay Panicker
Browse files

Return only fresh data from the MediaController

By returning previously cached data there was a chance of it becomming
stale. By now always polling the MediaContoller for its most recent and
up to date data, we ensure that the information sent to the carkit is
farm fresh.

Bug: 76128322
Test: runtest bluetooth -j38
Change-Id: I8fe66b02b47d3a4481f321d8ac4f6b412e3a1361
parent c5fedbd2
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -226,7 +226,7 @@ public class MediaPlayerList {
        final MediaPlayerWrapper player = getActivePlayer();
        if (player == null) return "";

        final PlaybackState state = player.getCurrentMediaData().state;
        final PlaybackState state = player.getPlaybackState();
        if (state == null || state.getActiveQueueItemId() == MediaSession.QueueItem.UNKNOWN_ID) {
            d("getCurrentMediaId: No active queue item Id: " + state);
            return "";
@@ -239,14 +239,14 @@ public class MediaPlayerList {
        final MediaPlayerWrapper player = getActivePlayer();
        if (player == null) return Util.empty_data();

        return player.getCurrentMediaData().metadata;
        return player.getCurrentMetadata();
    }

    PlaybackState getCurrentPlayStatus() {
        final MediaPlayerWrapper player = getActivePlayer();
        if (player == null) return null;

        return player.getCurrentMediaData().state;
        return player.getPlaybackState();
    }

    List<Metadata> getNowPlayingList() {
@@ -257,7 +257,7 @@ public class MediaPlayerList {
            return ret;
        }

        return getActivePlayer().getCurrentMediaData().queue;
        return getActivePlayer().getCurrentQueue();
    }

    void playItem(int playerId, boolean nowPlaying, String mediaId) {
+29 −2
Original line number Diff line number Diff line
@@ -119,7 +119,11 @@ class MediaPlayerWrapper {
        return mMediaController.getMetadata();
    }

    protected PlaybackState getPlaybackState() {
    Metadata getCurrentMetadata() {
        return Util.toMetadata(getMetadata());
    }

    PlaybackState getPlaybackState() {
        return mMediaController.getPlaybackState();
    }

@@ -128,9 +132,17 @@ class MediaPlayerWrapper {
        return mMediaController.getPlaybackState().getActiveQueueItemId();
    }

    List<Metadata> getCurrentQueue() {
        return Util.toMetadataList(getQueue());
    }

    // We don't return the cached info here in order to always provide the freshest data.
    MediaData getCurrentMediaData() {
        return mCurrentData;
        MediaData data = new MediaData(
                getCurrentMetadata(),
                getPlaybackState(),
                getCurrentQueue());
        return data;
    }

    void playItemFromQueue(long qid) {
@@ -208,6 +220,14 @@ class MediaPlayerWrapper {
        synchronized (mCallbackLock) {
            mRegisteredCallback = callback;
        }

        // Update the current data since it could have changed while we weren't registered for
        // updates
        mCurrentData = new MediaData(
                Util.toMetadata(getMetadata()),
                getPlaybackState(),
                Util.toMetadataList(getQueue()));

        mControllerCallbacks = new MediaControllerListener(mLooper);
    }

@@ -236,6 +256,13 @@ class MediaPlayerWrapper {

        mControllerCallbacks.cleanup();
        mMediaController = newController;

        // Update the current data since it could be different on the new controller for the player
        mCurrentData = new MediaData(
                Util.toMetadata(getMetadata()),
                getPlaybackState(),
                Util.toMetadataList(getQueue()));

        mControllerCallbacks = new MediaControllerListener(mLooper);
        d("Controller for " + mPackageName + " was updated.");
    }
+30 −0
Original line number Diff line number Diff line
@@ -170,6 +170,36 @@ public class MediaPlayerWrapperTest {
        Assert.assertTrue(wrapper.isReady());
    }

    /*
     * Test to make sure that if a new controller is registered with different metadata than the
     * previous controller, the new metadata is pulled upon registration.
     */
    @Test
    public void testControllerUpdate() {
        // Create the wrapper object and register the looper with the timeout handler
        MediaPlayerWrapper wrapper = MediaPlayerWrapper.wrap(mMockController, mThread.getLooper());
        Assert.assertTrue(wrapper.isReady());
        wrapper.registerCallback(mTestCbs);

        // Create a new MediaController that has different metadata than the previous controller
        MediaController mUpdatedController = mock(MediaController.class);
        doReturn(mTestState.build()).when(mUpdatedController).getPlaybackState();
        mTestMetadata.putString(MediaMetadata.METADATA_KEY_TITLE, "New Title");
        doReturn(mTestMetadata.build()).when(mUpdatedController).getMetadata();
        doReturn(null).when(mMockController).getQueue();

        // Update the wrappers controller to the new controller
        wrapper.updateMediaController(mUpdatedController);

        // Send a metadata update with the same data that the controller had upon registering
        verify(mUpdatedController).registerCallback(mControllerCbs.capture(), any());
        MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
        controllerCallbacks.onMetadataChanged(mTestMetadata.build());

        // Verify that a callback was never called since no data was updated
        verify(mTestCbs, never()).mediaUpdatedCallback(any());
    }

    /*
     * Test to make sure that a media player update gets sent whenever a Media metadata or playback
     * state change occurs instead of waiting for all data to be synced if the player doesn't