Merge "Announce title of QS detail views" into lmp-dev
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java
index eb0be05..e344954 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java
@@ -55,6 +55,7 @@
     private final Object mProjectionLock = new Object();
 
     private boolean mDiscovering;
+    private boolean mCallbackRegistered;
     private MediaProjectionInfo mProjection;
 
     public CastControllerImpl(Context context) {
@@ -70,6 +71,7 @@
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("CastController state:");
         pw.print("  mDiscovering="); pw.println(mDiscovering);
+        pw.print("  mCallbackRegistered="); pw.println(mCallbackRegistered);
         pw.print("  mCallbacks.size="); pw.println(mCallbacks.size());
         pw.print("  mRoutes.size="); pw.println(mRoutes.size());
         for (int i = 0; i < mRoutes.size(); i++) {
@@ -83,11 +85,17 @@
     public void addCallback(Callback callback) {
         mCallbacks.add(callback);
         fireOnCastDevicesChanged(callback);
+        synchronized (mDiscoveringLock) {
+            handleDiscoveryChangeLocked();
+        }
     }
 
     @Override
     public void removeCallback(Callback callback) {
         mCallbacks.remove(callback);
+        synchronized (mDiscoveringLock) {
+            handleDiscoveryChangeLocked();
+        }
     }
 
     @Override
@@ -96,12 +104,23 @@
             if (mDiscovering == request) return;
             mDiscovering = request;
             if (DEBUG) Log.d(TAG, "setDiscovering: " + request);
-            if (request) {
-                mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback,
-                        MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
-            } else {
-                mMediaRouter.removeCallback(mMediaCallback);
-            }
+            handleDiscoveryChangeLocked();
+        }
+    }
+
+    private void handleDiscoveryChangeLocked() {
+        if (mCallbackRegistered) {
+            mMediaRouter.removeCallback(mMediaCallback);
+            mCallbackRegistered = false;
+        }
+        if (mDiscovering) {
+            mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback,
+                    MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
+            mCallbackRegistered = true;
+        } else if (mCallbacks.size() != 0) {
+            mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback,
+                    MediaRouter.CALLBACK_FLAG_PASSIVE_DISCOVERY);
+            mCallbackRegistered = true;
         }
     }