From 39ad0e559896b45185429ea17cd12f18f7ae842c Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 11 Nov 2013 17:55:08 -0800 Subject: UI tweaks. Hide disabled routes from the chooser. Fix layout of chooser dialog when the settings button is visible and the list is very long to prevent truncation of the settings button. Fix an issue when we fake the route connecting status when a route is selected. The route changed notification needs to be propagated to apps. Fake it better. Immediately disconnect from a route when the connection is lost or a connection attempt fails. Added a few new test displays for this case. Bug: 11257292 Change-Id: I360ab5dc937ad60d97592eab54b19f034519645e --- media/java/android/media/MediaRouter.java | 113 ++++++++++++++++++------------ 1 file changed, 68 insertions(+), 45 deletions(-) (limited to 'media/java') diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index fb753c5..3d10158 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -469,7 +469,7 @@ public class MediaRouter { route.mDescription = globalRoute.description; route.mSupportedTypes = globalRoute.supportedTypes; route.mEnabled = globalRoute.enabled; - route.setStatusCode(globalRoute.statusCode); + route.setRealStatusCode(globalRoute.statusCode); route.mPlaybackType = globalRoute.playbackType; route.mPlaybackStream = globalRoute.playbackStream; route.mVolume = globalRoute.volume; @@ -501,8 +501,8 @@ public class MediaRouter { route.mEnabled = globalRoute.enabled; changed = true; } - if (route.mStatusCode != globalRoute.statusCode) { - route.setStatusCode(globalRoute.statusCode); + if (route.mRealStatusCode != globalRoute.statusCode) { + route.setRealStatusCode(globalRoute.statusCode); changed = true; } if (route.mPlaybackType != globalRoute.playbackType) { @@ -918,8 +918,14 @@ public class MediaRouter { if (oldRoute != null) { dispatchRouteUnselected(types & oldRoute.getSupportedTypes(), oldRoute); + if (oldRoute.resolveStatusCode()) { + dispatchRouteChanged(oldRoute); + } } if (route != null) { + if (route.resolveStatusCode()) { + dispatchRouteChanged(route); + } dispatchRouteSelected(types & route.getSupportedTypes(), route); } } @@ -1337,7 +1343,7 @@ public class MediaRouter { newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED; newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE; - newRoute.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus)); + newRoute.setRealStatusCode(getWifiDisplayStatusCode(display, wfdStatus)); newRoute.mEnabled = isWifiDisplayEnabled(display, wfdStatus); newRoute.mName = display.getFriendlyDisplayName(); newRoute.mDescription = sStatic.mResources.getText( @@ -1359,7 +1365,7 @@ public class MediaRouter { changed |= route.mEnabled != enabled; route.mEnabled = enabled; - changed |= route.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus)); + changed |= route.setRealStatusCode(getWifiDisplayStatusCode(display, wfdStatus)); if (changed) { dispatchRouteChanged(route); @@ -1422,7 +1428,8 @@ public class MediaRouter { String mGlobalRouteId; // A predetermined connection status that can override mStatus - private int mStatusCode; + private int mRealStatusCode; + private int mResolvedStatusCode; /** @hide */ public static final int STATUS_NONE = 0; /** @hide */ public static final int STATUS_SCANNING = 1; @@ -1526,43 +1533,71 @@ public class MediaRouter { * Set this route's status by predetermined status code. If the caller * should dispatch a route changed event this call will return true; */ - boolean setStatusCode(int statusCode) { - if (statusCode != mStatusCode) { - mStatusCode = statusCode; - int resId; + boolean setRealStatusCode(int statusCode) { + if (mRealStatusCode != statusCode) { + mRealStatusCode = statusCode; + return resolveStatusCode(); + } + return false; + } + + /** + * Resolves the status code whenever the real status code or selection state + * changes. + */ + boolean resolveStatusCode() { + int statusCode = mRealStatusCode; + if (isSelected()) { switch (statusCode) { - case STATUS_SCANNING: - resId = com.android.internal.R.string.media_route_status_scanning; - break; - case STATUS_CONNECTING: - resId = com.android.internal.R.string.media_route_status_connecting; - break; + // If the route is selected and its status appears to be between states + // then report it as connecting even though it has not yet had a chance + // to officially move into the CONNECTING state. Note that routes in + // the NONE state are assumed to not require an explicit connection + // lifecycle whereas those that are AVAILABLE are assumed to have + // to eventually proceed to CONNECTED. case STATUS_AVAILABLE: - resId = com.android.internal.R.string.media_route_status_available; - break; - 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; - case STATUS_CONNECTED: - case STATUS_NONE: - default: - resId = 0; + case STATUS_SCANNING: + statusCode = STATUS_CONNECTING; break; } - mStatus = resId != 0 ? sStatic.mResources.getText(resId) : null; - return true; } - return false; + if (mResolvedStatusCode == statusCode) { + return false; + } + + mResolvedStatusCode = statusCode; + int resId; + switch (statusCode) { + case STATUS_SCANNING: + resId = com.android.internal.R.string.media_route_status_scanning; + break; + case STATUS_CONNECTING: + resId = com.android.internal.R.string.media_route_status_connecting; + break; + case STATUS_AVAILABLE: + resId = com.android.internal.R.string.media_route_status_available; + break; + 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; + case STATUS_CONNECTED: + case STATUS_NONE: + default: + resId = 0; + break; + } + mStatus = resId != 0 ? sStatic.mResources.getText(resId) : null; + return true; } /** * @hide */ public int getStatusCode() { - return mStatusCode; + return mResolvedStatusCode; } /** @@ -1821,19 +1856,7 @@ public class MediaRouter { * @return True if this route is in the process of connecting. */ public boolean isConnecting() { - // If the route is selected and its status appears to be between states - // then report it as connecting even though it has not yet had a chance - // to move into the CONNECTING state. Note that routes in the NONE state - // are assumed to not require an explicit connection lifecycle. - if (isSelected()) { - switch (mStatusCode) { - case STATUS_AVAILABLE: - case STATUS_SCANNING: - case STATUS_CONNECTING: - return true; - } - } - return false; + return mResolvedStatusCode == STATUS_CONNECTING; } /** @hide */ -- cgit v1.1