summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chong Zhang <chz@google.com> 2013-06-11 10:25:49 -0700
committer Chong Zhang <chz@google.com> 2013-06-13 20:17:39 -0700
commitab87a63997a7dc771acfd0dcd7efda990dc3d5fe (patch)
tree9798297600fa48d8c780cda90aae03c259cd7c73
parent512d8fbe51186967d4a3db9f4b3a3b0f335557fe (diff)
MediaRouter: grey out wifi displays that's in use
bug 9229799 Change-Id: I9f5fd2107f60c492d42c74e575e6483838a51267
-rw-r--r--core/java/android/hardware/display/WifiDisplay.java46
-rw-r--r--core/java/android/hardware/display/WifiDisplayStatus.java67
-rw-r--r--core/res/res/values/strings.xml3
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--media/java/android/media/MediaRouter.java124
-rw-r--r--services/java/com/android/server/display/PersistentDataStore.java5
-rw-r--r--services/java/com/android/server/display/WifiDisplayAdapter.java46
-rw-r--r--services/java/com/android/server/display/WifiDisplayController.java2
8 files changed, 172 insertions, 122 deletions
diff --git a/core/java/android/hardware/display/WifiDisplay.java b/core/java/android/hardware/display/WifiDisplay.java
index 339fd6b246cc..af5a84e61116 100644
--- a/core/java/android/hardware/display/WifiDisplay.java
+++ b/core/java/android/hardware/display/WifiDisplay.java
@@ -33,7 +33,9 @@ public final class WifiDisplay implements Parcelable {
private final String mDeviceAddress;
private final String mDeviceName;
private final String mDeviceAlias;
+ private final boolean mIsAvailable;
private final boolean mCanConnect;
+ private final boolean mIsRemembered;
public static final WifiDisplay[] EMPTY_ARRAY = new WifiDisplay[0];
@@ -42,9 +44,11 @@ public final class WifiDisplay implements Parcelable {
String deviceAddress = in.readString();
String deviceName = in.readString();
String deviceAlias = in.readString();
+ boolean isAvailable = (in.readInt() != 0);
boolean canConnect = (in.readInt() != 0);
- return new WifiDisplay(deviceAddress, deviceName,
- deviceAlias, canConnect);
+ boolean isRemembered = (in.readInt() != 0);
+ return new WifiDisplay(deviceAddress, deviceName, deviceAlias,
+ isAvailable, canConnect, isRemembered);
}
public WifiDisplay[] newArray(int size) {
@@ -52,12 +56,8 @@ public final class WifiDisplay implements Parcelable {
}
};
- public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias) {
- this(deviceAddress, deviceName, deviceAlias, false);
- }
-
- public WifiDisplay(String deviceAddress, String deviceName,
- String deviceAlias, boolean canConnect) {
+ public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias,
+ boolean available, boolean canConnect, boolean remembered) {
if (deviceAddress == null) {
throw new IllegalArgumentException("deviceAddress must not be null");
}
@@ -68,7 +68,9 @@ public final class WifiDisplay implements Parcelable {
mDeviceAddress = deviceAddress;
mDeviceName = deviceName;
mDeviceAlias = deviceAlias;
+ mIsAvailable = available;
mCanConnect = canConnect;
+ mIsRemembered = remembered;
}
/**
@@ -97,13 +99,27 @@ public final class WifiDisplay implements Parcelable {
}
/**
- * Gets the availability of the Wifi display device.
+ * Returns true if device is available, false otherwise.
+ */
+ public boolean isAvailable() {
+ return mIsAvailable;
+ }
+
+ /**
+ * Returns true if device can be connected to (not in use), false otherwise.
*/
public boolean canConnect() {
return mCanConnect;
}
/**
+ * Returns true if device has been remembered, false otherwise.
+ */
+ public boolean isRemembered() {
+ return mIsRemembered;
+ }
+
+ /**
* Gets the name to show in the UI.
* Uses the device alias if available, otherwise uses the device name.
*/
@@ -116,12 +132,15 @@ public final class WifiDisplay implements Parcelable {
return o instanceof WifiDisplay && equals((WifiDisplay)o);
}
+ /**
+ * Returns true if the two displays have the same identity (address, name and alias).
+ * This method does not compare the current status of the displays.
+ */
public boolean equals(WifiDisplay other) {
return other != null
&& mDeviceAddress.equals(other.mDeviceAddress)
&& mDeviceName.equals(other.mDeviceName)
- && Objects.equal(mDeviceAlias, other.mDeviceAlias)
- && (mCanConnect == other.mCanConnect);
+ && Objects.equal(mDeviceAlias, other.mDeviceAlias);
}
/**
@@ -144,7 +163,9 @@ public final class WifiDisplay implements Parcelable {
dest.writeString(mDeviceAddress);
dest.writeString(mDeviceName);
dest.writeString(mDeviceAlias);
+ dest.writeInt(mIsAvailable ? 1 : 0);
dest.writeInt(mCanConnect ? 1 : 0);
+ dest.writeInt(mIsRemembered ? 1 : 0);
}
@Override
@@ -159,7 +180,8 @@ public final class WifiDisplay implements Parcelable {
if (mDeviceAlias != null) {
result += ", alias " + mDeviceAlias;
}
- result += ", canConnect " + mCanConnect;
+ result += ", isAvailable " + mIsAvailable + ", canConnect " + mCanConnect
+ + ", isRemembered " + mIsRemembered;
return result;
}
}
diff --git a/core/java/android/hardware/display/WifiDisplayStatus.java b/core/java/android/hardware/display/WifiDisplayStatus.java
index f7e72c417f77..77acdc04afd2 100644
--- a/core/java/android/hardware/display/WifiDisplayStatus.java
+++ b/core/java/android/hardware/display/WifiDisplayStatus.java
@@ -20,6 +20,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
/**
* Describes the current global state of Wifi display connectivity, including the
@@ -35,8 +37,7 @@ public final class WifiDisplayStatus implements Parcelable {
private final int mScanState;
private final int mActiveDisplayState;
private final WifiDisplay mActiveDisplay;
- private final WifiDisplay[] mAvailableDisplays;
- private final WifiDisplay[] mRememberedDisplays;
+ private final WifiDisplay[] mDisplays;
/** Feature state: Wifi display is not available on this device. */
public static final int FEATURE_STATE_UNAVAILABLE = 0;
@@ -70,18 +71,13 @@ public final class WifiDisplayStatus implements Parcelable {
activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
}
- WifiDisplay[] availableDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
- for (int i = 0; i < availableDisplays.length; i++) {
- availableDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
- }
-
- WifiDisplay[] rememberedDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
- for (int i = 0; i < rememberedDisplays.length; i++) {
- rememberedDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
+ WifiDisplay[] displays = WifiDisplay.CREATOR.newArray(in.readInt());
+ for (int i = 0; i < displays.length; i++) {
+ displays[i] = WifiDisplay.CREATOR.createFromParcel(in);
}
return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
- activeDisplay, availableDisplays, rememberedDisplays);
+ activeDisplay, displays);
}
public WifiDisplayStatus[] newArray(int size) {
@@ -91,25 +87,20 @@ public final class WifiDisplayStatus implements Parcelable {
public WifiDisplayStatus() {
this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
- null, WifiDisplay.EMPTY_ARRAY, WifiDisplay.EMPTY_ARRAY);
+ null, WifiDisplay.EMPTY_ARRAY);
}
public WifiDisplayStatus(int featureState, int scanState,
- int activeDisplayState, WifiDisplay activeDisplay,
- WifiDisplay[] availableDisplays, WifiDisplay[] rememberedDisplays) {
- if (availableDisplays == null) {
- throw new IllegalArgumentException("availableDisplays must not be null");
- }
- if (rememberedDisplays == null) {
- throw new IllegalArgumentException("rememberedDisplays must not be null");
+ int activeDisplayState, WifiDisplay activeDisplay, WifiDisplay[] displays) {
+ if (displays == null) {
+ throw new IllegalArgumentException("displays must not be null");
}
mFeatureState = featureState;
mScanState = scanState;
mActiveDisplayState = activeDisplayState;
mActiveDisplay = activeDisplay;
- mAvailableDisplays = availableDisplays;
- mRememberedDisplays = rememberedDisplays;
+ mDisplays = displays;
}
/**
@@ -152,24 +143,12 @@ public final class WifiDisplayStatus implements Parcelable {
}
/**
- * Gets the list of all available Wifi displays as reported by the most recent
- * scan, never null.
- * <p>
- * Some of these displays may already be remembered, others may be unknown.
- * </p>
- */
- public WifiDisplay[] getAvailableDisplays() {
- return mAvailableDisplays;
- }
-
- /**
- * Gets the list of all remembered Wifi displays, never null.
- * <p>
- * Not all remembered displays will necessarily be available.
- * </p>
+ * Gets the list of Wifi displays, returns a combined list of all available
+ * Wifi displays as reported by the most recent scan, and all remembered
+ * Wifi displays (not necessarily available at the time).
*/
- public WifiDisplay[] getRememberedDisplays() {
- return mRememberedDisplays;
+ public WifiDisplay[] getDisplays() {
+ return mDisplays;
}
@Override
@@ -185,13 +164,8 @@ public final class WifiDisplayStatus implements Parcelable {
dest.writeInt(0);
}
- dest.writeInt(mAvailableDisplays.length);
- for (WifiDisplay display : mAvailableDisplays) {
- display.writeToParcel(dest, flags);
- }
-
- dest.writeInt(mRememberedDisplays.length);
- for (WifiDisplay display : mRememberedDisplays) {
+ dest.writeInt(mDisplays.length);
+ for (WifiDisplay display : mDisplays) {
display.writeToParcel(dest, flags);
}
}
@@ -208,8 +182,7 @@ public final class WifiDisplayStatus implements Parcelable {
+ ", scanState=" + mScanState
+ ", activeDisplayState=" + mActiveDisplayState
+ ", activeDisplay=" + mActiveDisplay
- + ", availableDisplays=" + Arrays.toString(mAvailableDisplays)
- + ", rememberedDisplays=" + Arrays.toString(mRememberedDisplays)
+ + ", displays=" + Arrays.toString(mDisplays)
+ "}";
}
}
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d40eb64deb16..3e2d8d377fe6 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3970,6 +3970,9 @@
<!-- Status message for remote routes that are not available for connection right now -->
<string name="media_route_status_not_available">Not available</string>
+ <!-- Status message for a remote route that is in use (and thus unavailabe) right now -->
+ <string name="media_route_status_in_use">In use</string>
+
<!-- Display manager service -->
<!-- Name of the built-in display. [CHAR LIMIT=50] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index d33a6fa1d3be..5680ce436823 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -850,6 +850,7 @@
<java-symbol type="string" name="media_route_status_connecting" />
<java-symbol type="string" name="media_route_status_available" />
<java-symbol type="string" name="media_route_status_not_available" />
+ <java-symbol type="string" name="media_route_status_in_use" />
<java-symbol type="string" name="owner_name" />
<java-symbol type="string" name="config_chooseAccountActivity" />
<java-symbol type="string" name="config_chooseTypeAndAccountActivity" />
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index d653d9470585..420a19525410 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -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;
diff --git a/services/java/com/android/server/display/PersistentDataStore.java b/services/java/com/android/server/display/PersistentDataStore.java
index d5d71322f4a9..67b36958a35a 100644
--- a/services/java/com/android/server/display/PersistentDataStore.java
+++ b/services/java/com/android/server/display/PersistentDataStore.java
@@ -106,7 +106,7 @@ final class PersistentDataStore {
}
if (!Objects.equal(display.getDeviceAlias(), alias)) {
return new WifiDisplay(display.getDeviceAddress(), display.getDeviceName(),
- alias, display.canConnect());
+ alias, display.isAvailable(), display.canConnect(), display.isRemembered());
}
}
return display;
@@ -260,7 +260,8 @@ final class PersistentDataStore {
}
mRememberedWifiDisplays.add(
- new WifiDisplay(deviceAddress, deviceName, deviceAlias));
+ new WifiDisplay(deviceAddress, deviceName, deviceAlias,
+ false, false, false));
}
}
}
diff --git a/services/java/com/android/server/display/WifiDisplayAdapter.java b/services/java/com/android/server/display/WifiDisplayAdapter.java
index b655b3ad66fc..4c80cf5c9fef 100644
--- a/services/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/java/com/android/server/display/WifiDisplayAdapter.java
@@ -45,6 +45,8 @@ import android.view.SurfaceControl;
import java.io.PrintWriter;
import java.util.Arrays;
+import java.util.List;
+import java.util.ArrayList;
import libcore.util.Objects;
@@ -88,6 +90,7 @@ final class WifiDisplayAdapter extends DisplayAdapter {
private int mScanState;
private int mActiveDisplayState;
private WifiDisplay mActiveDisplay;
+ private WifiDisplay[] mDisplays = WifiDisplay.EMPTY_ARRAY;
private WifiDisplay[] mAvailableDisplays = WifiDisplay.EMPTY_ARRAY;
private WifiDisplay[] mRememberedDisplays = WifiDisplay.EMPTY_ARRAY;
@@ -116,6 +119,7 @@ final class WifiDisplayAdapter extends DisplayAdapter {
pw.println("mScanState=" + mScanState);
pw.println("mActiveDisplayState=" + mActiveDisplayState);
pw.println("mActiveDisplay=" + mActiveDisplay);
+ pw.println("mDisplays=" + Arrays.toString(mDisplays));
pw.println("mAvailableDisplays=" + Arrays.toString(mAvailableDisplays));
pw.println("mRememberedDisplays=" + Arrays.toString(mRememberedDisplays));
pw.println("mPendingStatusChangeBroadcast=" + mPendingStatusChangeBroadcast);
@@ -229,7 +233,8 @@ final class WifiDisplayAdapter extends DisplayAdapter {
WifiDisplay display = mPersistentDataStore.getRememberedWifiDisplay(address);
if (display != null && !Objects.equal(display.getDeviceAlias(), alias)) {
- display = new WifiDisplay(address, display.getDeviceName(), alias);
+ display = new WifiDisplay(address, display.getDeviceName(), alias,
+ false, false, false);
if (mPersistentDataStore.rememberWifiDisplay(display)) {
mPersistentDataStore.saveIfNeeded();
updateRememberedDisplaysLocked();
@@ -262,7 +267,7 @@ final class WifiDisplayAdapter extends DisplayAdapter {
if (mCurrentStatus == null) {
mCurrentStatus = new WifiDisplayStatus(
mFeatureState, mScanState, mActiveDisplayState,
- mActiveDisplay, mAvailableDisplays, mRememberedDisplays);
+ mActiveDisplay, mDisplays);
}
if (DEBUG) {
@@ -271,10 +276,36 @@ final class WifiDisplayAdapter extends DisplayAdapter {
return mCurrentStatus;
}
+ private void updateDisplaysLocked() {
+ List<WifiDisplay> displays = new ArrayList<WifiDisplay>(
+ mAvailableDisplays.length + mRememberedDisplays.length);
+ boolean[] remembered = new boolean[mAvailableDisplays.length];
+ for (WifiDisplay d : mRememberedDisplays) {
+ boolean available = false;
+ for (int i = 0; i < mAvailableDisplays.length; i++) {
+ if (d.equals(mAvailableDisplays[i])) {
+ remembered[i] = available = true;
+ break;
+ }
+ }
+ if (!available) {
+ displays.add(new WifiDisplay(d.getDeviceAddress(), d.getDeviceName(),
+ d.getDeviceAlias(), false, false, true));
+ }
+ }
+ for (int i = 0; i < mAvailableDisplays.length; i++) {
+ WifiDisplay d = mAvailableDisplays[i];
+ displays.add(new WifiDisplay(d.getDeviceAddress(), d.getDeviceName(),
+ d.getDeviceAlias(), true, d.canConnect(), remembered[i]));
+ }
+ mDisplays = displays.toArray(WifiDisplay.EMPTY_ARRAY);
+ }
+
private void updateRememberedDisplaysLocked() {
mRememberedDisplays = mPersistentDataStore.getRememberedWifiDisplays();
mActiveDisplay = mPersistentDataStore.applyWifiDisplayAlias(mActiveDisplay);
mAvailableDisplays = mPersistentDataStore.applyWifiDisplayAliases(mAvailableDisplays);
+ updateDisplaysLocked();
}
private void fixRememberedDisplayNamesFromAvailableDisplaysLocked() {
@@ -487,11 +518,18 @@ final class WifiDisplayAdapter extends DisplayAdapter {
availableDisplays = mPersistentDataStore.applyWifiDisplayAliases(
availableDisplays);
- if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING
- || !Arrays.equals(mAvailableDisplays, availableDisplays)) {
+ // check if any of the available displays changed canConnect status
+ boolean changed = !Arrays.equals(mAvailableDisplays, availableDisplays);
+ for (int i = 0; !changed && i<availableDisplays.length; i++) {
+ changed = availableDisplays[i].canConnect()
+ != mAvailableDisplays[i].canConnect();
+ }
+
+ if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING || changed) {
mScanState = WifiDisplayStatus.SCAN_STATE_NOT_SCANNING;
mAvailableDisplays = availableDisplays;
fixRememberedDisplayNamesFromAvailableDisplaysLocked();
+ updateDisplaysLocked();
scheduleStatusChangedBroadcastLocked();
}
}
diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java
index e595df400d59..f89917c32917 100644
--- a/services/java/com/android/server/display/WifiDisplayController.java
+++ b/services/java/com/android/server/display/WifiDisplayController.java
@@ -898,7 +898,7 @@ final class WifiDisplayController implements DumpUtils.Dump {
private static WifiDisplay createWifiDisplay(WifiP2pDevice device) {
return new WifiDisplay(device.deviceAddress, device.deviceName, null,
- device.wfdInfo.isSessionAvailable());
+ true, device.wfdInfo.isSessionAvailable(), false);
}
private final BroadcastReceiver mWifiP2pReceiver = new BroadcastReceiver() {