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

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

Merge \"Fix bugs in play status and play pos notifications\"

am: 40d724a6

Change-Id: I6a5119996813069494b3c7ee666025474d1d9763
parents 9119cce2 40d724a6
Loading
Loading
Loading
Loading
+32 −16
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ public final class Avrcp {
    private long mTrackNumber;
    private long mSongLengthMs;
    private long mPlaybackIntervalMs;
    private long mLastReportedPosition;
    private long mNextPosMs;
    private long mPrevPosMs;
    private long mSkipStartTime;
@@ -147,6 +148,7 @@ public final class Avrcp {
        mSongLengthMs = 0L;
        mPlaybackIntervalMs = 0L;
        mPlayPosChangedNT = NOTIFICATION_TYPE_CHANGED;
        mLastReportedPosition = -1;
        mNextPosMs = -1;
        mPrevPosMs = -1;
        mFeatures = 0;
@@ -626,21 +628,27 @@ public final class Avrcp {
    }

    private void updatePlaybackState(PlaybackState state) {
        if (DEBUG) Log.v(TAG,
                "updatePlaybackState: old=" + mCurrentPlayState + ", new=" + state);
        if (state == null) {
          state = new PlaybackState.Builder().setState(PlaybackState.STATE_NONE,
                         PlaybackState.PLAYBACK_POSITION_UNKNOWN, 0.0f).build();
        }

        int oldPlayStatus = convertPlayStateToPlayStatus(mCurrentPlayState);
        int newPlayStatus = convertPlayStateToPlayStatus(state);

        if (DEBUG) {
            Log.v(TAG, "updatePlaybackState (" + mPlayStatusChangedNT + "): "+
                       "old=" + mCurrentPlayState + "(" + oldPlayStatus + "), "+
                       "new=" + state + "(" + newPlayStatus + ")");
        }

        mCurrentPlayState = state;
        mLastStateUpdate = SystemClock.elapsedRealtime();

        sendPlayPosNotificationRsp(false);

        if (mPlayStatusChangedNT == NOTIFICATION_TYPE_INTERIM) {
        if (mPlayStatusChangedNT == NOTIFICATION_TYPE_INTERIM &&
            (oldPlayStatus != newPlayStatus)) {
            mPlayStatusChangedNT = NOTIFICATION_TYPE_CHANGED;
            registerNotificationRspPlayStatusNative(mPlayStatusChangedNT, newPlayStatus);
        }
@@ -770,14 +778,6 @@ public final class Avrcp {
            Log.v(TAG, "MediaAttributes Changed to " + mMediaAttributes.toString());
            mTrackNumber++;

            // Update the play state, which sends play state and play position
            // notifications if needed.
            if (mMediaController != null) {
              updatePlaybackState(mMediaController.getPlaybackState());
            } else {
              updatePlaybackState(null);
            }

            if (mTrackChangedNT == NOTIFICATION_TYPE_INTERIM) {
                mTrackChangedNT = NOTIFICATION_TYPE_CHANGED;
                sendTrackChangedRsp();
@@ -786,6 +786,13 @@ public final class Avrcp {
            Log.v(TAG, "Updated " + mMediaAttributes.toString() + " but no change!");
        }

        // Update the play state, which sends play state and play position
        // notifications if needed.
        if (mMediaController != null) {
          updatePlaybackState(mMediaController.getPlaybackState());
        } else {
          updatePlaybackState(null);
        }
    }

    private void getRcFeatures(byte[] address, int features) {
@@ -830,8 +837,8 @@ public final class Avrcp {

            case EVT_PLAY_POS_CHANGED:
                mPlayPosChangedNT = NOTIFICATION_TYPE_INTERIM;
                sendPlayPosNotificationRsp(true);
                mPlaybackIntervalMs = (long)param * 1000L;
                sendPlayPosNotificationRsp(true);
                break;

        }
@@ -952,6 +959,11 @@ public final class Avrcp {
     * TG.
     */
    private void sendPlayPosNotificationRsp(boolean requested) {
        if (!requested && mPlayPosChangedNT != NOTIFICATION_TYPE_INTERIM) {
            if (DEBUG) Log.d(TAG, "sendPlayPosNotificationRsp: Not registered or requesting.");
            return;
        }

        long playPositionMs = getPlayPosition();

        // mNextPosMs is set to -1 when the previous position was invalid
@@ -959,10 +971,13 @@ public final class Avrcp {
        // mPlayPositionMs is set to -1 when the new position is invalid,
        // and the old mPrevPosMs is >= 0 so this is true when the new is invalid
        // and the old was valid.
        if (requested || ((mPlayPosChangedNT == NOTIFICATION_TYPE_INTERIM) &&
             ((playPositionMs >= mNextPosMs) || (playPositionMs <= mPrevPosMs)))) {
        if (DEBUG) Log.d(TAG, "sendPlayPosNotificationRsp: (" + requested + ") "
            + mPrevPosMs + " <=? " + playPositionMs + " <=? " + mNextPosMs);
        if (requested || ((mLastReportedPosition != playPositionMs) &&
              (playPositionMs >= mNextPosMs) || (playPositionMs <= mPrevPosMs))) {
            if (!requested) mPlayPosChangedNT = NOTIFICATION_TYPE_CHANGED;
            registerNotificationRspPlayPosNative(mPlayStatusChangedNT, (int)playPositionMs);
            registerNotificationRspPlayPosNative(mPlayPosChangedNT, (int)playPositionMs);
            mLastReportedPosition = playPositionMs;
            if (playPositionMs != PlaybackState.PLAYBACK_POSITION_UNKNOWN) {
                mNextPosMs = playPositionMs + mPlaybackIntervalMs;
                mPrevPosMs = playPositionMs - mPlaybackIntervalMs;
@@ -973,12 +988,13 @@ public final class Avrcp {
        }

        mHandler.removeMessages(MESSAGE_PLAY_INTERVAL_TIMEOUT);
        if (mPlayStatusChangedNT == NOTIFICATION_TYPE_INTERIM) {
        if (mPlayPosChangedNT == NOTIFICATION_TYPE_INTERIM && isPlayingState(mCurrentPlayState)) {
            Message msg = mHandler.obtainMessage(MESSAGE_PLAY_INTERVAL_TIMEOUT);
            long delay = mPlaybackIntervalMs;
            if (mNextPosMs != -1) {
                delay = mNextPosMs - (playPositionMs > 0 ? playPositionMs : 0);
            }
            if (DEBUG) Log.d(TAG, "PLAY_INTERVAL_TIMEOUT set for " + delay + "ms from now");
            mHandler.sendMessageDelayed(msg, delay);
        }
    }