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) {