Loading core/java/android/hardware/display/DisplayManagerInternal.java +30 −0 Original line number Diff line number Diff line Loading @@ -698,4 +698,34 @@ public abstract class DisplayManagerInternal { return "AmbientLightSensorData(" + sensorName + ", " + sensorType + ")"; } } /** * Associate a internal display to a {@link DisplayOffloader}. * * @param displayId the id of the internal display. * @param displayOffloader the {@link DisplayOffloader} that controls offloading ops of internal * display whose id is displayId. * @return a {@link DisplayOffloadSession} associated with given displayId and displayOffloader. */ public abstract DisplayOffloadSession registerDisplayOffloader( int displayId, DisplayOffloader displayOffloader); /** The callbacks that controls the entry & exit of display offloading. */ public interface DisplayOffloader { boolean startOffload(); void stopOffload(); } /** A session token that associates a internal display with a {@link DisplayOffloader}. */ public interface DisplayOffloadSession { /** Provide the display state to use in place of state DOZE. */ void setDozeStateOverride(int displayState); /** Returns the associated DisplayOffloader. */ DisplayOffloader getDisplayOffloader(); /** Returns whether displayoffload supports the given display state. */ static boolean isSupportedOffloadState(int displayState) { return Display.isSuspendedState(displayState); } } } services/core/java/com/android/server/display/DisplayDevice.java +19 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayViewport; import android.os.IBinder; import android.util.Slog; Loading Loading @@ -205,6 +206,24 @@ abstract class DisplayDevice { */ public Runnable requestDisplayStateLocked(int state, float brightnessState, float sdrBrightnessState) { return requestDisplayStateLocked(state, brightnessState, sdrBrightnessState, null); } /** * Sets the display state, if supported. * * @param state The new display state. * @param brightnessState The new display brightnessState. * @param sdrBrightnessState The new display brightnessState for SDR layers. * @param displayOffloadSession {@link DisplayOffloadSession} associated with current device. * @return A runnable containing work to be deferred until after we have exited the critical * section, or null if none. */ public Runnable requestDisplayStateLocked( int state, float brightnessState, float sdrBrightnessState, @Nullable DisplayManagerInternal.DisplayOffloadSession displayOffloadSession) { return null; } Loading services/core/java/com/android/server/display/DisplayManagerService.java +53 −6 Original line number Diff line number Diff line Loading @@ -1772,7 +1772,7 @@ public final class DisplayManagerService extends SystemService { synchronized (mSyncRoot) { // main display adapter registerDisplayAdapterLocked(mInjector.getLocalDisplayAdapter(mSyncRoot, mContext, mHandler, mDisplayDeviceRepo)); mHandler, mDisplayDeviceRepo, mFlags)); // Standalone VR devices rely on a virtual display as their primary display for // 2D UI. We register virtual display adapter along side the main display adapter Loading Loading @@ -2093,8 +2093,11 @@ public final class DisplayManagerService extends SystemService { // Only send a request for display state if display state has already been initialized. if (state != Display.STATE_UNKNOWN) { final BrightnessPair brightnessPair = mDisplayBrightnesses.get(displayId); return device.requestDisplayStateLocked(state, brightnessPair.brightness, brightnessPair.sdrBrightness); return device.requestDisplayStateLocked( state, brightnessPair.brightness, brightnessPair.sdrBrightness, display.getDisplayOffloadSessionLocked()); } } return null; Loading Loading @@ -3183,9 +3186,10 @@ public final class DisplayManagerService extends SystemService { } LocalDisplayAdapter getLocalDisplayAdapter(SyncRoot syncRoot, Context context, Handler handler, DisplayAdapter.Listener displayAdapterListener) { return new LocalDisplayAdapter(syncRoot, context, handler, displayAdapterListener); Handler handler, DisplayAdapter.Listener displayAdapterListener, DisplayManagerFlags flags) { return new LocalDisplayAdapter(syncRoot, context, handler, displayAdapterListener, flags); } long getDefaultDisplayDelayTimeout() { Loading Loading @@ -4806,6 +4810,49 @@ public final class DisplayManagerService extends SystemService { } return displayGroupIds; } @Override public DisplayManagerInternal.DisplayOffloadSession registerDisplayOffloader( int displayId, @NonNull DisplayManagerInternal.DisplayOffloader displayOffloader) { if (!mFlags.isDisplayOffloadEnabled()) { return null; } synchronized (mSyncRoot) { LogicalDisplay logicalDisplay = mLogicalDisplayMapper.getDisplayLocked(displayId); if (logicalDisplay == null) { Slog.w(TAG, "registering DisplayOffloader: LogicalDisplay for displayId=" + displayId + " is not found. No Op."); return null; } DisplayPowerControllerInterface displayPowerController = mDisplayPowerControllers.get(logicalDisplay.getDisplayIdLocked()); if (displayPowerController == null) { Slog.w(TAG, "setting doze state override: DisplayPowerController for displayId=" + displayId + " is unavailable. No Op."); return null; } DisplayOffloadSession session = new DisplayOffloadSession() { @Override public void setDozeStateOverride(int displayState) { synchronized (mSyncRoot) { displayPowerController.overrideDozeScreenState(displayState); } } @Override public DisplayOffloader getDisplayOffloader() { return displayOffloader; } }; logicalDisplay.setDisplayOffloadSessionLocked(session); displayPowerController.setDisplayOffloadSession(session); return session; } } } class DesiredDisplayModeSpecsObserver Loading services/core/java/com/android/server/display/DisplayPowerController.java +23 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,8 @@ import android.hardware.display.AmbientBrightnessDayStats; import android.hardware.display.BrightnessChangeEvent; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.BrightnessInfo; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession; import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.metrics.LogMaker; Loading Loading @@ -588,8 +590,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call new SparseArray<>(); private boolean mBootCompleted; private final DisplayManagerFlags mFlags; private int mDozeStateOverride = Display.STATE_UNKNOWN; private DisplayManagerInternal.DisplayOffloadSession mDisplayOffloadSession; /** * Creates the display power controller. Loading Loading @@ -956,6 +959,23 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } @Override public void overrideDozeScreenState(int displayState) { synchronized (mLock) { if (mDisplayOffloadSession == null || !DisplayOffloadSession.isSupportedOffloadState(displayState)) { return; } mDozeStateOverride = displayState; sendUpdatePowerState(); } } @Override public void setDisplayOffloadSession(DisplayOffloadSession session) { mDisplayOffloadSession = session; } @Override public BrightnessConfiguration getDefaultBrightnessConfiguration() { if (mAutomaticBrightnessController == null) { Loading Loading @@ -1518,6 +1538,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } else { state = Display.STATE_DOZE; } state = mDozeStateOverride == Display.STATE_UNKNOWN ? state : mDozeStateOverride; if (!mAllowAutoBrightnessWhileDozingConfig) { brightnessState = mPowerRequest.dozeScreenBrightness; mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE); Loading Loading @@ -3001,6 +3022,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call pw.println(" mLeadDisplayId=" + mLeadDisplayId); pw.println(" mLightSensor=" + mLightSensor); pw.println(" mDisplayBrightnessFollowers=" + mDisplayBrightnessFollowers); pw.println(" mDozeStateOverride=" + mDozeStateOverride); pw.println(); pw.println("Display Power Controller Locked State:"); Loading services/core/java/com/android/server/display/DisplayPowerController2.java +38 −14 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.hardware.display.AmbientBrightnessDayStats; import android.hardware.display.BrightnessChangeEvent; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.BrightnessInfo; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession; import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.metrics.LogMaker; Loading Loading @@ -470,9 +472,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal new SparseArray(); private boolean mBootCompleted; private final DisplayManagerFlags mFlags; private DisplayManagerInternal.DisplayOffloadSession mDisplayOffloadSession; /** * Creates the display power controller. */ Loading Loading @@ -588,7 +591,9 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (mDisplayId == Display.DEFAULT_DISPLAY) { mCdsi = LocalServices.getService(ColorDisplayServiceInternal.class); boolean active = mCdsi.setReduceBrightColorsListener(new ReduceBrightColorsListener() { if (mCdsi != null) { boolean active = mCdsi.setReduceBrightColorsListener( new ReduceBrightColorsListener() { @Override public void onReduceBrightColorsActivationChanged(boolean activated, boolean userInitiated) { Loading @@ -604,6 +609,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (active) { applyReduceBrightColorsSplineAdjustment(); } } } else { mCdsi = null; } Loading Loading @@ -759,6 +765,24 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } } @Override public void overrideDozeScreenState(int displayState) { mHandler.postAtTime(() -> { if (mDisplayOffloadSession == null || !(DisplayOffloadSession.isSupportedOffloadState(displayState) || displayState == Display.STATE_UNKNOWN)) { return; } mDisplayStateController.overrideDozeScreenState(displayState); sendUpdatePowerState(); }, mClock.uptimeMillis()); } @Override public void setDisplayOffloadSession(DisplayOffloadSession session) { mDisplayOffloadSession = session; } @Override public BrightnessConfiguration getDefaultBrightnessConfiguration() { if (mAutomaticBrightnessController == null) { Loading Loading
core/java/android/hardware/display/DisplayManagerInternal.java +30 −0 Original line number Diff line number Diff line Loading @@ -698,4 +698,34 @@ public abstract class DisplayManagerInternal { return "AmbientLightSensorData(" + sensorName + ", " + sensorType + ")"; } } /** * Associate a internal display to a {@link DisplayOffloader}. * * @param displayId the id of the internal display. * @param displayOffloader the {@link DisplayOffloader} that controls offloading ops of internal * display whose id is displayId. * @return a {@link DisplayOffloadSession} associated with given displayId and displayOffloader. */ public abstract DisplayOffloadSession registerDisplayOffloader( int displayId, DisplayOffloader displayOffloader); /** The callbacks that controls the entry & exit of display offloading. */ public interface DisplayOffloader { boolean startOffload(); void stopOffload(); } /** A session token that associates a internal display with a {@link DisplayOffloader}. */ public interface DisplayOffloadSession { /** Provide the display state to use in place of state DOZE. */ void setDozeStateOverride(int displayState); /** Returns the associated DisplayOffloader. */ DisplayOffloader getDisplayOffloader(); /** Returns whether displayoffload supports the given display state. */ static boolean isSupportedOffloadState(int displayState) { return Display.isSuspendedState(displayState); } } }
services/core/java/com/android/server/display/DisplayDevice.java +19 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayViewport; import android.os.IBinder; import android.util.Slog; Loading Loading @@ -205,6 +206,24 @@ abstract class DisplayDevice { */ public Runnable requestDisplayStateLocked(int state, float brightnessState, float sdrBrightnessState) { return requestDisplayStateLocked(state, brightnessState, sdrBrightnessState, null); } /** * Sets the display state, if supported. * * @param state The new display state. * @param brightnessState The new display brightnessState. * @param sdrBrightnessState The new display brightnessState for SDR layers. * @param displayOffloadSession {@link DisplayOffloadSession} associated with current device. * @return A runnable containing work to be deferred until after we have exited the critical * section, or null if none. */ public Runnable requestDisplayStateLocked( int state, float brightnessState, float sdrBrightnessState, @Nullable DisplayManagerInternal.DisplayOffloadSession displayOffloadSession) { return null; } Loading
services/core/java/com/android/server/display/DisplayManagerService.java +53 −6 Original line number Diff line number Diff line Loading @@ -1772,7 +1772,7 @@ public final class DisplayManagerService extends SystemService { synchronized (mSyncRoot) { // main display adapter registerDisplayAdapterLocked(mInjector.getLocalDisplayAdapter(mSyncRoot, mContext, mHandler, mDisplayDeviceRepo)); mHandler, mDisplayDeviceRepo, mFlags)); // Standalone VR devices rely on a virtual display as their primary display for // 2D UI. We register virtual display adapter along side the main display adapter Loading Loading @@ -2093,8 +2093,11 @@ public final class DisplayManagerService extends SystemService { // Only send a request for display state if display state has already been initialized. if (state != Display.STATE_UNKNOWN) { final BrightnessPair brightnessPair = mDisplayBrightnesses.get(displayId); return device.requestDisplayStateLocked(state, brightnessPair.brightness, brightnessPair.sdrBrightness); return device.requestDisplayStateLocked( state, brightnessPair.brightness, brightnessPair.sdrBrightness, display.getDisplayOffloadSessionLocked()); } } return null; Loading Loading @@ -3183,9 +3186,10 @@ public final class DisplayManagerService extends SystemService { } LocalDisplayAdapter getLocalDisplayAdapter(SyncRoot syncRoot, Context context, Handler handler, DisplayAdapter.Listener displayAdapterListener) { return new LocalDisplayAdapter(syncRoot, context, handler, displayAdapterListener); Handler handler, DisplayAdapter.Listener displayAdapterListener, DisplayManagerFlags flags) { return new LocalDisplayAdapter(syncRoot, context, handler, displayAdapterListener, flags); } long getDefaultDisplayDelayTimeout() { Loading Loading @@ -4806,6 +4810,49 @@ public final class DisplayManagerService extends SystemService { } return displayGroupIds; } @Override public DisplayManagerInternal.DisplayOffloadSession registerDisplayOffloader( int displayId, @NonNull DisplayManagerInternal.DisplayOffloader displayOffloader) { if (!mFlags.isDisplayOffloadEnabled()) { return null; } synchronized (mSyncRoot) { LogicalDisplay logicalDisplay = mLogicalDisplayMapper.getDisplayLocked(displayId); if (logicalDisplay == null) { Slog.w(TAG, "registering DisplayOffloader: LogicalDisplay for displayId=" + displayId + " is not found. No Op."); return null; } DisplayPowerControllerInterface displayPowerController = mDisplayPowerControllers.get(logicalDisplay.getDisplayIdLocked()); if (displayPowerController == null) { Slog.w(TAG, "setting doze state override: DisplayPowerController for displayId=" + displayId + " is unavailable. No Op."); return null; } DisplayOffloadSession session = new DisplayOffloadSession() { @Override public void setDozeStateOverride(int displayState) { synchronized (mSyncRoot) { displayPowerController.overrideDozeScreenState(displayState); } } @Override public DisplayOffloader getDisplayOffloader() { return displayOffloader; } }; logicalDisplay.setDisplayOffloadSessionLocked(session); displayPowerController.setDisplayOffloadSession(session); return session; } } } class DesiredDisplayModeSpecsObserver Loading
services/core/java/com/android/server/display/DisplayPowerController.java +23 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,8 @@ import android.hardware.display.AmbientBrightnessDayStats; import android.hardware.display.BrightnessChangeEvent; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.BrightnessInfo; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession; import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.metrics.LogMaker; Loading Loading @@ -588,8 +590,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call new SparseArray<>(); private boolean mBootCompleted; private final DisplayManagerFlags mFlags; private int mDozeStateOverride = Display.STATE_UNKNOWN; private DisplayManagerInternal.DisplayOffloadSession mDisplayOffloadSession; /** * Creates the display power controller. Loading Loading @@ -956,6 +959,23 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } @Override public void overrideDozeScreenState(int displayState) { synchronized (mLock) { if (mDisplayOffloadSession == null || !DisplayOffloadSession.isSupportedOffloadState(displayState)) { return; } mDozeStateOverride = displayState; sendUpdatePowerState(); } } @Override public void setDisplayOffloadSession(DisplayOffloadSession session) { mDisplayOffloadSession = session; } @Override public BrightnessConfiguration getDefaultBrightnessConfiguration() { if (mAutomaticBrightnessController == null) { Loading Loading @@ -1518,6 +1538,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } else { state = Display.STATE_DOZE; } state = mDozeStateOverride == Display.STATE_UNKNOWN ? state : mDozeStateOverride; if (!mAllowAutoBrightnessWhileDozingConfig) { brightnessState = mPowerRequest.dozeScreenBrightness; mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE); Loading Loading @@ -3001,6 +3022,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call pw.println(" mLeadDisplayId=" + mLeadDisplayId); pw.println(" mLightSensor=" + mLightSensor); pw.println(" mDisplayBrightnessFollowers=" + mDisplayBrightnessFollowers); pw.println(" mDozeStateOverride=" + mDozeStateOverride); pw.println(); pw.println("Display Power Controller Locked State:"); Loading
services/core/java/com/android/server/display/DisplayPowerController2.java +38 −14 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.hardware.display.AmbientBrightnessDayStats; import android.hardware.display.BrightnessChangeEvent; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.BrightnessInfo; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession; import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.metrics.LogMaker; Loading Loading @@ -470,9 +472,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal new SparseArray(); private boolean mBootCompleted; private final DisplayManagerFlags mFlags; private DisplayManagerInternal.DisplayOffloadSession mDisplayOffloadSession; /** * Creates the display power controller. */ Loading Loading @@ -588,7 +591,9 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (mDisplayId == Display.DEFAULT_DISPLAY) { mCdsi = LocalServices.getService(ColorDisplayServiceInternal.class); boolean active = mCdsi.setReduceBrightColorsListener(new ReduceBrightColorsListener() { if (mCdsi != null) { boolean active = mCdsi.setReduceBrightColorsListener( new ReduceBrightColorsListener() { @Override public void onReduceBrightColorsActivationChanged(boolean activated, boolean userInitiated) { Loading @@ -604,6 +609,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (active) { applyReduceBrightColorsSplineAdjustment(); } } } else { mCdsi = null; } Loading Loading @@ -759,6 +765,24 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } } @Override public void overrideDozeScreenState(int displayState) { mHandler.postAtTime(() -> { if (mDisplayOffloadSession == null || !(DisplayOffloadSession.isSupportedOffloadState(displayState) || displayState == Display.STATE_UNKNOWN)) { return; } mDisplayStateController.overrideDozeScreenState(displayState); sendUpdatePowerState(); }, mClock.uptimeMillis()); } @Override public void setDisplayOffloadSession(DisplayOffloadSession session) { mDisplayOffloadSession = session; } @Override public BrightnessConfiguration getDefaultBrightnessConfiguration() { if (mAutomaticBrightnessController == null) { Loading