From 7eb6202feef939d92b5ea268cc2cfea3cc177cd6 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 19 Sep 2014 16:14:32 -0400 Subject: [PATCH] Fix status bar cast icon not updating Change the listening in CastControllerImpl so that it will always at least passive discovery when callbacks are added. When discovering is set this will switch to request discovery. This allows the status bar to catch disconnect callbacks when QS is not discovering. Bug: 17555869 Change-Id: Id2a80b98f6c7ca7e6a4d0ff00315d10a109e8259 --- .../statusbar/policy/CastControllerImpl.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) 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 eb0be054e8b9e..e34495492c027 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 @@ public class CastControllerImpl implements CastController { private final Object mProjectionLock = new Object(); private boolean mDiscovering; + private boolean mCallbackRegistered; private MediaProjectionInfo mProjection; public CastControllerImpl(Context context) { @@ -70,6 +71,7 @@ public class CastControllerImpl implements CastController { 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 class CastControllerImpl implements CastController { 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 @@ public class CastControllerImpl implements CastController { 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; } }