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

Commit 18e8fa83 authored by Marie Janssen's avatar Marie Janssen Committed by android-build-merger
Browse files

Merge "AVRCP: Report no track playing correctly."

am: 2712e8ea

Change-Id: I5970738e1bed5a8f3cda434cb4608dafc3facd96
parents 3470496f 2712e8ea
Loading
Loading
Loading
Loading
+7 −27
Original line number Diff line number Diff line
@@ -252,9 +252,9 @@ public class AddressedMediaPlayer {
        }
    }

    void sendTrackChangeWithId(int trackChangedNT, long trackNumber,
            MediaController mediaController) {
    void sendTrackChangeWithId(int trackChangedNT, MediaController mediaController) {
        if (DEBUG) Log.d(TAG, "sendTrackChangeWithId");
        byte[] track;
        try {
            String mediaId = mediaController.getMetadata().getDescription().getMediaId();
            long qid = 0;
@@ -268,33 +268,13 @@ public class AddressedMediaPlayer {
                }
            }
            /* for any item associated with NowPlaying, uid is queueId */
            byte[] uid = ByteBuffer.allocate(AvrcpConstants.UID_SIZE).putLong(qid).array();
            if (DEBUG) printByteArray("trackChangedRsp", uid);
            mMediaInterface.trackChangedRsp(trackChangedNT, uid);
            track = ByteBuffer.allocate(AvrcpConstants.UID_SIZE).putLong(qid).array();
        } catch (NullPointerException e) {
            Log.w(TAG, "Null Pointer while getting current track Uid from media player");
            sendTrackChangeRsp(trackChangedNT, trackNumber);
        }
    }

    /*
     * utility function to respond for track change when failed to get current track UID
     * from media controller
     */
    private void sendTrackChangeRsp(int trackChangedNT, long trackNumber) {
        byte[] track = new byte[AvrcpConstants.TRACK_ID_SIZE];
        /* track is stored in big endian format */
        for (int idx = 0; idx < AvrcpConstants.TRACK_ID_SIZE; ++idx) {
            if (trackChangedNT == AvrcpConstants.NOTIFICATION_TYPE_INTERIM
                    && trackNumber == -1) {
                 /* if no track is currently selected then return 0xFF in interim response */
                track[idx] = AvrcpConstants.NO_TRACK_SELECTED;
            } else {
                /* if Browsing is not supported and a track is selected, then return 0x00 */
                track[idx] = AvrcpConstants.TRACK_IS_SELECTED;
            }
            Log.w(TAG, "NullPointerException getting uid, sending no track selected");
            // Track selected (0x0) is not allowed for browsable players (AVRCP 1.6.1 p64)
            track = AvrcpConstants.NO_TRACK_SELECTED;
        }
        if (DEBUG) printByteArray("sendTrackChangeRsp", track);
        if (DEBUG) printByteArray("trackChangedRsp", track);
        mMediaInterface.trackChangedRsp(trackChangedNT, track);
    }

