am bc18fe85: am fd1c028e: Merge "Handle hotplug events as described instead of rescanning"

# Via Gerrit Code Review (2) and Android Git Automerger (1)
* commit 'bc18fe851c98dbe6be4eb2655efb1ef95902d961':
  Handle hotplug events as described instead of rescanning
This commit is contained in:
Jesse Hall
2013-02-07 20:26:23 -08:00
committed by Android Git Automerger

View File

@@ -60,31 +60,38 @@ final class LocalDisplayAdapter extends DisplayAdapter {
super.registerLocked();
mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper());
scanDisplaysLocked();
for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
tryConnectDisplayLocked(builtInDisplayId);
}
}
private void scanDisplaysLocked() {
for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
IBinder displayToken = Surface.getBuiltInDisplay(builtInDisplayId);
if (displayToken != null && Surface.getDisplayInfo(displayToken, mTempPhys)) {
LocalDisplayDevice device = mDevices.get(builtInDisplayId);
if (device == null) {
// Display was added.
device = new LocalDisplayDevice(displayToken, builtInDisplayId, mTempPhys);
mDevices.put(builtInDisplayId, device);
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
} else if (device.updatePhysicalDisplayInfoLocked(mTempPhys)) {
// Display properties changed.
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
}
} else {
LocalDisplayDevice device = mDevices.get(builtInDisplayId);
if (device != null) {
// Display was removed.
mDevices.remove(builtInDisplayId);
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED);
}
private void tryConnectDisplayLocked(int builtInDisplayId) {
IBinder displayToken = Surface.getBuiltInDisplay(builtInDisplayId);
if (displayToken != null && Surface.getDisplayInfo(displayToken, mTempPhys)) {
LocalDisplayDevice device = mDevices.get(builtInDisplayId);
if (device == null) {
// Display was added.
device = new LocalDisplayDevice(displayToken, builtInDisplayId, mTempPhys);
mDevices.put(builtInDisplayId, device);
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
} else if (device.updatePhysicalDisplayInfoLocked(mTempPhys)) {
// Display properties changed.
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
}
} 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);
if (device != null) {
// Display was removed.
mDevices.remove(builtInDisplayId);
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED);
}
}
@@ -191,7 +198,11 @@ final class LocalDisplayAdapter extends DisplayAdapter {
@Override
public void onHotplug(long timestampNanos, int builtInDisplayId, boolean connected) {
synchronized (getSyncRoot()) {
scanDisplaysLocked();
if (connected) {
tryConnectDisplayLocked(builtInDisplayId);
} else {
tryDisconnectDisplayLocked(builtInDisplayId);
}
}
}
}