Snap for 4402310 from b29da02e4b48bae69bf74f6174cdf6815786cb94 to oc-m2-release

Change-Id: Ib60666ffa813b2d5641c262861c307f41a851dfb
diff --git a/src/com/android/bluetooth/avrcp/Avrcp.java b/src/com/android/bluetooth/avrcp/Avrcp.java
index 1b65597..a00502c 100644
--- a/src/com/android/bluetooth/avrcp/Avrcp.java
+++ b/src/com/android/bluetooth/avrcp/Avrcp.java
@@ -855,7 +855,7 @@
             // As a result of that, if we pause the music, on carkits the
             // Play status indicator will continue to display "Playing"
             // for 3 more seconds which can be confusing.
-            if (mAudioManagerIsPlaying
+            if ((mAudioManagerIsPlaying && newState.getState() != PlaybackState.STATE_PLAYING)
                     || (controllerState == null && mAudioManager != null
                                && mAudioManager.isMusicActive())) {
                 // Use AudioManager playback state if we don't have the state
@@ -2701,8 +2701,12 @@
                 return KeyEvent.KEYCODE_VOLUME_DOWN;
             case BluetoothAvrcp.PASSTHROUGH_ID_MUTE:
                 return KeyEvent.KEYCODE_MUTE;
+            case BluetoothAvrcp.PASSTHROUGH_ID_PLAY:
+                return KeyEvent.KEYCODE_MEDIA_PLAY;
             case BluetoothAvrcp.PASSTHROUGH_ID_STOP:
                 return KeyEvent.KEYCODE_MEDIA_STOP;
+            case BluetoothAvrcp.PASSTHROUGH_ID_PAUSE:
+                return KeyEvent.KEYCODE_MEDIA_PAUSE;
             case BluetoothAvrcp.PASSTHROUGH_ID_RECORD:
                 return KeyEvent.KEYCODE_MEDIA_RECORD;
             case BluetoothAvrcp.PASSTHROUGH_ID_REWIND:
@@ -2725,12 +2729,6 @@
                 return KeyEvent.KEYCODE_F4;
             case BluetoothAvrcp.PASSTHROUGH_ID_F5:
                 return KeyEvent.KEYCODE_F5;
-            // Interop workaround for headphones/car kits
-            // which do not properly key track of playback
-            // state...
-            case BluetoothAvrcp.PASSTHROUGH_ID_PLAY:
-            case BluetoothAvrcp.PASSTHROUGH_ID_PAUSE:
-                return KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE;
             // Fallthrough for all unknown key mappings
             case BluetoothAvrcp.PASSTHROUGH_ID_SELECT:
             case BluetoothAvrcp.PASSTHROUGH_ID_ROOT_MENU:
diff --git a/src/com/android/bluetooth/mapclient/MnsService.java b/src/com/android/bluetooth/mapclient/MnsService.java
index 7b3419e..1078cf1 100644
--- a/src/com/android/bluetooth/mapclient/MnsService.java
+++ b/src/com/android/bluetooth/mapclient/MnsService.java
@@ -50,26 +50,49 @@
 
     static private MapClientService mContext;
     private volatile boolean mShutdown = false;         // Used to interrupt socket accept thread
+    private int mSdpHandle = -1;
 
     MnsService(MapClientService context) {
         if (VDBG) Log.v(TAG, "MnsService()");
         mContext = context;
         mAcceptThread = new SocketAcceptor();
         mServerSockets = ObexServerSockets.create(mAcceptThread);
-        SdpManager.getDefaultManager().createMapMnsRecord(
-                "MAP Message Notification Service", mServerSockets.getRfcommChannel(), -1,
-                MNS_VERSION, MNS_FEATURE_BITS);
+        SdpManager sdpManager = SdpManager.getDefaultManager();
+        if (sdpManager == null) {
+            Log.e(TAG, "SdpManager is null");
+            return;
+        }
+        mSdpHandle = sdpManager.createMapMnsRecord("MAP Message Notification Service",
+                mServerSockets.getRfcommChannel(), -1, MNS_VERSION, MNS_FEATURE_BITS);
     }
 
     void stop() {
         if (VDBG) Log.v(TAG, "stop()");
         mShutdown = true;
+        cleanUpSdpRecord();
         if (mServerSockets != null) {
             mServerSockets.shutdown(false);
             mServerSockets = null;
         }
     }
 
+    private void cleanUpSdpRecord() {
+        if (mSdpHandle < 0) {
+            Log.e(TAG, "cleanUpSdpRecord, SDP record never created");
+            return;
+        }
+        int sdpHandle = mSdpHandle;
+        mSdpHandle = -1;
+        SdpManager sdpManager = SdpManager.getDefaultManager();
+        if (sdpManager == null) {
+            Log.e(TAG, "cleanUpSdpRecord failed, sdpManager is null, sdpHandle=" + sdpHandle);
+            return;
+        }
+        Log.i(TAG, "cleanUpSdpRecord, mSdpHandle=" + sdpHandle);
+        if (!sdpManager.removeSdpRecord(sdpHandle)) {
+            Log.e(TAG, "cleanUpSdpRecord, removeSdpRecord failed, sdpHandle=" + sdpHandle);
+        }
+    }
 
     private class SocketAcceptor implements IObexConnectionHandler {
 
diff --git a/src/com/android/bluetooth/opp/BluetoothOppService.java b/src/com/android/bluetooth/opp/BluetoothOppService.java
index b68936a..7f94820 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppService.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppService.java
@@ -226,14 +226,6 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case STOP_LISTENER:
-                    if (mAdapter != null && mOppSdpHandle >= 0
-                            && SdpManager.getDefaultManager() != null) {
-                        if (D) Log.d(TAG, "Removing SDP record mOppSdpHandle :" + mOppSdpHandle);
-                        boolean status =
-                                SdpManager.getDefaultManager().removeSdpRecord(mOppSdpHandle);
-                        Log.d(TAG, "RemoveSDPrecord returns " + status);
-                        mOppSdpHandle = -1;
-                    }
                     stopListeners();
                     mListenStarted = false;
                     //Stop Active INBOUND Transfer
@@ -365,8 +357,10 @@
                             + " mServerSocket:" + mServerSocket);
             return;
         }
-        sdpManager.createOppOpsRecord("OBEX Object Push", mServerSocket.getRfcommChannel(),
-                mServerSocket.getL2capPsm(), 0x0102, SUPPORTED_OPP_FORMAT);
+        mOppSdpHandle =
+                sdpManager.createOppOpsRecord("OBEX Object Push", mServerSocket.getRfcommChannel(),
+                        mServerSocket.getL2capPsm(), 0x0102, SUPPORTED_OPP_FORMAT);
+        if (D) Log.d(TAG, "mOppSdpHandle :" + mOppSdpHandle);
     }
 
     @Override
@@ -1063,6 +1057,12 @@
     }
 
     private void stopListeners() {
+        if (mAdapter != null && mOppSdpHandle >= 0 && SdpManager.getDefaultManager() != null) {
+            if (D) Log.d(TAG, "Removing SDP record mOppSdpHandle :" + mOppSdpHandle);
+            boolean status = SdpManager.getDefaultManager().removeSdpRecord(mOppSdpHandle);
+            Log.d(TAG, "RemoveSDPrecord returns " + status);
+            mOppSdpHandle = -1;
+        }
         if (mServerSocket != null) {
             mServerSocket.shutdown(false);
             mServerSocket = null;