Merge "Discover primary service by UUID for PTS tests (3/4)"
diff --git a/src/com/android/bluetooth/avrcp/Avrcp.java b/src/com/android/bluetooth/avrcp/Avrcp.java
index a01012f..2a28ceb 100644
--- a/src/com/android/bluetooth/avrcp/Avrcp.java
+++ b/src/com/android/bluetooth/avrcp/Avrcp.java
@@ -381,8 +381,6 @@
             Log.v(TAG, "MediaController session destroyed");
             if (mMediaController != null) {
                 removeMediaController(mMediaController.getWrappedInstance());
-                mMediaController.unregisterCallback(mMediaControllerCb);
-                mMediaController = null;
             }
         }
 
@@ -1586,11 +1584,6 @@
                     for (android.media.session.MediaController controller : currentControllers) {
                         if (!newControllers.contains(controller)) {
                             removeMediaController(controller);
-                            if (mMediaController != null && mMediaController.equals(controller)) {
-                                if (DEBUG) Log.v(TAG, "Active Controller is gone!");
-                                mMediaController.unregisterCallback(mMediaControllerCb);
-                                mMediaController = null;
-                            }
                         }
                     }
 
@@ -1858,11 +1851,18 @@
     }
 
     /** Remove the controller referenced by |controller| from any player in the list */
-    private void removeMediaController(android.media.session.MediaController controller) {
+    private void removeMediaController(@Nullable android.media.session.MediaController controller) {
+        if (controller == null) return;
         synchronized (mMediaPlayerInfoList) {
-            for (MediaPlayerInfo info : mMediaPlayerInfoList.values()) {
+            for (Map.Entry<Integer, MediaPlayerInfo> entry : mMediaPlayerInfoList.entrySet()) {
+                MediaPlayerInfo info = entry.getValue();
                 MediaController c = info.getMediaController();
-                if (c != null && c.equals(controller)) info.setMediaController(null);
+                if (c != null && c.equals(controller)) {
+                    info.setMediaController(null);
+                    if (entry.getKey() == mCurrAddrPlayerID) {
+                        updateCurrentController(mCurrAddrPlayerID, mCurrBrowsePlayerID);
+                    }
+                }
             }
         }
     }
@@ -2122,14 +2122,18 @@
         if (DEBUG)
             Log.d(TAG, "updateCurrentController: " + mMediaController + " to " + newController);
         if (mMediaController == null || (!mMediaController.equals(newController))) {
-            if (mMediaController != null) mMediaController.unregisterCallback(mMediaControllerCb);
-            mMediaController = newController;
-            if (mMediaController != null) {
-                mMediaController.registerCallback(mMediaControllerCb, mHandler);
-                mAddressedMediaPlayer.updateNowPlayingList(mMediaController.getQueue());
-            } else {
-                mAddressedMediaPlayer.updateNowPlayingList(null);
-                registerRsp = false;
+            synchronized (this) {
+                if (mMediaController != null) {
+                    mMediaController.unregisterCallback(mMediaControllerCb);
+                }
+                mMediaController = newController;
+                if (mMediaController != null) {
+                    mMediaController.registerCallback(mMediaControllerCb, mHandler);
+                    mAddressedMediaPlayer.updateNowPlayingList(mMediaController.getQueue());
+                } else {
+                    mAddressedMediaPlayer.updateNowPlayingList(null);
+                    registerRsp = false;
+                }
             }
             updateCurrentMediaState();
         }