Loading core/java/android/hardware/display/DisplayManager.java +18 −3 Original line number Diff line number Diff line Loading @@ -297,16 +297,31 @@ public final class DisplayManager { } /** * Initiates a fresh scan of availble Wifi displays. * Starts scanning for available Wifi displays. * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast. * <p> * Calls to this method nest and must be matched by an equal number of calls to * {@link #stopWifiDisplayScan()}. * </p><p> * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}. * </p> * * @hide */ public void startWifiDisplayScan() { mGlobal.startWifiDisplayScan(); } /** * Stops scanning for available Wifi displays. * <p> * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}. * </p> * * @hide */ public void scanWifiDisplays() { mGlobal.scanWifiDisplays(); public void stopWifiDisplayScan() { mGlobal.stopWifiDisplayScan(); } /** Loading core/java/android/hardware/display/DisplayManagerGlobal.java +28 −5 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ public final class DisplayManagerGlobal { private final SparseArray<DisplayInfo> mDisplayInfoCache = new SparseArray<DisplayInfo>(); private int[] mDisplayIdCache; private int mWifiDisplayScanNestCount; private DisplayManagerGlobal(IDisplayManager dm) { mDm = dm; } Loading Loading @@ -267,12 +269,33 @@ public final class DisplayManagerGlobal { } } public void scanWifiDisplays() { public void startWifiDisplayScan() { synchronized (mLock) { if (mWifiDisplayScanNestCount++ == 0) { registerCallbackIfNeededLocked(); try { mDm.startWifiDisplayScan(); } catch (RemoteException ex) { Log.e(TAG, "Failed to scan for Wifi displays.", ex); } } } } public void stopWifiDisplayScan() { synchronized (mLock) { if (--mWifiDisplayScanNestCount == 0) { try { mDm.scanWifiDisplays(); mDm.stopWifiDisplayScan(); } catch (RemoteException ex) { Log.e(TAG, "Failed to scan for Wifi displays.", ex); } } else if (mWifiDisplayScanNestCount < 0) { Log.wtf(TAG, "Wifi display scan nest count became negative: " + mWifiDisplayScanNestCount); mWifiDisplayScanNestCount = 0; } } } public void connectWifiDisplay(String deviceAddress) { Loading core/java/android/hardware/display/IDisplayManager.aidl +13 −10 Original line number Diff line number Diff line Loading @@ -29,11 +29,14 @@ interface IDisplayManager { void registerCallback(in IDisplayManagerCallback callback); // No permissions required. void scanWifiDisplays(); // Requires CONFIGURE_WIFI_DISPLAY permission. // The process must have previously registered a callback. void startWifiDisplayScan(); // Requires CONFIGURE_WIFI_DISPLAY permission to connect to an unknown device. // No permissions required to connect to a known device. // Requires CONFIGURE_WIFI_DISPLAY permission. void stopWifiDisplayScan(); // Requires CONFIGURE_WIFI_DISPLAY permission. void connectWifiDisplay(String address); // No permissions required. Loading @@ -45,6 +48,12 @@ interface IDisplayManager { // Requires CONFIGURE_WIFI_DISPLAY permission. void forgetWifiDisplay(String address); // Requires CONFIGURE_WIFI_DISPLAY permission. void pauseWifiDisplay(); // Requires CONFIGURE_WIFI_DISPLAY permission. void resumeWifiDisplay(); // No permissions required. WifiDisplayStatus getWifiDisplayStatus(); Loading @@ -55,10 +64,4 @@ interface IDisplayManager { // No permissions required but must be same Uid as the creator. void releaseVirtualDisplay(in IBinder token); // Requires CONFIGURE_WIFI_DISPLAY permission. void pauseWifiDisplay(); // Requires CONFIGURE_WIFI_DISPLAY permission. void resumeWifiDisplay(); } media/java/android/media/MediaRouter.java +34 −27 Original line number Diff line number Diff line Loading @@ -61,9 +61,6 @@ public class MediaRouter { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); static class Static implements DisplayManager.DisplayListener { // Time between wifi display scans when actively scanning in milliseconds. private static final int WIFI_DISPLAY_SCAN_INTERVAL = 10000; final Context mAppContext; final Resources mResources; final IAudioService mAudioService; Loading @@ -87,6 +84,7 @@ public class MediaRouter { final boolean mCanConfigureWifiDisplays; boolean mActivelyScanningWifiDisplays; String mPreviousActiveWifiDisplayAddress; int mDiscoveryRequestRouteTypes; boolean mDiscoverRequestActiveScan; Loading @@ -106,16 +104,6 @@ public class MediaRouter { } }; final Runnable mScanWifiDisplays = new Runnable() { @Override public void run() { if (mActivelyScanningWifiDisplays) { mDisplayService.scanWifiDisplays(); mHandler.postDelayed(this, WIFI_DISPLAY_SCAN_INTERVAL); } } }; Static(Context appContext) { mAppContext = appContext; mResources = Resources.getSystem(); Loading Loading @@ -279,15 +267,24 @@ public class MediaRouter { } // Update wifi display scanning. if (activeScanWifiDisplay && mCanConfigureWifiDisplays) { // TODO: All of this should be managed by the media router service. if (mCanConfigureWifiDisplays) { if (mSelectedRoute != null && mSelectedRoute.matchesTypes(ROUTE_TYPE_REMOTE_DISPLAY)) { // Don't scan while already connected to a remote display since // it may interfere with the ongoing transmission. activeScanWifiDisplay = false; } if (activeScanWifiDisplay) { if (!mActivelyScanningWifiDisplays) { mActivelyScanningWifiDisplays = true; mHandler.post(mScanWifiDisplays); mDisplayService.startWifiDisplayScan(); } } else { if (mActivelyScanningWifiDisplays) { mActivelyScanningWifiDisplays = false; mHandler.removeCallbacks(mScanWifiDisplays); mDisplayService.stopWifiDisplayScan(); } } } Loading Loading @@ -945,6 +942,9 @@ public class MediaRouter { } dispatchRouteSelected(types & route.getSupportedTypes(), route); } // The behavior of active scans may depend on the currently selected route. sStatic.updateDiscoveryRequest(); } static void selectDefaultRouteStatic() { Loading Loading @@ -1291,10 +1291,8 @@ public class MediaRouter { } static void updateWifiDisplayStatus(WifiDisplayStatus status) { boolean wantScan = false; WifiDisplay[] displays; WifiDisplay activeDisplay; if (status.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) { displays = status.getDisplays(); activeDisplay = status.getActiveDisplay(); Loading @@ -1314,6 +1312,8 @@ public class MediaRouter { displays = WifiDisplay.EMPTY_ARRAY; activeDisplay = null; } String activeDisplayAddress = activeDisplay != null ? activeDisplay.getDeviceAddress() : null; // Add or update routes. for (int i = 0; i < displays.length; i++) { Loading @@ -1323,9 +1323,11 @@ public class MediaRouter { if (route == null) { route = makeWifiDisplayRoute(d, status); addRouteStatic(route); wantScan = true; } else { updateWifiDisplayRoute(route, d, status); String address = d.getDeviceAddress(); boolean disconnected = !address.equals(activeDisplayAddress) && address.equals(sStatic.mPreviousActiveWifiDisplayAddress); updateWifiDisplayRoute(route, d, status, disconnected); } if (d.equals(activeDisplay)) { selectRouteStatic(route.getSupportedTypes(), route, false); Loading @@ -1343,6 +1345,10 @@ public class MediaRouter { } } } // Remember the current active wifi display address so that we can infer disconnections. // TODO: This hack will go away once all of this is moved into the media router service. sStatic.mPreviousActiveWifiDisplayAddress = activeDisplayAddress; } private static boolean shouldShowWifiDisplay(WifiDisplay d, WifiDisplay activeDisplay) { Loading Loading @@ -1400,7 +1406,8 @@ public class MediaRouter { } private static void updateWifiDisplayRoute( RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus) { RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus, boolean disconnected) { boolean changed = false; final String newName = display.getFriendlyDisplayName(); if (!route.getName().equals(newName)) { Loading @@ -1418,7 +1425,7 @@ public class MediaRouter { dispatchRouteChanged(route); } if (!enabled && route.isSelected()) { if ((!enabled || disconnected) && route.isSelected()) { // Oops, no longer available. Reselect the default. selectDefaultRouteStatic(); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +2 −8 Original line number Diff line number Diff line Loading @@ -813,14 +813,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, } else { connectedRoute = null; connecting = false; final int count = mMediaRouter.getRouteCount(); for (int i = 0; i < count; i++) { MediaRouter.RouteInfo route = mMediaRouter.getRouteAt(i); if (route.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY)) { enabled = true; break; } } enabled = mMediaRouter.isRouteAvailable(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE); } mRemoteDisplayState.enabled = enabled; Loading Loading
core/java/android/hardware/display/DisplayManager.java +18 −3 Original line number Diff line number Diff line Loading @@ -297,16 +297,31 @@ public final class DisplayManager { } /** * Initiates a fresh scan of availble Wifi displays. * Starts scanning for available Wifi displays. * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast. * <p> * Calls to this method nest and must be matched by an equal number of calls to * {@link #stopWifiDisplayScan()}. * </p><p> * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}. * </p> * * @hide */ public void startWifiDisplayScan() { mGlobal.startWifiDisplayScan(); } /** * Stops scanning for available Wifi displays. * <p> * Requires {@link android.Manifest.permission#CONFIGURE_WIFI_DISPLAY}. * </p> * * @hide */ public void scanWifiDisplays() { mGlobal.scanWifiDisplays(); public void stopWifiDisplayScan() { mGlobal.stopWifiDisplayScan(); } /** Loading
core/java/android/hardware/display/DisplayManagerGlobal.java +28 −5 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ public final class DisplayManagerGlobal { private final SparseArray<DisplayInfo> mDisplayInfoCache = new SparseArray<DisplayInfo>(); private int[] mDisplayIdCache; private int mWifiDisplayScanNestCount; private DisplayManagerGlobal(IDisplayManager dm) { mDm = dm; } Loading Loading @@ -267,12 +269,33 @@ public final class DisplayManagerGlobal { } } public void scanWifiDisplays() { public void startWifiDisplayScan() { synchronized (mLock) { if (mWifiDisplayScanNestCount++ == 0) { registerCallbackIfNeededLocked(); try { mDm.startWifiDisplayScan(); } catch (RemoteException ex) { Log.e(TAG, "Failed to scan for Wifi displays.", ex); } } } } public void stopWifiDisplayScan() { synchronized (mLock) { if (--mWifiDisplayScanNestCount == 0) { try { mDm.scanWifiDisplays(); mDm.stopWifiDisplayScan(); } catch (RemoteException ex) { Log.e(TAG, "Failed to scan for Wifi displays.", ex); } } else if (mWifiDisplayScanNestCount < 0) { Log.wtf(TAG, "Wifi display scan nest count became negative: " + mWifiDisplayScanNestCount); mWifiDisplayScanNestCount = 0; } } } public void connectWifiDisplay(String deviceAddress) { Loading
core/java/android/hardware/display/IDisplayManager.aidl +13 −10 Original line number Diff line number Diff line Loading @@ -29,11 +29,14 @@ interface IDisplayManager { void registerCallback(in IDisplayManagerCallback callback); // No permissions required. void scanWifiDisplays(); // Requires CONFIGURE_WIFI_DISPLAY permission. // The process must have previously registered a callback. void startWifiDisplayScan(); // Requires CONFIGURE_WIFI_DISPLAY permission to connect to an unknown device. // No permissions required to connect to a known device. // Requires CONFIGURE_WIFI_DISPLAY permission. void stopWifiDisplayScan(); // Requires CONFIGURE_WIFI_DISPLAY permission. void connectWifiDisplay(String address); // No permissions required. Loading @@ -45,6 +48,12 @@ interface IDisplayManager { // Requires CONFIGURE_WIFI_DISPLAY permission. void forgetWifiDisplay(String address); // Requires CONFIGURE_WIFI_DISPLAY permission. void pauseWifiDisplay(); // Requires CONFIGURE_WIFI_DISPLAY permission. void resumeWifiDisplay(); // No permissions required. WifiDisplayStatus getWifiDisplayStatus(); Loading @@ -55,10 +64,4 @@ interface IDisplayManager { // No permissions required but must be same Uid as the creator. void releaseVirtualDisplay(in IBinder token); // Requires CONFIGURE_WIFI_DISPLAY permission. void pauseWifiDisplay(); // Requires CONFIGURE_WIFI_DISPLAY permission. void resumeWifiDisplay(); }
media/java/android/media/MediaRouter.java +34 −27 Original line number Diff line number Diff line Loading @@ -61,9 +61,6 @@ public class MediaRouter { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); static class Static implements DisplayManager.DisplayListener { // Time between wifi display scans when actively scanning in milliseconds. private static final int WIFI_DISPLAY_SCAN_INTERVAL = 10000; final Context mAppContext; final Resources mResources; final IAudioService mAudioService; Loading @@ -87,6 +84,7 @@ public class MediaRouter { final boolean mCanConfigureWifiDisplays; boolean mActivelyScanningWifiDisplays; String mPreviousActiveWifiDisplayAddress; int mDiscoveryRequestRouteTypes; boolean mDiscoverRequestActiveScan; Loading @@ -106,16 +104,6 @@ public class MediaRouter { } }; final Runnable mScanWifiDisplays = new Runnable() { @Override public void run() { if (mActivelyScanningWifiDisplays) { mDisplayService.scanWifiDisplays(); mHandler.postDelayed(this, WIFI_DISPLAY_SCAN_INTERVAL); } } }; Static(Context appContext) { mAppContext = appContext; mResources = Resources.getSystem(); Loading Loading @@ -279,15 +267,24 @@ public class MediaRouter { } // Update wifi display scanning. if (activeScanWifiDisplay && mCanConfigureWifiDisplays) { // TODO: All of this should be managed by the media router service. if (mCanConfigureWifiDisplays) { if (mSelectedRoute != null && mSelectedRoute.matchesTypes(ROUTE_TYPE_REMOTE_DISPLAY)) { // Don't scan while already connected to a remote display since // it may interfere with the ongoing transmission. activeScanWifiDisplay = false; } if (activeScanWifiDisplay) { if (!mActivelyScanningWifiDisplays) { mActivelyScanningWifiDisplays = true; mHandler.post(mScanWifiDisplays); mDisplayService.startWifiDisplayScan(); } } else { if (mActivelyScanningWifiDisplays) { mActivelyScanningWifiDisplays = false; mHandler.removeCallbacks(mScanWifiDisplays); mDisplayService.stopWifiDisplayScan(); } } } Loading Loading @@ -945,6 +942,9 @@ public class MediaRouter { } dispatchRouteSelected(types & route.getSupportedTypes(), route); } // The behavior of active scans may depend on the currently selected route. sStatic.updateDiscoveryRequest(); } static void selectDefaultRouteStatic() { Loading Loading @@ -1291,10 +1291,8 @@ public class MediaRouter { } static void updateWifiDisplayStatus(WifiDisplayStatus status) { boolean wantScan = false; WifiDisplay[] displays; WifiDisplay activeDisplay; if (status.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) { displays = status.getDisplays(); activeDisplay = status.getActiveDisplay(); Loading @@ -1314,6 +1312,8 @@ public class MediaRouter { displays = WifiDisplay.EMPTY_ARRAY; activeDisplay = null; } String activeDisplayAddress = activeDisplay != null ? activeDisplay.getDeviceAddress() : null; // Add or update routes. for (int i = 0; i < displays.length; i++) { Loading @@ -1323,9 +1323,11 @@ public class MediaRouter { if (route == null) { route = makeWifiDisplayRoute(d, status); addRouteStatic(route); wantScan = true; } else { updateWifiDisplayRoute(route, d, status); String address = d.getDeviceAddress(); boolean disconnected = !address.equals(activeDisplayAddress) && address.equals(sStatic.mPreviousActiveWifiDisplayAddress); updateWifiDisplayRoute(route, d, status, disconnected); } if (d.equals(activeDisplay)) { selectRouteStatic(route.getSupportedTypes(), route, false); Loading @@ -1343,6 +1345,10 @@ public class MediaRouter { } } } // Remember the current active wifi display address so that we can infer disconnections. // TODO: This hack will go away once all of this is moved into the media router service. sStatic.mPreviousActiveWifiDisplayAddress = activeDisplayAddress; } private static boolean shouldShowWifiDisplay(WifiDisplay d, WifiDisplay activeDisplay) { Loading Loading @@ -1400,7 +1406,8 @@ public class MediaRouter { } private static void updateWifiDisplayRoute( RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus) { RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus, boolean disconnected) { boolean changed = false; final String newName = display.getFriendlyDisplayName(); if (!route.getName().equals(newName)) { Loading @@ -1418,7 +1425,7 @@ public class MediaRouter { dispatchRouteChanged(route); } if (!enabled && route.isSelected()) { if ((!enabled || disconnected) && route.isSelected()) { // Oops, no longer available. Reselect the default. selectDefaultRouteStatic(); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +2 −8 Original line number Diff line number Diff line Loading @@ -813,14 +813,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, } else { connectedRoute = null; connecting = false; final int count = mMediaRouter.getRouteCount(); for (int i = 0; i < count; i++) { MediaRouter.RouteInfo route = mMediaRouter.getRouteAt(i); if (route.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY)) { enabled = true; break; } } enabled = mMediaRouter.isRouteAvailable(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE); } mRemoteDisplayState.enabled = enabled; Loading