Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 519bd4e7 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Correctly initialize virtual display power state

Effectively removing the usages of FLAG_NEVER_BLANK. This flag was
added in 2013 (ag/316512) but all the display blanking logic from
back then is gone. The only thing the flag does today is prevent
calls to requestDisplayStateLocked for virtual displays.

Removing this allows to set the initial state of a display to UNKNOWN
because requestDisplayStateLocked is always called now.

So calling requestDisplayStateLocked will trigger the
VirtualDisplay.Callback on creation (which is what should happen) and
will trigger onDisplayChanged callback for DisplayListeners.

Fix: 371125136
Test: presubmit, CTS
Flag: android.companion.virtualdevice.flags.correct_virtual_display_power_state
Change-Id: I82f6bf6b4a8e56f8b59ba601b406982642f5d503
parent 23a5381e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -141,6 +141,16 @@ flag {
    is_exported: true
}

flag {
    name: "correct_virtual_display_power_state"
    namespace: "virtual_devices"
    description: "Fix the virtual display power state"
    bug: "371125136"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "vdm_settings"
    namespace: "virtual_devices"
+5 −2
Original line number Diff line number Diff line
@@ -2588,7 +2588,8 @@ public final class DisplayManagerService extends SystemService {
        // Blank or unblank the display immediately to match the state requested
        // by the display power controller (if known).
        DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
        if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
        if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0
                || android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()) {
            final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(device);
            if (display == null) {
                return null;
@@ -5543,7 +5544,9 @@ public final class DisplayManagerService extends SystemService {
                    final DisplayDevice displayDevice = mLogicalDisplayMapper.getDisplayLocked(
                            id).getPrimaryDisplayDeviceLocked();
                    final int flags = displayDevice.getDisplayDeviceInfoLocked().flags;
                    if ((flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
                    if ((flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0
                            || android.companion.virtualdevice.flags.Flags
                                    .correctVirtualDisplayPowerState()) {
                        final DisplayPowerController displayPowerController =
                                mDisplayPowerControllers.get(id);
                        if (displayPowerController != null) {
+25 −8
Original line number Diff line number Diff line
@@ -371,7 +371,15 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
            mCallback = callback;
            mProjection = projection;
            mMediaProjectionCallback = mediaProjectionCallback;
            if (android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()) {
                // The display's power state depends on the power state of the state of its
                // display / power group, which we don't know here. Initializing to UNKNOWN allows
                // the first call to requestDisplayStateLocked() to set the correct state.
                // This also triggers VirtualDisplay.Callback to tell the owner the initial state.
                mDisplayState = Display.STATE_UNKNOWN;
            } else {
                mDisplayState = Display.STATE_ON;
            }
            mPendingChanges |= PENDING_SURFACE_CHANGE;
            mDisplayIdToMirror = virtualDisplayConfig.getDisplayIdToMirror();
            mIsWindowManagerMirroring = virtualDisplayConfig.isWindowManagerMirroringEnabled();
@@ -559,6 +567,14 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                mInfo.yDpi = mDensityDpi;
                mInfo.presentationDeadlineNanos = 1000000000L / (int) getRefreshRate(); // 1 frame
                mInfo.flags = 0;
                if (android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()) {
                    if ((mFlags & VIRTUAL_DISPLAY_FLAG_PUBLIC) == 0) {
                        mInfo.flags |= DisplayDeviceInfo.FLAG_PRIVATE;
                    }
                    if ((mFlags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) == 0) {
                        mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY;
                    }
                } else {
                    if ((mFlags & VIRTUAL_DISPLAY_FLAG_PUBLIC) == 0) {
                        mInfo.flags |= DisplayDeviceInfo.FLAG_PRIVATE
                                | DisplayDeviceInfo.FLAG_NEVER_BLANK;
@@ -568,6 +584,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                    } else {
                        mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY;
                    }
                }
                if ((mFlags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) != 0) {
                    mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP;
                }