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

Commit 90a36f5a authored by Ajay Panicker's avatar Ajay Panicker
Browse files

Check for null metadata on update

Bug: 80281220
Test: runtest bluetooth -c
com.android.bluetooth.avrcp.MediaPlayerWrapperTest

Change-Id: I0751b54fe383e33eeebe06c671aebaa188e6d680
parent 9ab80ac4
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.bluetooth.avrcp;

import android.annotation.Nullable;
import android.media.MediaMetadata;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;
@@ -375,15 +376,16 @@ class MediaPlayerWrapper {
        }

        @Override
        public void onMetadataChanged(MediaMetadata metadata) {
        public void onMetadataChanged(@Nullable MediaMetadata metadata) {
            if (!isReady()) {
                Log.v(TAG, mPackageName + " tried to update with incomplete metadata");
                Log.v(TAG, "onMetadataChanged(): " + mPackageName
                        + " tried to update with no queue");
                return;
            }

            Log.v(TAG, "onMetadataChanged(): " + mPackageName + " : " + Util.toMetadata(metadata));

            if (!metadata.equals(getMetadata())) {
            if (!Objects.equals(metadata, getMetadata())) {
                e("The callback metadata doesn't match controller metadata");
            }

@@ -395,7 +397,7 @@ class MediaPlayerWrapper {
            // TODO: Spotify needs a metadata update debouncer as it sometimes updates the metadata
            // twice in a row with the only difference being that the song duration is rounded to
            // the nearest second.
            if (metadata.equals(mCurrentData.metadata)) {
            if (Objects.equals(metadata, mCurrentData.metadata)) {
                Log.w(TAG, "onMetadataChanged(): " + mPackageName
                        + " tried to update with no new data");
                return;
@@ -405,9 +407,10 @@ class MediaPlayerWrapper {
        }

        @Override
        public void onPlaybackStateChanged(PlaybackState state) {
        public void onPlaybackStateChanged(@Nullable PlaybackState state) {
            if (!isReady()) {
                Log.v(TAG, mPackageName + " tried to update with no state");
                Log.v(TAG, "onPlaybackStateChanged(): " + mPackageName
                        + " tried to update with no queue");
                return;
            }

@@ -433,14 +436,15 @@ class MediaPlayerWrapper {
        }

        @Override
        public void onQueueChanged(List<MediaSession.QueueItem> queue) {
            Log.v(TAG, "onQueueChanged(): " + mPackageName);

        public void onQueueChanged(@Nullable List<MediaSession.QueueItem> queue) {
            if (!isReady()) {
                Log.v(TAG, mPackageName + " tried to updated with no queue");
                Log.v(TAG, "onQueueChanged(): " + mPackageName
                        + " tried to update with no queue");
                return;
            }

            Log.v(TAG, "onQueueChanged(): " + mPackageName);

            if (!Objects.equals(queue, getQueue())) {
                e("The callback queue isn't the current queue");
            }
+30 −1
Original line number Diff line number Diff line
@@ -333,6 +333,35 @@ public class MediaPlayerWrapperTest {
        Assert.assertEquals(wrapper.getCurrentMetadata().numTracks, "3");
    }

    @Test
    public void testNullMetadata() {
        // Create the wrapper object and register the looper with the timeout handler
        TestLooperManager looperManager = new TestLooperManager(mThread.getLooper());
        MediaPlayerWrapper wrapper =
                MediaPlayerWrapper.wrap(mMockController, mThread.getLooper());
        wrapper.registerCallback(mTestCbs);

        // Return null when getting the queue
        doReturn(null).when(mMockController).getQueue();

        // Grab the callbacks the wrapper registered with the controller
        verify(mMockController).registerCallback(mControllerCbs.capture(), any());
        MediaController.Callback controllerCallbacks = mControllerCbs.getValue();

        // Update Metadata returned by controller
        mTestMetadata.putString(MediaMetadata.METADATA_KEY_TITLE, "New Title");
        doReturn(mTestMetadata.build()).when(mMockController).getMetadata();

        // Call the callback
        controllerCallbacks.onMetadataChanged(null);

        // Assert that the metadata returned by getMetadata() is used instead of null
        verify(mTestCbs, times(1)).mediaUpdatedCallback(mMediaUpdateData.capture());
        MediaData data = mMediaUpdateData.getValue();
        Assert.assertEquals("Returned metadata is incorrect", data.metadata,
                Util.toMetadata(mTestMetadata.build()));
    }

    @Test
    public void testNullQueue() {
        // Create the wrapper object and register the looper with the timeout handler
@@ -502,7 +531,7 @@ public class MediaPlayerWrapperTest {
        verify(mMockController).registerCallback(mControllerCbs.capture(), any());
        MediaController.Callback controllerCallbacks = mControllerCbs.getValue();

        // Update Metdata returned by controller
        // Update Metadata returned by controller
        mTestMetadata.putString(MediaMetadata.METADATA_KEY_TITLE, "New Title");
        doReturn(mTestMetadata.build()).when(mMockController).getMetadata();
        controllerCallbacks.onMetadataChanged(mTestMetadata.build());