Merge cherrypicks of [2860986, 2860116, 2860927, 2860463, 2861006, 2861007, 2860788, 2860789, 2860790, 2860791, 2860970, 2860792, 2861008, 2860117, 2860971] into oc-r2-release

Change-Id: I389d6327d64a80e88070b9cac4e6d8a04a7c262e
diff --git a/src/com/android/bluetooth/a2dp/A2dpService.java b/src/com/android/bluetooth/a2dp/A2dpService.java
index 187a139..bdab866 100755
--- a/src/com/android/bluetooth/a2dp/A2dpService.java
+++ b/src/com/android/bluetooth/a2dp/A2dpService.java
@@ -48,7 +48,9 @@
     private A2dpStateMachine mStateMachine;
     private Avrcp mAvrcp;
 
-    private BroadcastReceiver mConnectionStateChangedReceiver = new BroadcastReceiver() {
+    private BroadcastReceiver mConnectionStateChangedReceiver = null;
+
+    private class CodecSupportReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (!BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(intent.getAction())) {
@@ -108,9 +110,12 @@
         mAvrcp = Avrcp.make(this);
         mStateMachine = A2dpStateMachine.make(this, this);
         setA2dpService(this);
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
-        registerReceiver(mConnectionStateChangedReceiver, filter);
+        if (mConnectionStateChangedReceiver == null) {
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
+            mConnectionStateChangedReceiver = new CodecSupportReceiver();
+            registerReceiver(mConnectionStateChangedReceiver, filter);
+        }
         return true;
     }
 
@@ -125,9 +130,13 @@
     }
 
     protected boolean cleanup() {
-        unregisterReceiver(mConnectionStateChangedReceiver);
-        if (mStateMachine!= null) {
+        if (mConnectionStateChangedReceiver != null) {
+            unregisterReceiver(mConnectionStateChangedReceiver);
+            mConnectionStateChangedReceiver = null;
+        }
+        if (mStateMachine != null) {
             mStateMachine.cleanup();
+            mStateMachine = null;
         }
         if (mAvrcp != null) {
             mAvrcp.cleanup();