Skip to content

Commit 180bbc7

Browse files
author
Jeff Brown
committed
Improve Wifi display discovery API.
Change-Id: I4d46503e5413f52da16f79bbc9c631cc5ae9c178
1 parent 8e81013 commit 180bbc7

File tree

3 files changed

+87
-62
lines changed

3 files changed

+87
-62
lines changed

core/java/android/hardware/display/WifiDisplayStatus.java

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -32,30 +32,36 @@
3232
*/
3333
public final class WifiDisplayStatus implements Parcelable {
3434
private final boolean mEnabled;
35-
private final WifiDisplay mConnectedDisplay;
35+
private final int mScanState;
36+
private final int mActiveDisplayState;
37+
private final WifiDisplay mActiveDisplay;
3638
private final WifiDisplay[] mKnownDisplays;
37-
private final boolean mScanInProgress;
38-
private final boolean mConnectionInProgress;
39+
40+
public static final int SCAN_STATE_NOT_SCANNING = 0;
41+
public static final int SCAN_STATE_SCANNING = 1;
42+
43+
public static final int DISPLAY_STATE_NOT_CONNECTED = 0;
44+
public static final int DISPLAY_STATE_CONNECTING = 1;
45+
public static final int DISPLAY_STATE_CONNECTED = 2;
3946

4047
public static final Creator<WifiDisplayStatus> CREATOR = new Creator<WifiDisplayStatus>() {
4148
public WifiDisplayStatus createFromParcel(Parcel in) {
4249
boolean enabled = (in.readInt() != 0);
50+
int scanState = in.readInt();
51+
int activeDisplayState= in.readInt();
4352

44-
WifiDisplay connectedDisplay = null;
53+
WifiDisplay activeDisplay = null;
4554
if (in.readInt() != 0) {
46-
connectedDisplay = WifiDisplay.CREATOR.createFromParcel(in);
55+
activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
4756
}
4857

4958
WifiDisplay[] knownDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
5059
for (int i = 0; i < knownDisplays.length; i++) {
5160
knownDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
5261
}
5362

54-
boolean scanInProgress = (in.readInt() != 0);
55-
boolean connectionInProgress = (in.readInt() != 0);
56-
57-
return new WifiDisplayStatus(enabled, connectedDisplay, knownDisplays,
58-
scanInProgress, connectionInProgress);
63+
return new WifiDisplayStatus(enabled, scanState, activeDisplayState,
64+
activeDisplay, knownDisplays);
5965
}
6066

6167
public WifiDisplayStatus[] newArray(int size) {
@@ -64,21 +70,21 @@ public WifiDisplayStatus[] newArray(int size) {
6470
};
6571

6672
public WifiDisplayStatus() {
67-
this(false, null, WifiDisplay.EMPTY_ARRAY, false, false);
73+
this(false, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
74+
null, WifiDisplay.EMPTY_ARRAY);
6875
}
6976

70-
public WifiDisplayStatus(boolean enabled,
71-
WifiDisplay connectedDisplay, WifiDisplay[] knownDisplays,
72-
boolean scanInProgress, boolean connectionInProgress) {
77+
public WifiDisplayStatus(boolean enabled, int scanState, int activeDisplayState,
78+
WifiDisplay activeDisplay, WifiDisplay[] knownDisplays) {
7379
if (knownDisplays == null) {
7480
throw new IllegalArgumentException("knownDisplays must not be null");
7581
}
7682

7783
mEnabled = enabled;
78-
mConnectedDisplay = connectedDisplay;
84+
mScanState = scanState;
85+
mActiveDisplayState = activeDisplayState;
86+
mActiveDisplay = activeDisplay;
7987
mKnownDisplays = knownDisplays;
80-
mScanInProgress = scanInProgress;
81-
mConnectionInProgress = connectionInProgress;
8288
}
8389

8490
/**
@@ -94,40 +100,48 @@ public boolean isEnabled() {
94100
}
95101

96102
/**
97-
* Gets the currently connected Wifi display or null if none.
103+
* Returns the current state of the Wifi display scan.
104+
*
105+
* @return One of: {@link #SCAN_STATE_NOT_SCANNING} or {@link #SCAN_STATE_SCANNING}.
98106
*/
99-
public WifiDisplay getConnectedDisplay() {
100-
return mConnectedDisplay;
107+
public int getScanState() {
108+
return mScanState;
101109
}
102110

103111
/**
104-
* Gets the list of all known Wifi displays, never null.
112+
* Get the state of the currently active display.
113+
*
114+
* @return One of: {@link #DISPLAY_STATE_NOT_CONNECTED}, {@link #DISPLAY_STATE_CONNECTING},
115+
* or {@link #DISPLAY_STATE_CONNECTED}.
105116
*/
106-
public WifiDisplay[] getKnownDisplays() {
107-
return mKnownDisplays;
117+
public int getActiveDisplayState() {
118+
return mActiveDisplayState;
108119
}
109120

110121
/**
111-
* Returns true if there is currently a Wifi display scan in progress.
122+
* Gets the Wifi display that is currently active. It may be connecting or
123+
* connected.
112124
*/
113-
public boolean isScanInProgress() {
114-
return mScanInProgress;
125+
public WifiDisplay getActiveDisplay() {
126+
return mActiveDisplay;
115127
}
116128

117129
/**
118-
* Returns true if there is currently a Wifi display connection in progress.
130+
* Gets the list of all known Wifi displays, never null.
119131
*/
120-
public boolean isConnectionInProgress() {
121-
return mConnectionInProgress;
132+
public WifiDisplay[] getKnownDisplays() {
133+
return mKnownDisplays;
122134
}
123135

124136
@Override
125137
public void writeToParcel(Parcel dest, int flags) {
126138
dest.writeInt(mEnabled ? 1 : 0);
139+
dest.writeInt(mScanState);
140+
dest.writeInt(mActiveDisplayState);
127141

128-
if (mConnectedDisplay != null) {
142+
if (mActiveDisplay != null) {
129143
dest.writeInt(1);
130-
mConnectedDisplay.writeToParcel(dest, flags);
144+
mActiveDisplay.writeToParcel(dest, flags);
131145
} else {
132146
dest.writeInt(0);
133147
}
@@ -136,9 +150,6 @@ public void writeToParcel(Parcel dest, int flags) {
136150
for (WifiDisplay display : mKnownDisplays) {
137151
display.writeToParcel(dest, flags);
138152
}
139-
140-
dest.writeInt(mScanInProgress ? 1 : 0);
141-
dest.writeInt(mConnectionInProgress ? 1 : 0);
142153
}
143154

144155
@Override
@@ -150,10 +161,10 @@ public int describeContents() {
150161
@Override
151162
public String toString() {
152163
return "WifiDisplayStatus{enabled=" + mEnabled
153-
+ ", connectedDisplay=" + mConnectedDisplay
164+
+ ", scanState=" + mScanState
165+
+ ", activeDisplayState=" + mActiveDisplayState
166+
+ ", activeDisplay=" + mActiveDisplay
154167
+ ", knownDisplays=" + Arrays.toString(mKnownDisplays)
155-
+ ", scanInProgress=" + mScanInProgress
156-
+ ", connectionInProgress=" + mConnectionInProgress
157168
+ "}";
158169
}
159170
}

services/java/com/android/server/display/WifiDisplayAdapter.java

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ final class WifiDisplayAdapter extends DisplayAdapter {
5555

5656
private WifiDisplayStatus mCurrentStatus;
5757
private boolean mEnabled;
58-
private WifiDisplay mConnectedDisplay;
58+
private int mScanState;
59+
private int mActiveDisplayState;
60+
private WifiDisplay mActiveDisplay;
5961
private WifiDisplay[] mKnownDisplays = WifiDisplay.EMPTY_ARRAY;
60-
private boolean mScanInProgress;
61-
private boolean mConnectionInProgress;
6262

6363
private boolean mPendingStatusChangeBroadcast;
6464

@@ -80,10 +80,10 @@ public void dumpLocked(PrintWriter pw) {
8080

8181
pw.println("mCurrentStatus=" + getWifiDisplayStatusLocked());
8282
pw.println("mEnabled=" + mEnabled);
83-
pw.println("mConnectedDisplay=" + mConnectedDisplay);
83+
pw.println("mScanState=" + mScanState);
84+
pw.println("mActiveDisplayState=" + mActiveDisplayState);
85+
pw.println("mActiveDisplay=" + mActiveDisplay);
8486
pw.println("mKnownDisplays=" + Arrays.toString(mKnownDisplays));
85-
pw.println("mScanInProgress=" + mScanInProgress);
86-
pw.println("mConnectionInProgress=" + mConnectionInProgress);
8787
pw.println("mPendingStatusChangeBroadcast=" + mPendingStatusChangeBroadcast);
8888

8989
// Try to dump the controller state.
@@ -145,9 +145,8 @@ public void run() {
145145

146146
public WifiDisplayStatus getWifiDisplayStatusLocked() {
147147
if (mCurrentStatus == null) {
148-
mCurrentStatus = new WifiDisplayStatus(mEnabled,
149-
mConnectedDisplay, mKnownDisplays,
150-
mScanInProgress, mConnectionInProgress);
148+
mCurrentStatus = new WifiDisplayStatus(mEnabled, mScanState, mActiveDisplayState,
149+
mActiveDisplay, mKnownDisplays);
151150
}
152151
return mCurrentStatus;
153152
}
@@ -211,20 +210,21 @@ public void onEnablementChanged(boolean enabled) {
211210
@Override
212211
public void onScanStarted() {
213212
synchronized (getSyncRoot()) {
214-
if (!mScanInProgress) {
213+
if (mScanState != WifiDisplayStatus.SCAN_STATE_SCANNING) {
215214
mCurrentStatus = null;
216-
mScanInProgress = true;
215+
mScanState = WifiDisplayStatus.SCAN_STATE_SCANNING;
217216
scheduleStatusChangedBroadcastLocked();
218217
}
219218
}
220219
}
221220

222221
public void onScanFinished(WifiDisplay[] knownDisplays) {
223222
synchronized (getSyncRoot()) {
224-
if (!Arrays.equals(mKnownDisplays, knownDisplays) || mScanInProgress) {
223+
if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING
224+
|| !Arrays.equals(mKnownDisplays, knownDisplays)) {
225225
mCurrentStatus = null;
226+
mScanState = WifiDisplayStatus.SCAN_STATE_NOT_SCANNING;
226227
mKnownDisplays = knownDisplays;
227-
mScanInProgress = false;
228228
scheduleStatusChangedBroadcastLocked();
229229
}
230230
}
@@ -233,9 +233,12 @@ public void onScanFinished(WifiDisplay[] knownDisplays) {
233233
@Override
234234
public void onDisplayConnecting(WifiDisplay display) {
235235
synchronized (getSyncRoot()) {
236-
if (!mConnectionInProgress) {
236+
if (mActiveDisplayState != WifiDisplayStatus.DISPLAY_STATE_CONNECTING
237+
|| mActiveDisplay == null
238+
|| !mActiveDisplay.equals(display)) {
237239
mCurrentStatus = null;
238-
mConnectionInProgress = true;
240+
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_CONNECTING;
241+
mActiveDisplay = display;
239242
scheduleStatusChangedBroadcastLocked();
240243
}
241244
}
@@ -244,9 +247,11 @@ public void onDisplayConnecting(WifiDisplay display) {
244247
@Override
245248
public void onDisplayConnectionFailed() {
246249
synchronized (getSyncRoot()) {
247-
if (mConnectionInProgress) {
250+
if (mActiveDisplayState != WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED
251+
|| mActiveDisplay != null) {
248252
mCurrentStatus = null;
249-
mConnectionInProgress = false;
253+
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED;
254+
mActiveDisplay = null;
250255
scheduleStatusChangedBroadcastLocked();
251256
}
252257
}
@@ -257,11 +262,12 @@ public void onDisplayConnected(WifiDisplay display, String iface) {
257262
synchronized (getSyncRoot()) {
258263
handleConnectLocked(display, iface);
259264

260-
if (mConnectedDisplay == null || !mConnectedDisplay.equals(display)
261-
|| mConnectionInProgress) {
265+
if (mActiveDisplayState != WifiDisplayStatus.DISPLAY_STATE_CONNECTED
266+
|| mActiveDisplay == null
267+
|| !mActiveDisplay.equals(display)) {
262268
mCurrentStatus = null;
263-
mConnectedDisplay = display;
264-
mConnectionInProgress = false;
269+
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_CONNECTED;
270+
mActiveDisplay = display;
265271
scheduleStatusChangedBroadcastLocked();
266272
}
267273
}
@@ -273,10 +279,11 @@ public void onDisplayDisconnected() {
273279
synchronized (getSyncRoot()) {
274280
handleDisconnectLocked();
275281

276-
if (mConnectedDisplay != null || mConnectionInProgress) {
282+
if (mActiveDisplayState != WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED
283+
|| mActiveDisplay != null) {
277284
mCurrentStatus = null;
278-
mConnectedDisplay = null;
279-
mConnectionInProgress = false;
285+
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED;
286+
mActiveDisplay = null;
280287
scheduleStatusChangedBroadcastLocked();
281288
}
282289
}

services/java/com/android/server/display/WifiDisplayController.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ private void handlePeersChanged() {
536536

537537
private void handleConnectionChanged(NetworkInfo networkInfo) {
538538
mNetworkInfo = networkInfo;
539-
if (mWifiP2pEnabled && mWfdEnabled && networkInfo.isConnected()) {
539+
if (mWfdEnabled && networkInfo.isConnected()) {
540540
if (mDesiredDevice != null) {
541541
mWifiP2pManager.requestGroupInfo(mWifiP2pChannel, new GroupInfoListener() {
542542
@Override
@@ -573,6 +573,13 @@ public void onGroupInfoAvailable(WifiP2pGroup info) {
573573
}
574574
} else {
575575
disconnect();
576+
577+
// After disconnection for a group, for some reason we have a tendency
578+
// to get a peer change notification with an empty list of peers.
579+
// Perform a fresh scan.
580+
if (mWfdEnabled) {
581+
requestPeers();
582+
}
576583
}
577584
}
578585

0 commit comments

Comments
 (0)