Merge "Only create DPCs for LocalDisplays & FLAG_OWN_DISPLAY_GROUP" into sc-dev
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index f8a913a..c010906 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1134,8 +1134,13 @@
             recordStableDisplayStatsIfNeededLocked(display);
             recordTopInsetLocked(display);
         }
-        addDisplayPowerControllerLocked(display);
-        mDisplayStates.append(displayId, Display.STATE_UNKNOWN);
+        final int groupId = mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(displayId);
+        if (groupId != Display.INVALID_DISPLAY_GROUP) {
+            addDisplayPowerControllerLocked(display);
+            mDisplayStates.append(displayId, Display.STATE_UNKNOWN);
+        } else {
+            mDisplayStates.append(displayId, Display.STATE_ON);
+        }
         mDisplayBrightnesses.append(displayId, display.getDisplayInfoLocked().brightnessDefault);
 
         DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
@@ -1214,8 +1219,7 @@
             final int displayId = display.getDisplayIdLocked();
             final int state = mDisplayStates.get(displayId);
 
-            // Only send a request for display state if the display state has already been
-            // initialized by DisplayPowercontroller.
+            // Only send a request for display state if display state has already been initialized.
             if (state != Display.STATE_UNKNOWN) {
                 final float brightness = mDisplayBrightnesses.get(displayId);
                 return device.requestDisplayStateLocked(state, brightness);
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index fcfa674..6c2e6eb 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -433,31 +433,37 @@
         final int displayId = display.getDisplayIdLocked();
 
         // Get current display group data
-        int groupId = getDisplayGroupIdFromDisplayIdLocked(displayId);
+        final int groupId = getDisplayGroupIdFromDisplayIdLocked(displayId);
         final DisplayGroup oldGroup = getDisplayGroupLocked(groupId);
 
         // Get the new display group if a change is needed
         final DisplayInfo info = display.getDisplayInfoLocked();
         final boolean needsOwnDisplayGroup = (info.flags & Display.FLAG_OWN_DISPLAY_GROUP) != 0;
         final boolean hasOwnDisplayGroup = groupId != Display.DEFAULT_DISPLAY_GROUP;
-        if (groupId == Display.INVALID_DISPLAY_GROUP
-                || hasOwnDisplayGroup != needsOwnDisplayGroup) {
-            groupId = assignDisplayGroupIdLocked(needsOwnDisplayGroup);
-        }
-
-        // Create a new group if needed
-        DisplayGroup newGroup = getDisplayGroupLocked(groupId);
-        if (newGroup == null) {
-            newGroup = new DisplayGroup(groupId);
-            mDisplayGroups.append(groupId, newGroup);
-        }
-        if (oldGroup != newGroup) {
+        final boolean needsDisplayGroup = needsOwnDisplayGroup || info.type == Display.TYPE_INTERNAL
+                || info.type == Display.TYPE_EXTERNAL;
+        if (!needsDisplayGroup) {
             if (oldGroup != null) {
                 oldGroup.removeDisplayLocked(display);
             }
+            return;
+        }
+        if (groupId == Display.INVALID_DISPLAY_GROUP
+                || hasOwnDisplayGroup != needsOwnDisplayGroup) {
+            if (oldGroup != null) {
+                oldGroup.removeDisplayLocked(display);
+            }
+
+            final int newGroupId = assignDisplayGroupIdLocked(needsOwnDisplayGroup);
+            // Create a new group if needed
+            DisplayGroup newGroup = getDisplayGroupLocked(newGroupId);
+            if (newGroup == null) {
+                newGroup = new DisplayGroup(newGroupId);
+                mDisplayGroups.append(newGroupId, newGroup);
+            }
             newGroup.addDisplayLocked(display);
-            display.updateDisplayGroupIdLocked(groupId);
-            Slog.i(TAG, "Setting new display group " + groupId + " for display "
+            display.updateDisplayGroupIdLocked(newGroupId);
+            Slog.i(TAG, "Setting new display group " + newGroupId + " for display "
                     + displayId + ", from previous group: "
                     + (oldGroup != null ? oldGroup.getGroupId() : "null"));
         }
diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
index bcd853c..dcb2c15 100644
--- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
@@ -186,11 +186,14 @@
         LogicalDisplay display2 = add(createDisplayDevice(Display.TYPE_INTERNAL, 600, 800, 0));
         LogicalDisplay display3 = add(createDisplayDevice(Display.TYPE_VIRTUAL, 600, 800, 0));
 
+        // Physical displays should be automatically put into the default group.
         assertEquals(Display.DEFAULT_DISPLAY_GROUP,
                 mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display1)));
         assertEquals(Display.DEFAULT_DISPLAY_GROUP,
                 mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display2)));
-        assertEquals(Display.DEFAULT_DISPLAY_GROUP,
+
+        // Virtual displays should belong to no group by default.
+        assertEquals(Display.INVALID_DISPLAY_GROUP,
                 mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
     }
 
@@ -212,13 +215,13 @@
         assertNotEquals(Display.DEFAULT_DISPLAY_GROUP,
                 mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
 
-        // Now switch it back to the default group by removing the flag and issuing an update
+        // Now switch it to the invalid group by removing the flag and issuing an update
         DisplayDeviceInfo info = device3.getSourceInfo();
         info.flags = info.flags & ~DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP;
         mDisplayDeviceRepo.onDisplayDeviceEvent(device3, DISPLAY_DEVICE_EVENT_CHANGED);
 
-        // Verify the new group is correct.
-        assertEquals(Display.DEFAULT_DISPLAY_GROUP,
+        // Verify the virtual display has not been placed into a group.
+        assertEquals(Display.INVALID_DISPLAY_GROUP,
                 mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
     }