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

# Via Gerrit Code Review
* commit 'fd1c028e34fc559ccccebd18979ee85ec7821dea':
  Handle hotplug events as described instead of rescanning
diff --git a/services/java/com/android/server/display/LocalDisplayAdapter.java b/services/java/com/android/server/display/LocalDisplayAdapter.java
index b37d57f..ee2d617 100644
--- a/services/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/java/com/android/server/display/LocalDisplayAdapter.java
@@ -60,31 +60,38 @@
         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 @@
         @Override
         public void onHotplug(long timestampNanos, int builtInDisplayId, boolean connected) {
             synchronized (getSyncRoot()) {
-                scanDisplaysLocked();
+                if (connected) {
+                    tryConnectDisplayLocked(builtInDisplayId);
+                } else {
+                    tryDisconnectDisplayLocked(builtInDisplayId);
+                }
             }
         }
     }