Loading services/core/java/com/android/server/display/DisplayAdapter.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading services/core/java/com/android/server/display/DisplayManagerService.java +2 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +0 −15 Original line number Diff line number Diff line Loading @@ -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<>(); Loading services/core/java/com/android/server/display/VirtualDisplayAdapter.java +45 −19 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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); Loading @@ -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 Loading @@ -488,7 +515,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter { mCurrentBrightness = brightnessState; mCallback.dispatchRequestedBrightnessChanged(mCurrentBrightness); } return null; return runnable; } @Override Loading Loading @@ -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; Loading Loading @@ -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); } } services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,10 @@ public class DisplayManagerServiceTest { @Override public void destroyDisplay(IBinder displayToken) { } @Override public void setDisplayPowerMode(IBinder displayToken, int mode) { } }, flags); } Loading Loading
services/core/java/com/android/server/display/DisplayAdapter.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading
services/core/java/com/android/server/display/DisplayManagerService.java +2 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +0 −15 Original line number Diff line number Diff line Loading @@ -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<>(); Loading
services/core/java/com/android/server/display/VirtualDisplayAdapter.java +45 −19 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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); Loading @@ -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 Loading @@ -488,7 +515,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter { mCurrentBrightness = brightnessState; mCallback.dispatchRequestedBrightnessChanged(mCurrentBrightness); } return null; return runnable; } @Override Loading Loading @@ -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; Loading Loading @@ -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); } }
services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,10 @@ public class DisplayManagerServiceTest { @Override public void destroyDisplay(IBinder displayToken) { } @Override public void setDisplayPowerMode(IBinder displayToken, int mode) { } }, flags); } Loading