Fix AVRCP crash, position and state tracking
When the MediaController goes away (media stops) a NPE would cause a
crash.
Initialize the position so that an initial notification gets sent
when position is requested, send it when the music is paused, and
send play state whenever the app sends us a play state update.
Bug: 30039744
Bug: 29416450
Change-Id: I44397b3dc40d328fa75a2c15875fad298a5090dd
(cherry picked from commit 84d3f084d4d1a65eb7a481e5a7fe4a6ac827be7b)
diff --git a/src/com/android/bluetooth/avrcp/Avrcp.java b/src/com/android/bluetooth/avrcp/Avrcp.java
index e864c16..6ce7123 100755
--- a/src/com/android/bluetooth/avrcp/Avrcp.java
+++ b/src/com/android/bluetooth/avrcp/Avrcp.java
@@ -163,6 +163,8 @@
mSongLengthMs = 0L;
mPlaybackIntervalMs = 0L;
mPlayPosChangedNT = NOTIFICATION_TYPE_CHANGED;
+ mNextPosMs = -1;
+ mPrevPosMs = -1;
mFeatures = 0;
mRemoteVolume = -1;
mInitialRemoteVolume = -1;
@@ -267,12 +269,10 @@
mMediaController = controller;
if (mMediaController == null) {
updateMetadata(null);
- updatePlaybackState(null);
return;
}
mMediaController.registerCallback(mMediaControllerCb, mHandler);
updateMetadata(mMediaController.getMetadata());
- updatePlaybackState(mMediaController.getPlaybackState());
}
/** Handles Avrcp messages. */
@@ -641,7 +641,6 @@
PlaybackState.PLAYBACK_POSITION_UNKNOWN, 0.0f).build();
}
- int oldPlayStatus = convertPlayStateToPlayStatus(mCurrentPlayState);
int newPlayStatus = convertPlayStateToPlayStatus(state);
mCurrentPlayState = state;
@@ -649,7 +648,7 @@
sendPlayPosNotificationRsp(false);
- if ((mPlayStatusChangedNT == NOTIFICATION_TYPE_INTERIM) && (oldPlayStatus != newPlayStatus)) {
+ if (mPlayStatusChangedNT == NOTIFICATION_TYPE_INTERIM) {
mPlayStatusChangedNT = NOTIFICATION_TYPE_CHANGED;
registerNotificationRspPlayStatusNative(mPlayStatusChangedNT, newPlayStatus);
}
@@ -779,8 +778,13 @@
Log.v(TAG, "MediaAttributes Changed to " + mMediaAttributes.toString());
mTrackNumber++;
- // Update the play state, which sends a notification if needed.
- updatePlaybackState(mMediaController.getPlaybackState());
+ // 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;
@@ -903,7 +907,7 @@
return SystemClock.elapsedRealtime() - mLastStateUpdate + mCurrentPlayState.getPosition();
}
- return -1L;
+ return mCurrentPlayState.getPosition();
}
private int convertPlayStateToPlayStatus(PlaybackState state) {