ignore invlaid play position update from remote control client.

differentiate between applications that use
 the new RemoteControlClient APIs to pass a playback position but
 don't have one yet, and applications that use the legacy API and
 will never pass a position.

bug:9294855
Change-Id: I015b9ded72497464352a9fbb6a605cedfffad373
diff --git a/src/com/android/bluetooth/a2dp/Avrcp.java b/src/com/android/bluetooth/a2dp/Avrcp.java
index c2e8187..ac7a323 100755
--- a/src/com/android/bluetooth/a2dp/Avrcp.java
+++ b/src/com/android/bluetooth/a2dp/Avrcp.java
@@ -94,7 +94,7 @@
         mPlayStatusChangedNT = NOTIFICATION_TYPE_CHANGED;
         mTrackChangedNT = NOTIFICATION_TYPE_CHANGED;
         mTrackNumber = -1L;
-        mCurrentPosMs = RemoteControlClient.PLAYBACK_POSITION_INVALID;
+        mCurrentPosMs = 0L;
         mPlayStartTimeMs = -1L;
         mSongLengthMs = 0L;
         mPlaybackIntervalMs = 0L;
@@ -269,28 +269,39 @@
     private void updatePlayPauseState(int state, long currentPosMs) {
         if (DEBUG) Log.v(TAG,
                 "updatePlayPauseState, old=" + mCurrentPlayState + ", state=" + state);
-        boolean oldPosValid = (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_INVALID);
-        boolean newPosValid = (currentPosMs != RemoteControlClient.PLAYBACK_POSITION_INVALID);
+        boolean oldPosValid = (mCurrentPosMs !=
+                               RemoteControlClient.PLAYBACK_POSITION_ALWAYS_UNKNOWN);
         int oldPlayStatus = convertPlayStateToPlayStatus(mCurrentPlayState);
         int newPlayStatus = convertPlayStateToPlayStatus(state);
+
+        if ((mCurrentPlayState == RemoteControlClient.PLAYSTATE_PLAYING) &&
+            (mCurrentPlayState != state) && oldPosValid) {
+            mCurrentPosMs = getPlayPosition();
+        }
+
         mCurrentPlayState = state;
-        mCurrentPosMs = currentPosMs;
+        if (currentPosMs != RemoteControlClient.PLAYBACK_POSITION_INVALID) {
+            mCurrentPosMs = currentPosMs;
+        }
         if (state == RemoteControlClient.PLAYSTATE_PLAYING) {
             mPlayStartTimeMs = SystemClock.elapsedRealtime();
         }
 
+        boolean newPosValid = (mCurrentPosMs !=
+                               RemoteControlClient.PLAYBACK_POSITION_ALWAYS_UNKNOWN);
+        long playPosition = getPlayPosition();
         mHandler.removeMessages(MESSAGE_PLAY_INTERVAL_TIMEOUT);
         /* need send play position changed notification when play status is changed */
         if ((mPlayPosChangedNT == NOTIFICATION_TYPE_INTERIM) &&
             ((oldPlayStatus != newPlayStatus) || (oldPosValid != newPosValid) ||
-             (newPosValid && ((mCurrentPosMs >= mNextPosMs) || (mCurrentPosMs <= mPrevPosMs))))) {
+             (newPosValid && ((playPosition >= mNextPosMs) || (playPosition <= mPrevPosMs))))) {
             mPlayPosChangedNT = NOTIFICATION_TYPE_CHANGED;
-            registerNotificationRspPlayPosNative(mPlayPosChangedNT, (int)getPlayPosition());
+            registerNotificationRspPlayPosNative(mPlayPosChangedNT, (int)playPosition);
         }
         if ((mPlayPosChangedNT == NOTIFICATION_TYPE_INTERIM) && newPosValid &&
             (state == RemoteControlClient.PLAYSTATE_PLAYING)) {
             Message msg = mHandler.obtainMessage(MESSAGE_PLAY_INTERVAL_TIMEOUT);
-            mHandler.sendMessageDelayed(msg, mNextPosMs - mCurrentPosMs);
+            mHandler.sendMessageDelayed(msg, mNextPosMs - playPosition);
         }
 
         if ((mPlayStatusChangedNT == NOTIFICATION_TYPE_INTERIM) && (oldPlayStatus != newPlayStatus)) {
@@ -340,7 +351,7 @@
                 sendTrackChangedRsp();
             }
 
-            if (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_INVALID) {
+            if (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_ALWAYS_UNKNOWN) {
                 mCurrentPosMs = 0L;
                 if (mCurrentPlayState == RemoteControlClient.PLAYSTATE_PLAYING) {
                     mPlayStartTimeMs = SystemClock.elapsedRealtime();
@@ -397,7 +408,7 @@
                 long songPosition = getPlayPosition();
                 mPlayPosChangedNT = NOTIFICATION_TYPE_INTERIM;
                 mPlaybackIntervalMs = (long)param * 1000L;
-                if (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_INVALID) {
+                if (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_ALWAYS_UNKNOWN) {
                     mNextPosMs = songPosition + mPlaybackIntervalMs;
                     mPrevPosMs = songPosition - mPlaybackIntervalMs;
                     if (mCurrentPlayState == RemoteControlClient.PLAYSTATE_PLAYING) {
@@ -422,7 +433,7 @@
 
     private long getPlayPosition() {
         long songPosition = -1L;
-        if (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_INVALID) {
+        if (mCurrentPosMs != RemoteControlClient.PLAYBACK_POSITION_ALWAYS_UNKNOWN) {
             if (mCurrentPlayState == RemoteControlClient.PLAYSTATE_PLAYING) {
                 songPosition = SystemClock.elapsedRealtime() -
                                mPlayStartTimeMs + mCurrentPosMs;