summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/display/WifiDisplayController.java
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2012-09-19 23:09:23 -0700
committerJeff Brown <jeffbrown@google.com>2012-09-19 23:15:26 -0700
commitc2b9ea624148df80945afad4198fe686a0ab8dca (patch)
treefd40acceee2db87b73766fb6d4ade3177826421d /services/java/com/android/server/display/WifiDisplayController.java
parent89d5546d7fd3a3bb19820c42e8b4527013dd6545 (diff)
Make wifi display state changes more robust.
Bug: 7178216 Change-Id: Icceaeb61730b0b4916cdda44459f4c69553e303c
Diffstat (limited to 'services/java/com/android/server/display/WifiDisplayController.java')
-rw-r--r--services/java/com/android/server/display/WifiDisplayController.java103
1 files changed, 66 insertions, 37 deletions
diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java
index fd0fcc5545b8..84f4e833ccc2 100644
--- a/services/java/com/android/server/display/WifiDisplayController.java
+++ b/services/java/com/android/server/display/WifiDisplayController.java
@@ -53,6 +53,8 @@ import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
+import libcore.util.Objects;
+
/**
* Manages all of the various asynchronous interactions with the {@link WifiP2pManager}
* on behalf of {@link WifiDisplayAdapter}.
@@ -140,6 +142,13 @@ final class WifiDisplayController implements DumpUtils.Dump {
// True if the remote submix is enabled.
private boolean mRemoteSubmixOn;
+ // The information we have most recently told WifiDisplayAdapter about.
+ private WifiDisplay mAdvertisedDisplay;
+ private Surface mAdvertisedDisplaySurface;
+ private int mAdvertisedDisplayWidth;
+ private int mAdvertisedDisplayHeight;
+ private int mAdvertisedDisplayFlags;
+
public WifiDisplayController(Context context, Handler handler, Listener listener) {
mContext = context;
mHandler = handler;
@@ -193,6 +202,11 @@ final class WifiDisplayController implements DumpUtils.Dump {
pw.println("mRemoteDisplayInterface=" + mRemoteDisplayInterface);
pw.println("mRemoteDisplayConnected=" + mRemoteDisplayConnected);
pw.println("mRemoteSubmixOn=" + mRemoteSubmixOn);
+ pw.println("mAdvertisedDisplay=" + mAdvertisedDisplay);
+ pw.println("mAdvertisedDisplaySurface=" + mAdvertisedDisplaySurface);
+ pw.println("mAdvertisedDisplayWidth=" + mAdvertisedDisplayWidth);
+ pw.println("mAdvertisedDisplayHeight=" + mAdvertisedDisplayHeight);
+ pw.println("mAdvertisedDisplayFlags=" + mAdvertisedDisplayFlags);
pw.println("mAvailableWifiDisplayPeers: size=" + mAvailableWifiDisplayPeers.size());
for (WifiP2pDevice device : mAvailableWifiDisplayPeers) {
@@ -439,13 +453,7 @@ final class WifiDisplayController implements DumpUtils.Dump {
mHandler.removeCallbacks(mRtspTimeout);
setRemoteSubmixOn(false);
-
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onDisplayDisconnected();
- }
- });
+ unadvertiseDisplay();
// continue to next step
}
@@ -454,6 +462,8 @@ final class WifiDisplayController implements DumpUtils.Dump {
if (mConnectedDevice != null && mConnectedDevice != mDesiredDevice) {
Slog.i(TAG, "Disconnecting from Wifi display: " + mConnectedDevice.deviceName);
+ unadvertiseDisplay();
+
final WifiP2pDevice oldDevice = mConnectedDevice;
mWifiP2pManager.removeGroup(mWifiP2pChannel, new ActionListener() {
@Override
@@ -484,6 +494,7 @@ final class WifiDisplayController implements DumpUtils.Dump {
if (mConnectingDevice != null && mConnectingDevice != mDesiredDevice) {
Slog.i(TAG, "Canceling connection to Wifi display: " + mConnectingDevice.deviceName);
+ unadvertiseDisplay();
mHandler.removeCallbacks(mConnectionTimeout);
final WifiP2pDevice oldDevice = mConnectingDevice;
@@ -513,6 +524,7 @@ final class WifiDisplayController implements DumpUtils.Dump {
// Step 4. If we wanted to disconnect, then mission accomplished.
if (mDesiredDevice == null) {
+ unadvertiseDisplay();
return; // done
}
@@ -526,13 +538,8 @@ final class WifiDisplayController implements DumpUtils.Dump {
// Helps with STA & P2P concurrency
config.groupOwnerIntent = WifiP2pConfig.MAX_GROUP_OWNER_INTENT;
- final WifiDisplay display = createWifiDisplay(mConnectingDevice);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onDisplayConnecting(display);
- }
- });
+ WifiDisplay display = createWifiDisplay(mConnectingDevice);
+ advertiseDisplay(display, null, 0, 0, 0);
final WifiP2pDevice newDevice = mDesiredDevice;
mWifiP2pManager.connect(mWifiP2pChannel, config, new ActionListener() {
@@ -551,13 +558,6 @@ final class WifiDisplayController implements DumpUtils.Dump {
if (mConnectingDevice == newDevice) {
Slog.i(TAG, "Failed to initiate connection to Wifi display: "
+ newDevice.deviceName + ", reason=" + reason);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onDisplayDisconnected();
- }
- });
-
mConnectingDevice = null;
handleConnectionFailure(false);
}
@@ -588,8 +588,8 @@ final class WifiDisplayController implements DumpUtils.Dump {
mRemoteDisplay = RemoteDisplay.listen(iface, new RemoteDisplay.Listener() {
@Override
- public void onDisplayConnected(final Surface surface,
- final int width, final int height, final int flags) {
+ public void onDisplayConnected(Surface surface,
+ int width, int height, int flags) {
if (mConnectedDevice == oldDevice && !mRemoteDisplayConnected) {
Slog.i(TAG, "Opened RTSP connection with Wifi display: "
+ mConnectedDevice.deviceName);
@@ -597,13 +597,7 @@ final class WifiDisplayController implements DumpUtils.Dump {
mHandler.removeCallbacks(mRtspTimeout);
final WifiDisplay display = createWifiDisplay(mConnectedDevice);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onDisplayConnected(display,
- surface, width, height, flags);
- }
- });
+ advertiseDisplay(display, surface, width, height, flags);
}
}
@@ -728,13 +722,6 @@ final class WifiDisplayController implements DumpUtils.Dump {
private void handleConnectionFailure(boolean timeoutOccurred) {
Slog.i(TAG, "Wifi display connection failed!");
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mListener.onDisplayConnectionFailed();
- }
- });
-
if (mDesiredDevice != null) {
if (mConnectionRetriesLeft > 0) {
final WifiP2pDevice oldDevice = mDesiredDevice;
@@ -755,6 +742,48 @@ final class WifiDisplayController implements DumpUtils.Dump {
}
}
+ private void advertiseDisplay(final WifiDisplay display,
+ final Surface surface, final int width, final int height, final int flags) {
+ if (!Objects.equal(mAdvertisedDisplay, display)
+ || mAdvertisedDisplaySurface != surface
+ || mAdvertisedDisplayWidth != width
+ || mAdvertisedDisplayHeight != height
+ || mAdvertisedDisplayFlags != flags) {
+ final WifiDisplay oldDisplay = mAdvertisedDisplay;
+ final Surface oldSurface = mAdvertisedDisplaySurface;
+
+ mAdvertisedDisplay = display;
+ mAdvertisedDisplaySurface = surface;
+ mAdvertisedDisplayWidth = width;
+ mAdvertisedDisplayHeight = height;
+ mAdvertisedDisplayFlags = flags;
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (oldSurface != null && surface != oldSurface) {
+ mListener.onDisplayDisconnected();
+ } else if (oldDisplay != null && !Objects.equal(display, oldDisplay)) {
+ mListener.onDisplayConnectionFailed();
+ }
+
+ if (display != null) {
+ if (!Objects.equal(display, oldDisplay)) {
+ mListener.onDisplayConnecting(display);
+ }
+ if (surface != null && surface != oldSurface) {
+ mListener.onDisplayConnected(display, surface, width, height, flags);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ private void unadvertiseDisplay() {
+ advertiseDisplay(null, null, 0, 0, 0);
+ }
+
private static Inet4Address getInterfaceAddress(WifiP2pGroup info) {
NetworkInterface iface;
try {