diff options
Diffstat (limited to 'media/java/android/media/MediaRouter.java')
-rw-r--r-- | media/java/android/media/MediaRouter.java | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 3f1851d74c34..de202278c40b 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -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; @@ -87,6 +84,7 @@ public class MediaRouter { final boolean mCanConfigureWifiDisplays; boolean mActivelyScanningWifiDisplays; + String mPreviousActiveWifiDisplayAddress; int mDiscoveryRequestRouteTypes; boolean mDiscoverRequestActiveScan; @@ -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(); @@ -279,15 +267,24 @@ public class MediaRouter { } // Update wifi display scanning. - if (activeScanWifiDisplay && mCanConfigureWifiDisplays) { - if (!mActivelyScanningWifiDisplays) { - mActivelyScanningWifiDisplays = true; - mHandler.post(mScanWifiDisplays); + // 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; } - } else { - if (mActivelyScanningWifiDisplays) { - mActivelyScanningWifiDisplays = false; - mHandler.removeCallbacks(mScanWifiDisplays); + if (activeScanWifiDisplay) { + if (!mActivelyScanningWifiDisplays) { + mActivelyScanningWifiDisplays = true; + mDisplayService.startWifiDisplayScan(); + } + } else { + if (mActivelyScanningWifiDisplays) { + mActivelyScanningWifiDisplays = false; + mDisplayService.stopWifiDisplayScan(); + } } } @@ -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() { @@ -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(); @@ -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++) { @@ -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); @@ -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) { @@ -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)) { @@ -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(); } |