+10 −18
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ public final class Avrcp {
    private int mPlayStatusChangedNT;
    private int mTrackChangedNT;
    private int mPlayPosChangedNT;
    private long mTrackNumber;
    private long mTracksPlayed;
    private long mSongLengthMs;
    private long mPlaybackIntervalMs;
    private long mLastReportedPosition;
@@ -195,7 +195,7 @@ public final class Avrcp {
        mCurrentPlayState = new PlaybackState.Builder().setState(PlaybackState.STATE_NONE, -1L, 0.0f).build();
        mPlayStatusChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mTrackChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
        mTrackNumber = -1L;
        mTracksPlayed = 0;
        mLastStateUpdate = -1L;
        mSongLengthMs = 0L;
        mPlaybackIntervalMs = 0L;
@@ -961,7 +961,7 @@ public final class Avrcp {

        if (!oldAttributes.equals(mMediaAttributes)) {
            Log.v(TAG, "MediaAttributes Changed to " + mMediaAttributes.toString());
            mTrackNumber++;
            mTracksPlayed++;

            if (mTrackChangedNT == AvrcpConstants.NOTIFICATION_TYPE_INTERIM) {
                mTrackChangedNT = AvrcpConstants.NOTIFICATION_TYPE_CHANGED;
@@ -1111,27 +1111,19 @@ public final class Avrcp {

    private void sendTrackChangedRsp() {
        // for players which does not support Browse or when no track is currently selected
        if (!isBrowseSupported(getCurrentAddrPlayer()) || (mTrackNumber == -1)) {
        if (!isBrowseSupported(getCurrentAddrPlayer())) {
            trackChangeRspForBrowseUnsupported();
        } else {
            // for players which support browsing
            mAddressedMediaPlayer.sendTrackChangeWithId(mTrackChangedNT, mTrackNumber,
                    mMediaController);
            mAddressedMediaPlayer.sendTrackChangeWithId(mTrackChangedNT, mMediaController);
        }
    }

    private void trackChangeRspForBrowseUnsupported() {
        byte[] track = new byte[AvrcpConstants.TRACK_ID_SIZE];
        /* track is stored in big endian format */
        for (int idx = 0; idx < AvrcpConstants.TRACK_ID_SIZE; ++idx) {
            if (mTrackChangedNT == AvrcpConstants.NOTIFICATION_TYPE_INTERIM &&
                    mTrackNumber == -1) {
                 /* if no track is currently selected then return 0xFF in interim response */
                track[idx] = AvrcpConstants.NO_TRACK_SELECTED;
            } else {
                /* if Browsing is not supported and a track is selected, then return 0x00 */
                track[idx] = AvrcpConstants.TRACK_IS_SELECTED;
            }
        byte[] track = AvrcpConstants.TRACK_IS_SELECTED;
        if (mTrackChangedNT == AvrcpConstants.NOTIFICATION_TYPE_INTERIM
                && !mMediaAttributes.exists) {
            track = AvrcpConstants.NO_TRACK_SELECTED;
        }
        registerNotificationRspTrackChangeNative(mTrackChangedNT, track);
    }
@@ -2362,11 +2354,11 @@ public final class Avrcp {
        sb.append("AVRCP:\n");
        ProfileService.println(sb, "mMediaAttributes: " + mMediaAttributes);
        ProfileService.println(sb, "mTransportControlFlags: " + mTransportControlFlags);
        ProfileService.println(sb, "mTracksPlayed: " + mTracksPlayed);
        ProfileService.println(sb, "mCurrentPlayState: " + mCurrentPlayState);
        ProfileService.println(sb, "mLastStateUpdate: " + mLastStateUpdate);
        ProfileService.println(sb, "mPlayStatusChangedNT: " + mPlayStatusChangedNT);
        ProfileService.println(sb, "mTrackChangedNT: " + mTrackChangedNT);
        ProfileService.println(sb, "mTrackNumber: " + mTrackNumber);
        ProfileService.println(sb, "mSongLengthMs: " + mSongLengthMs);
        ProfileService.println(sb, "mPlaybackIntervalMs: " + mPlaybackIntervalMs);
        ProfileService.println(sb, "mPlayPosChangedNT: " + mPlayPosChangedNT);
+5 −3
Original line number Diff line number Diff line
@@ -93,10 +93,12 @@ final class AvrcpConstants {
    static final int ATTRID_COVER_ART  = 0x08;

    /* constants to send in Track change response */
    static final byte NO_TRACK_SELECTED = (byte)0xFF;
    static final byte TRACK_IS_SELECTED = (byte)0x00;
    static final byte[] NO_TRACK_SELECTED = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
    static final byte[] TRACK_IS_SELECTED = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};

    /* Max UID size */
    /* UID size */
    static final int UID_SIZE = 8;

    static final short DEFAULT_UID_COUNTER = 0x0000;