Have each Display be associated with a DisplayGroup and DPC

Previously the behavior was for each Display to be associated with a
DisplayGroup. This CL restores that behavior.

Additionally, this CL restores that each Display should have its own
DisplayPowerController as this is the mechanism by which each display is
updated.

Fixes: 183403444
Test: atest MultiDisplayKeyguardTests#testUnlockScreen_decoredSystemDisplayChanged_dismissesKeyguardOnUnlock
Change-Id: I31515822d3412948458f8da5c1e89f92f35e495d
This commit is contained in:
Sean Stout
2021-03-22 23:55:15 -07:00
parent 71cf0b48ce
commit 71b3ede634
3 changed files with 31 additions and 39 deletions

View File

@@ -1134,13 +1134,9 @@ public final class DisplayManagerService extends SystemService {
recordStableDisplayStatsIfNeededLocked(display);
recordTopInsetLocked(display);
}
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);
}
addDisplayPowerControllerLocked(display);
mDisplayStates.append(displayId, Display.STATE_UNKNOWN);
mDisplayBrightnesses.append(displayId, display.getDisplayInfoLocked().brightnessDefault);
DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
@@ -1943,8 +1939,7 @@ public final class DisplayManagerService extends SystemService {
}
private void initializeDisplayPowerControllersLocked() {
mLogicalDisplayMapper.forEachLocked((logicalDisplay) -> addDisplayPowerControllerLocked(
logicalDisplay));
mLogicalDisplayMapper.forEachLocked(this::addDisplayPowerControllerLocked);
}
private void addDisplayPowerControllerLocked(LogicalDisplay display) {
@@ -2839,10 +2834,16 @@ public final class DisplayManagerService extends SystemService {
final int size = displayGroup.getSizeLocked();
boolean ready = true;
for (int i = 0; i < size; i++) {
final DisplayPowerController displayPowerController =
mDisplayPowerControllers.get(displayGroup.getIdLocked(i));
ready &= displayPowerController.requestPowerState(request,
waitForNegativeProximity);
final int id = displayGroup.getIdLocked(i);
final DisplayDevice displayDevice = mLogicalDisplayMapper.getDisplayLocked(
id).getPrimaryDisplayDeviceLocked();
final int flags = displayDevice.getDisplayDeviceInfoLocked().flags;
if ((flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
final DisplayPowerController displayPowerController =
mDisplayPowerControllers.get(id);
ready &= displayPowerController.requestPowerState(request,
waitForNegativeProximity);
}
}
return ready;

View File

@@ -433,37 +433,31 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
final int displayId = display.getDisplayIdLocked();
// Get current display group data
final int groupId = getDisplayGroupIdFromDisplayIdLocked(displayId);
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;
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) {
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) {
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(newGroupId);
Slog.i(TAG, "Setting new display group " + newGroupId + " for display "
display.updateDisplayGroupIdLocked(groupId);
Slog.i(TAG, "Setting new display group " + groupId + " for display "
+ displayId + ", from previous group: "
+ (oldGroup != null ? oldGroup.getGroupId() : "null"));
}

View File

@@ -186,14 +186,11 @@ public class LogicalDisplayMapperTest {
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)));
// Virtual displays should belong to no group by default.
assertEquals(Display.INVALID_DISPLAY_GROUP,
assertEquals(Display.DEFAULT_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
}
@@ -215,13 +212,13 @@ public class LogicalDisplayMapperTest {
assertNotEquals(Display.DEFAULT_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
// Now switch it to the invalid group by removing the flag and issuing an update
// Now switch it back to the default 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 virtual display has not been placed into a group.
assertEquals(Display.INVALID_DISPLAY_GROUP,
// Verify the new group is correct.
assertEquals(Display.DEFAULT_DISPLAY_GROUP,
mLogicalDisplayMapper.getDisplayGroupIdFromDisplayIdLocked(id(display3)));
}