MediaRouter: grey out wifi displays that's in use

bug 9229799

Change-Id: I9f5fd2107f60c492d42c74e575e6483838a51267
This commit is contained in:
Chong Zhang
2013-06-11 10:25:49 -07:00
parent 512d8fbe51
commit ab87a63997
8 changed files with 172 additions and 122 deletions

View File

@@ -876,44 +876,45 @@ public class MediaRouter {
boolean wantScan = false;
boolean blockScan = false;
WifiDisplay[] oldDisplays = oldStatus != null ?
oldStatus.getRememberedDisplays() : WifiDisplay.EMPTY_ARRAY;
oldStatus.getDisplays() : WifiDisplay.EMPTY_ARRAY;
WifiDisplay[] newDisplays;
WifiDisplay[] availableDisplays;
WifiDisplay activeDisplay;
if (newStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
newDisplays = newStatus.getRememberedDisplays();
availableDisplays = newStatus.getAvailableDisplays();
newDisplays = newStatus.getDisplays();
activeDisplay = newStatus.getActiveDisplay();
} else {
newDisplays = availableDisplays = WifiDisplay.EMPTY_ARRAY;
newDisplays = WifiDisplay.EMPTY_ARRAY;
activeDisplay = null;
}
for (int i = 0; i < newDisplays.length; i++) {
final WifiDisplay d = newDisplays[i];
final boolean available = findMatchingDisplay(d, availableDisplays) != null;
RouteInfo route = findWifiDisplayRoute(d);
if (route == null) {
route = makeWifiDisplayRoute(d, available);
addRouteStatic(route);
wantScan = true;
} else {
updateWifiDisplayRoute(route, d, available, newStatus);
}
if (d.equals(activeDisplay)) {
selectRouteStatic(route.getSupportedTypes(), route);
if (d.isRemembered()) {
RouteInfo route = findWifiDisplayRoute(d);
if (route == null) {
route = makeWifiDisplayRoute(d, newStatus);
addRouteStatic(route);
wantScan = true;
} else {
updateWifiDisplayRoute(route, d, newStatus);
}
if (d.equals(activeDisplay)) {
selectRouteStatic(route.getSupportedTypes(), route);
// Don't scan if we're already connected to a wifi display,
// the scanning process can cause a hiccup with some configurations.
blockScan = true;
// Don't scan if we're already connected to a wifi display,
// the scanning process can cause a hiccup with some configurations.
blockScan = true;
}
}
}
for (int i = 0; i < oldDisplays.length; i++) {
final WifiDisplay d = oldDisplays[i];
final WifiDisplay newDisplay = findMatchingDisplay(d, newDisplays);
if (newDisplay == null) {
removeRoute(findWifiDisplayRoute(d));
if (d.isRemembered()) {
final WifiDisplay newDisplay = findMatchingDisplay(d, newDisplays);
if (newDisplay == null || !newDisplay.isRemembered()) {
removeRoute(findWifiDisplayRoute(d));
}
}
}
@@ -924,42 +925,20 @@ public class MediaRouter {
sStatic.mLastKnownWifiDisplayStatus = newStatus;
}
static RouteInfo makeWifiDisplayRoute(WifiDisplay display, boolean available) {
final RouteInfo newRoute = new RouteInfo(sStatic.mSystemCategory);
newRoute.mDeviceAddress = display.getDeviceAddress();
newRoute.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO;
newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED;
newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE;
newRoute.setStatusCode(available ?
RouteInfo.STATUS_AVAILABLE : RouteInfo.STATUS_CONNECTING);
newRoute.mEnabled = available;
newRoute.mName = display.getFriendlyDisplayName();
newRoute.mDescription = sStatic.mResources.getText(
com.android.internal.R.string.wireless_display_route_description);
newRoute.mPresentationDisplay = choosePresentationDisplayForRoute(newRoute,
sStatic.getAllPresentationDisplays());
return newRoute;
}
private static void updateWifiDisplayRoute(RouteInfo route, WifiDisplay display,
boolean available, WifiDisplayStatus wifiDisplayStatus) {
final boolean isScanning =
wifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING;
boolean changed = false;
static int getWifiDisplayStatusCode(WifiDisplay d, WifiDisplayStatus wfdStatus) {
int newStatus = RouteInfo.STATUS_NONE;
if (available) {
newStatus = isScanning ? RouteInfo.STATUS_SCANNING : RouteInfo.STATUS_AVAILABLE;
if (wfdStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) {
newStatus = RouteInfo.STATUS_SCANNING;
} else if (d.isAvailable()) {
newStatus = d.canConnect() ?
RouteInfo.STATUS_AVAILABLE: RouteInfo.STATUS_IN_USE;
} else {
newStatus = RouteInfo.STATUS_NOT_AVAILABLE;
}
if (display.equals(wifiDisplayStatus.getActiveDisplay())) {
final int activeState = wifiDisplayStatus.getActiveDisplayState();
if (d.equals(wfdStatus.getActiveDisplay())) {
final int activeState = wfdStatus.getActiveDisplayState();
switch (activeState) {
case WifiDisplayStatus.DISPLAY_STATE_CONNECTED:
newStatus = RouteInfo.STATUS_NONE;
@@ -973,22 +952,51 @@ public class MediaRouter {
}
}
return newStatus;
}
static boolean isWifiDisplayEnabled(WifiDisplay d, WifiDisplayStatus wfdStatus) {
return d.isAvailable() && (d.canConnect() || d.equals(wfdStatus.getActiveDisplay()));
}
static RouteInfo makeWifiDisplayRoute(WifiDisplay display, WifiDisplayStatus wfdStatus) {
final RouteInfo newRoute = new RouteInfo(sStatic.mSystemCategory);
newRoute.mDeviceAddress = display.getDeviceAddress();
newRoute.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO;
newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED;
newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE;
newRoute.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus));
newRoute.mEnabled = isWifiDisplayEnabled(display, wfdStatus);
newRoute.mName = display.getFriendlyDisplayName();
newRoute.mDescription = sStatic.mResources.getText(
com.android.internal.R.string.wireless_display_route_description);
newRoute.mPresentationDisplay = choosePresentationDisplayForRoute(newRoute,
sStatic.getAllPresentationDisplays());
return newRoute;
}
private static void updateWifiDisplayRoute(
RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus) {
boolean changed = false;
final String newName = display.getFriendlyDisplayName();
if (!route.getName().equals(newName)) {
route.mName = newName;
changed = true;
}
changed |= route.mEnabled != available;
route.mEnabled = available;
boolean enabled = isWifiDisplayEnabled(display, wfdStatus);
changed |= route.mEnabled != enabled;
route.mEnabled = enabled;
changed |= route.setStatusCode(newStatus);
changed |= route.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus));
if (changed) {
dispatchRouteChanged(route);
}
if (!available && route == sStatic.mSelectedRoute) {
if (!enabled && route == sStatic.mSelectedRoute) {
// Oops, no longer available. Reselect the default.
final RouteInfo defaultRoute = sStatic.mDefaultAudioVideo;
selectRouteStatic(defaultRoute.getSupportedTypes(), defaultRoute);
@@ -1069,6 +1077,7 @@ public class MediaRouter {
/** @hide */ public static final int STATUS_CONNECTING = 2;
/** @hide */ public static final int STATUS_AVAILABLE = 3;
/** @hide */ public static final int STATUS_NOT_AVAILABLE = 4;
/** @hide */ public static final int STATUS_IN_USE = 5;
private Object mTag;
@@ -1180,6 +1189,9 @@ public class MediaRouter {
case STATUS_NOT_AVAILABLE:
resId = com.android.internal.R.string.media_route_status_not_available;
break;
case STATUS_IN_USE:
resId = com.android.internal.R.string.media_route_status_in_use;
break;
}
mStatus = resId != 0 ? sStatic.mResources.getText(resId) : null;
return true;