Skip to content

Commit f803ff4

Browse files
Jeff BrownAndroid (Google) Code Review
authored andcommitted
Merge "Make wifi display state changes more robust." into jb-mr1-dev
2 parents e02acec + c2b9ea6 commit f803ff4

File tree

2 files changed

+71
-38
lines changed

2 files changed

+71
-38
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,13 @@ public WifiDisplay applyWifiDisplayAlias(WifiDisplay display) {
9090
if (display != null) {
9191
loadIfNeeded();
9292

93+
String alias = null;
9394
int index = findRememberedWifiDisplay(display.getDeviceAddress());
9495
if (index >= 0) {
95-
return mRememberedWifiDisplays.get(index);
96+
alias = mRememberedWifiDisplays.get(index).getDeviceAlias();
97+
}
98+
if (!Objects.equal(display.getDeviceAlias(), alias)) {
99+
return new WifiDisplay(display.getDeviceAddress(), display.getDeviceName(), alias);
96100
}
97101
}
98102
return display;

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

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
import java.util.ArrayList;
5454
import java.util.Enumeration;
5555

56+
import libcore.util.Objects;
57+
5658
/**
5759
* Manages all of the various asynchronous interactions with the {@link WifiP2pManager}
5860
* on behalf of {@link WifiDisplayAdapter}.
@@ -140,6 +142,13 @@ final class WifiDisplayController implements DumpUtils.Dump {
140142
// True if the remote submix is enabled.
141143
private boolean mRemoteSubmixOn;
142144

145+
// The information we have most recently told WifiDisplayAdapter about.
146+
private WifiDisplay mAdvertisedDisplay;
147+
private Surface mAdvertisedDisplaySurface;
148+
private int mAdvertisedDisplayWidth;
149+
private int mAdvertisedDisplayHeight;
150+
private int mAdvertisedDisplayFlags;
151+
143152
public WifiDisplayController(Context context, Handler handler, Listener listener) {
144153
mContext = context;
145154
mHandler = handler;
@@ -193,6 +202,11 @@ public void dump(PrintWriter pw) {
193202
pw.println("mRemoteDisplayInterface=" + mRemoteDisplayInterface);
194203
pw.println("mRemoteDisplayConnected=" + mRemoteDisplayConnected);
195204
pw.println("mRemoteSubmixOn=" + mRemoteSubmixOn);
205+
pw.println("mAdvertisedDisplay=" + mAdvertisedDisplay);
206+
pw.println("mAdvertisedDisplaySurface=" + mAdvertisedDisplaySurface);
207+
pw.println("mAdvertisedDisplayWidth=" + mAdvertisedDisplayWidth);
208+
pw.println("mAdvertisedDisplayHeight=" + mAdvertisedDisplayHeight);
209+
pw.println("mAdvertisedDisplayFlags=" + mAdvertisedDisplayFlags);
196210

197211
pw.println("mAvailableWifiDisplayPeers: size=" + mAvailableWifiDisplayPeers.size());
198212
for (WifiP2pDevice device : mAvailableWifiDisplayPeers) {
@@ -439,13 +453,7 @@ private void updateConnection() {
439453
mHandler.removeCallbacks(mRtspTimeout);
440454

441455
setRemoteSubmixOn(false);
442-
443-
mHandler.post(new Runnable() {
444-
@Override
445-
public void run() {
446-
mListener.onDisplayDisconnected();
447-
}
448-
});
456+
unadvertiseDisplay();
449457

450458
// continue to next step
451459
}
@@ -454,6 +462,8 @@ public void run() {
454462
if (mConnectedDevice != null && mConnectedDevice != mDesiredDevice) {
455463
Slog.i(TAG, "Disconnecting from Wifi display: " + mConnectedDevice.deviceName);
456464

465+
unadvertiseDisplay();
466+
457467
final WifiP2pDevice oldDevice = mConnectedDevice;
458468
mWifiP2pManager.removeGroup(mWifiP2pChannel, new ActionListener() {
459469
@Override
@@ -484,6 +494,7 @@ private void next() {
484494
if (mConnectingDevice != null && mConnectingDevice != mDesiredDevice) {
485495
Slog.i(TAG, "Canceling connection to Wifi display: " + mConnectingDevice.deviceName);
486496

497+
unadvertiseDisplay();
487498
mHandler.removeCallbacks(mConnectionTimeout);
488499

489500
final WifiP2pDevice oldDevice = mConnectingDevice;
@@ -513,6 +524,7 @@ private void next() {
513524

514525
// Step 4. If we wanted to disconnect, then mission accomplished.
515526
if (mDesiredDevice == null) {
527+
unadvertiseDisplay();
516528
return; // done
517529
}
518530

@@ -526,13 +538,8 @@ private void next() {
526538
// Helps with STA & P2P concurrency
527539
config.groupOwnerIntent = WifiP2pConfig.MAX_GROUP_OWNER_INTENT;
528540

529-
final WifiDisplay display = createWifiDisplay(mConnectingDevice);
530-
mHandler.post(new Runnable() {
531-
@Override
532-
public void run() {
533-
mListener.onDisplayConnecting(display);
534-
}
535-
});
541+
WifiDisplay display = createWifiDisplay(mConnectingDevice);
542+
advertiseDisplay(display, null, 0, 0, 0);
536543

537544
final WifiP2pDevice newDevice = mDesiredDevice;
538545
mWifiP2pManager.connect(mWifiP2pChannel, config, new ActionListener() {
@@ -551,13 +558,6 @@ public void onFailure(int reason) {
551558
if (mConnectingDevice == newDevice) {
552559
Slog.i(TAG, "Failed to initiate connection to Wifi display: "
553560
+ newDevice.deviceName + ", reason=" + reason);
554-
mHandler.post(new Runnable() {
555-
@Override
556-
public void run() {
557-
mListener.onDisplayDisconnected();
558-
}
559-
});
560-
561561
mConnectingDevice = null;
562562
handleConnectionFailure(false);
563563
}
@@ -588,22 +588,16 @@ public void run() {
588588

589589
mRemoteDisplay = RemoteDisplay.listen(iface, new RemoteDisplay.Listener() {
590590
@Override
591-
public void onDisplayConnected(final Surface surface,
592-
final int width, final int height, final int flags) {
591+
public void onDisplayConnected(Surface surface,
592+
int width, int height, int flags) {
593593
if (mConnectedDevice == oldDevice && !mRemoteDisplayConnected) {
594594
Slog.i(TAG, "Opened RTSP connection with Wifi display: "
595595
+ mConnectedDevice.deviceName);
596596
mRemoteDisplayConnected = true;
597597
mHandler.removeCallbacks(mRtspTimeout);
598598

599599
final WifiDisplay display = createWifiDisplay(mConnectedDevice);
600-
mHandler.post(new Runnable() {
601-
@Override
602-
public void run() {
603-
mListener.onDisplayConnected(display,
604-
surface, width, height, flags);
605-
}
606-
});
600+
advertiseDisplay(display, surface, width, height, flags);
607601
}
608602
}
609603

@@ -728,13 +722,6 @@ public void run() {
728722
private void handleConnectionFailure(boolean timeoutOccurred) {
729723
Slog.i(TAG, "Wifi display connection failed!");
730724

731-
mHandler.post(new Runnable() {
732-
@Override
733-
public void run() {
734-
mListener.onDisplayConnectionFailed();
735-
}
736-
});
737-
738725
if (mDesiredDevice != null) {
739726
if (mConnectionRetriesLeft > 0) {
740727
final WifiP2pDevice oldDevice = mDesiredDevice;
@@ -755,6 +742,48 @@ public void run() {
755742
}
756743
}
757744

745+
private void advertiseDisplay(final WifiDisplay display,
746+
final Surface surface, final int width, final int height, final int flags) {
747+
if (!Objects.equal(mAdvertisedDisplay, display)
748+
|| mAdvertisedDisplaySurface != surface
749+
|| mAdvertisedDisplayWidth != width
750+
|| mAdvertisedDisplayHeight != height
751+
|| mAdvertisedDisplayFlags != flags) {
752+
final WifiDisplay oldDisplay = mAdvertisedDisplay;
753+
final Surface oldSurface = mAdvertisedDisplaySurface;
754+
755+
mAdvertisedDisplay = display;
756+
mAdvertisedDisplaySurface = surface;
757+
mAdvertisedDisplayWidth = width;
758+
mAdvertisedDisplayHeight = height;
759+
mAdvertisedDisplayFlags = flags;
760+
761+
mHandler.post(new Runnable() {
762+
@Override
763+
public void run() {
764+
if (oldSurface != null && surface != oldSurface) {
765+
mListener.onDisplayDisconnected();
766+
} else if (oldDisplay != null && !Objects.equal(display, oldDisplay)) {
767+
mListener.onDisplayConnectionFailed();
768+
}
769+
770+
if (display != null) {
771+
if (!Objects.equal(display, oldDisplay)) {
772+
mListener.onDisplayConnecting(display);
773+
}
774+
if (surface != null && surface != oldSurface) {
775+
mListener.onDisplayConnected(display, surface, width, height, flags);
776+
}
777+
}
778+
}
779+
});
780+
}
781+
}
782+
783+
private void unadvertiseDisplay() {
784+
advertiseDisplay(null, null, 0, 0, 0);
785+
}
786+
758787
private static Inet4Address getInterfaceAddress(WifiP2pGroup info) {
759788
NetworkInterface iface;
760789
try {

0 commit comments

Comments
 (0)