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

Commit ab919348 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski Committed by Android (Google) Code Review
Browse files

Merge "Propagate virtual display states to SurfaceFlinger" into main

parents b922617f b3b82705
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.display;
import android.content.Context;
import android.os.Handler;
import android.view.Display;
import android.view.SurfaceControl;

import com.android.server.display.feature.DisplayManagerFlags;

@@ -138,6 +139,21 @@ abstract class DisplayAdapter {
                vsyncRate, /* isSynthetic= */ false, alternativeRefreshRates, supportedHdrTypes);
    }

    static int getPowerModeForState(int state) {
        switch (state) {
            case Display.STATE_OFF:
                return SurfaceControl.POWER_MODE_OFF;
            case Display.STATE_DOZE:
                return SurfaceControl.POWER_MODE_DOZE;
            case Display.STATE_DOZE_SUSPEND:
                return SurfaceControl.POWER_MODE_DOZE_SUSPEND;
            case Display.STATE_ON_SUSPEND:
                return SurfaceControl.POWER_MODE_ON_SUSPEND;
            default:
                return SurfaceControl.POWER_MODE_NORMAL;
        }
    }

    public interface Listener {
        void onDisplayDeviceEvent(DisplayDevice device, int event);
        void onTraversalRequested();
+2 −5
Original line number Diff line number Diff line
@@ -2618,8 +2618,7 @@ 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
                || android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()) {
        if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
            final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(device);
            if (display == null) {
                return null;
@@ -5580,9 +5579,7 @@ 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
                            || android.companion.virtualdevice.flags.Flags
                                    .correctVirtualDisplayPowerState()) {
                    if ((flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
                        final DisplayPowerController displayPowerController =
                                mDisplayPowerControllers.get(id);
                        if (displayPowerController != null) {
+0 −15
Original line number Diff line number Diff line
@@ -208,21 +208,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
        }
    }

    static int getPowerModeForState(int state) {
        switch (state) {
            case Display.STATE_OFF:
                return SurfaceControl.POWER_MODE_OFF;
            case Display.STATE_DOZE:
                return SurfaceControl.POWER_MODE_DOZE;
            case Display.STATE_DOZE_SUSPEND:
                return SurfaceControl.POWER_MODE_DOZE_SUSPEND;
            case Display.STATE_ON_SUSPEND:
                return SurfaceControl.POWER_MODE_ON_SUSPEND;
            default:
                return SurfaceControl.POWER_MODE_NORMAL;
        }
    }

    private final class LocalDisplayDevice extends DisplayDevice {
        private final long mPhysicalDisplayId;
        private final SparseArray<DisplayModeRecord> mSupportedModes = new SparseArray<>();
+45 −19
Original line number Diff line number Diff line
@@ -113,6 +113,11 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
            public void destroyDisplay(IBinder displayToken) {
                DisplayControl.destroyVirtualDisplay(displayToken);
            }

            @Override
            public void setDisplayPowerMode(IBinder displayToken, int mode) {
                SurfaceControl.setDisplayPowerMode(displayToken, mode);
            }
        }, featureFlags);
    }

@@ -340,6 +345,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
        private Display.Mode mMode;
        private int mDisplayIdToMirror;
        private boolean mIsWindowManagerMirroring;
        private final boolean mNeverBlank;
        private final DisplayCutout mDisplayCutout;
        private final float mDefaultBrightness;
        private final float mDimBrightness;
@@ -371,7 +377,11 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
            mCallback = callback;
            mProjection = projection;
            mMediaProjectionCallback = mediaProjectionCallback;
            if (android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()) {
            // Private non-mirror displays are never blank and always on.
            mNeverBlank = (flags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) == 0
                    && (flags & VIRTUAL_DISPLAY_FLAG_PUBLIC) == 0;
            if (android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()
                    && !mNeverBlank) {
                // 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.
@@ -471,7 +481,15 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
        @Override
        public Runnable requestDisplayStateLocked(int state, float brightnessState,
                float sdrBrightnessState, DisplayOffloadSessionImpl displayOffloadSession) {
            Runnable runnable = null;
            if (state != mDisplayState) {
                Slog.d(TAG, "Changing state of virtual display " + mName + " from "
                        + Display.stateToString(mDisplayState) + " to "
                        + Display.stateToString(state));
                if (state != Display.STATE_ON && state != Display.STATE_OFF) {
                    Slog.wtf(TAG, "Unexpected display state for Virtual Display: "
                            + Display.stateToString(state));
                }
                mDisplayState = state;
                mInfo = null;
                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
@@ -480,6 +498,15 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                } else {
                    mCallback.dispatchDisplayResumed();
                }

                if (android.companion.virtualdevice.flags.Flags.correctVirtualDisplayPowerState()) {
                    final IBinder token = getDisplayTokenLocked();
                    runnable = () -> {
                        final int mode = getPowerModeForState(state);
                        Slog.d(TAG, "Requesting power mode for display " + mName + " to " + mode);
                        mSurfaceControlDisplayFactory.setDisplayPowerMode(token, mode);
                    };
                }
            }
            if (android.companion.virtualdevice.flags.Flags.deviceAwareDisplayPower()
                    && mBrightnessListener != null
@@ -488,7 +515,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                mCurrentBrightness = brightnessState;
                mCallback.dispatchRequestedBrightnessChanged(mCurrentBrightness);
            }
            return null;
            return runnable;
        }

        @Override
@@ -572,23 +599,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;
                    }
                    if ((mFlags & VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR) != 0) {
                        mInfo.flags &= ~DisplayDeviceInfo.FLAG_NEVER_BLANK;
                    } else {
                        mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY;
                    }
                if (mNeverBlank) {
                    mInfo.flags |= DisplayDeviceInfo.FLAG_NEVER_BLANK;
                }
                if ((mFlags & VIRTUAL_DISPLAY_FLAG_OWN_DISPLAY_GROUP) != 0) {
                    mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROUP;
@@ -782,5 +800,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
         * @param displayToken The display token for the display to be destroyed.
         */
        void destroyDisplay(IBinder displayToken);

        /**
         * Set the display power mode in SurfaceFlinger.
         *
         * @param displayToken The display token for the display.
         * @param mode the SurfaceControl power mode, e.g. {@link SurfaceControl#POWER_MODE_OFF}.
         */
        void setDisplayPowerMode(IBinder displayToken, int mode);
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -332,6 +332,10 @@ public class DisplayManagerServiceTest {
                        @Override
                        public void destroyDisplay(IBinder displayToken) {
                        }

                        @Override
                        public void setDisplayPowerMode(IBinder displayToken, int mode) {
                        }
                    }, flags);
        }

Loading