Merge "Handle hotplug events as described instead of rescanning"

This commit is contained in:
Jesse Hall
2013-02-08 01:29:03 +00:00
committed by Gerrit Code Review

View File

@@ -60,11 +60,13 @@ final class LocalDisplayAdapter extends DisplayAdapter {
super.registerLocked(); super.registerLocked();
mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper()); mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper());
scanDisplaysLocked();
for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
tryConnectDisplayLocked(builtInDisplayId);
}
} }
private void scanDisplaysLocked() { private void tryConnectDisplayLocked(int builtInDisplayId) {
for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
IBinder displayToken = Surface.getBuiltInDisplay(builtInDisplayId); IBinder displayToken = Surface.getBuiltInDisplay(builtInDisplayId);
if (displayToken != null && Surface.getDisplayInfo(displayToken, mTempPhys)) { if (displayToken != null && Surface.getDisplayInfo(displayToken, mTempPhys)) {
LocalDisplayDevice device = mDevices.get(builtInDisplayId); LocalDisplayDevice device = mDevices.get(builtInDisplayId);
@@ -78,6 +80,13 @@ final class LocalDisplayAdapter extends DisplayAdapter {
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED); sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
} }
} else { } else {
// The display is no longer available. Ignore the attempt to add it.
// If it was connected but has already been disconnected, we'll get a
// disconnect event that will remove it from mDevices.
}
}
private void tryDisconnectDisplayLocked(int builtInDisplayId) {
LocalDisplayDevice device = mDevices.get(builtInDisplayId); LocalDisplayDevice device = mDevices.get(builtInDisplayId);
if (device != null) { if (device != null) {
// Display was removed. // Display was removed.
@@ -85,8 +94,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED); sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED);
} }
} }
}
}
private final class LocalDisplayDevice extends DisplayDevice { private final class LocalDisplayDevice extends DisplayDevice {
private final int mBuiltInDisplayId; private final int mBuiltInDisplayId;
@@ -191,7 +198,11 @@ final class LocalDisplayAdapter extends DisplayAdapter {
@Override @Override
public void onHotplug(long timestampNanos, int builtInDisplayId, boolean connected) { public void onHotplug(long timestampNanos, int builtInDisplayId, boolean connected) {
synchronized (getSyncRoot()) { synchronized (getSyncRoot()) {
scanDisplaysLocked(); if (connected) {
tryConnectDisplayLocked(builtInDisplayId);
} else {
tryDisconnectDisplayLocked(builtInDisplayId);
}
} }
} }
} }