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

Commit de5340b6 authored by Marie Janssen's avatar Marie Janssen
Browse files

AVRCP: Add PlaybackState for Track Changed

MediaController.getMetadata() updates out of sync with
MediaController.getPlaybackState(), causing issues because we use
PlaybackState.getCurrentQueueId() to sent track IDs to AVRCP CT.

Add getCurrentQueueId() as an indicator of track changes.

Remove counting how many tracks have played since it's inaccurate.

Test: connect to carkit, skip tracks, metadata is updating correctly
Bug: 37707672
Change-Id: I5d190933b847622ec858eab38828902cf798f8e1
(cherry picked from commit 29174eb9)
parent d13b026c
Loading
Loading
Loading
Loading
+12 −10
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.bluetooth.avrcp;
package com.android.bluetooth.avrcp;


import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAvrcp;
import android.bluetooth.BluetoothAvrcp;
@@ -76,17 +77,16 @@ public final class Avrcp {
    private final AudioManager mAudioManager;
    private final AudioManager mAudioManager;
    private AvrcpMessageHandler mHandler;
    private AvrcpMessageHandler mHandler;
    private MediaSessionManager mMediaSessionManager;
    private MediaSessionManager mMediaSessionManager;
    private MediaController mMediaController;
    private @Nullable MediaController mMediaController;
    private MediaControllerListener mMediaControllerCb;
    private MediaControllerListener mMediaControllerCb;
    private MediaAttributes mMediaAttributes;
    private MediaAttributes mMediaAttributes;
    private PackageManager mPackageManager;
    private PackageManager mPackageManager;
    private int mTransportControlFlags;
    private int mTransportControlFlags;
    private PlaybackState mCurrentPlayState;
    private @NonNull PlaybackState mCurrentPlayState;
    private int mA2dpState;
    private int mA2dpState;
    private int mPlayStatusChangedNT;
    private int mPlayStatusChangedNT;
    private int mTrackChangedNT;
    private int mTrackChangedNT;
    private int mPlayPosChangedNT;
    private int mPlayPosChangedNT;
    private long mTracksPlayed;
    private long mPlaybackIntervalMs;
    private long mPlaybackIntervalMs;
    private long mLastReportedPosition;
    private long mLastReportedPosition;
    private long mNextPosMs;
    private long mNextPosMs;
@@ -239,7 +239,6 @@ public final class Avrcp {
        mA2dpState = BluetoothA2dp.STATE_NOT_PLAYING;
        mA2dpState = BluetoothA2dp.STATE_NOT_PLAYING;
        mPlayStatusChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mPlayStatusChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mTrackChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mTrackChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mTracksPlayed = 0;
        mPlaybackIntervalMs = 0L;
        mPlaybackIntervalMs = 0L;
        mPlayPosChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mPlayPosChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mLastReportedPosition = -1;
        mLastReportedPosition = -1;
@@ -368,10 +367,9 @@ public final class Avrcp {
    private class MediaControllerListener extends MediaController.Callback {
    private class MediaControllerListener extends MediaController.Callback {
        @Override
        @Override
        public void onMetadataChanged(MediaMetadata metadata) {
        public void onMetadataChanged(MediaMetadata metadata) {
            Log.v(TAG, "MediaController metadata changed");
            if (DEBUG) Log.v(TAG, "onMetadataChanged");
            updateCurrentMediaState();
            updateCurrentMediaState();
        }
        }

        @Override
        @Override
        public synchronized void onPlaybackStateChanged(PlaybackState state) {
        public synchronized void onPlaybackStateChanged(PlaybackState state) {
            if (DEBUG) Log.v(TAG, "onPlaybackStateChanged: state " + state.toString());
            if (DEBUG) Log.v(TAG, "onPlaybackStateChanged: state " + state.toString());
@@ -969,10 +967,15 @@ public final class Avrcp {
            mMediaAttributes = new MediaAttributes(mMediaController.getMetadata());
            mMediaAttributes = new MediaAttributes(mMediaController.getMetadata());
        }
        }


        if (!currentAttributes.equals(mMediaAttributes)) {
        long oldQueueId = mCurrentPlayState.getActiveQueueItemId();
            Log.v(TAG, "MediaAttributes Changed to " + mMediaAttributes.toString());
        long newQueueId = MediaSession.QueueItem.UNKNOWN_ID;
            mTracksPlayed++;
        if (newState != null) newQueueId = newState.getActiveQueueItemId();
        if ((oldQueueId != newQueueId) || (!currentAttributes.equals(mMediaAttributes))) {
            Log.v(TAG, "Media change: id " + oldQueueId + "➡" + newQueueId + ":"
                            + mMediaAttributes.toString());
            sendTrackChangedRsp(false);
            sendTrackChangedRsp(false);
        } else {
            Log.v(TAG, "Media didn't change: id " + oldQueueId);
        }
        }


        updatePlaybackState(newState);
        updatePlaybackState(newState);
@@ -2283,7 +2286,6 @@ public final class Avrcp {
        sb.append("AVRCP:\n");
        sb.append("AVRCP:\n");
        ProfileService.println(sb, "mMediaAttributes: " + mMediaAttributes);
        ProfileService.println(sb, "mMediaAttributes: " + mMediaAttributes);
        ProfileService.println(sb, "mTransportControlFlags: " + mTransportControlFlags);
        ProfileService.println(sb, "mTransportControlFlags: " + mTransportControlFlags);
        ProfileService.println(sb, "mTracksPlayed: " + mTracksPlayed);
        ProfileService.println(sb, "mCurrentPlayState: " + mCurrentPlayState);
        ProfileService.println(sb, "mCurrentPlayState: " + mCurrentPlayState);
        ProfileService.println(sb, "mPlayStatusChangedNT: " + mPlayStatusChangedNT);
        ProfileService.println(sb, "mPlayStatusChangedNT: " + mPlayStatusChangedNT);
        ProfileService.println(sb, "mTrackChangedNT: " + mTrackChangedNT);
        ProfileService.println(sb, "mTrackChangedNT: " + mTrackChangedNT);