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

Commit ab77fc89 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Check for null metadata on update"

parents 304bd0a8 e35af223
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());