diff options
3 files changed, 35 insertions, 1 deletions
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java index c7d89b0c6e4f..2cb5aeeeb2e6 100644 --- a/core/java/android/os/PowerManagerInternal.java +++ b/core/java/android/os/PowerManagerInternal.java @@ -141,6 +141,14 @@ public abstract class PowerManagerInternal { public abstract void setDozeOverrideFromDreamManager( int screenState, int screenBrightness); + /** + * Used by sidekick manager to tell the power manager if it shouldn't change the display state + * when a draw wake lock is acquired. Some processes may grab such a wake lock to do some work + * in a powered-up state, but we shouldn't give up sidekick control over the display until this + * override is lifted. + */ + public abstract void setDrawWakeLockOverrideFromSidekick(boolean keepState); + public abstract PowerSaveState getLowPowerState(int serviceType); public abstract void registerLowPowerModeObserver(LowPowerModeListener listener); diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto index 5cb5319f4fea..64aa98b1136e 100644 --- a/core/proto/android/server/powermanagerservice.proto +++ b/core/proto/android/server/powermanagerservice.proto @@ -315,4 +315,6 @@ message PowerServiceSettingsAndConfigurationDumpProto { optional bool is_double_tap_wake_enabled = 37; // True if we are currently in VR Mode. optional bool is_vr_mode_enabled = 38; + // True if Sidekick is controlling the display and we shouldn't change its power mode. + optional bool draw_wake_lock_override_from_sidekick = 39; } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index f77b0ee59249..9cbde9de1654 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -488,6 +488,9 @@ public final class PowerManagerService extends SystemService // The screen brightness to use while dozing. private int mDozeScreenBrightnessOverrideFromDreamManager = PowerManager.BRIGHTNESS_DEFAULT; + // Keep display state when dozing. + private boolean mDrawWakeLockOverrideFromSidekick; + // Time when we last logged a warning about calling userActivity() without permission. private long mLastWarningAboutUserActivityPermission = Long.MIN_VALUE; @@ -2424,7 +2427,8 @@ public final class PowerManagerService extends SystemService if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) { mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager; - if ((mWakeLockSummary & WAKE_LOCK_DRAW) != 0) { + if ((mWakeLockSummary & WAKE_LOCK_DRAW) != 0 + && !mDrawWakeLockOverrideFromSidekick) { if (mDisplayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) { mDisplayPowerRequest.dozeScreenState = Display.STATE_DOZE; } @@ -3176,6 +3180,16 @@ public final class PowerManagerService extends SystemService } } + private void setDrawWakeLockOverrideFromSidekickInternal(boolean keepState) { + synchronized (mLock) { + if (mDrawWakeLockOverrideFromSidekick != keepState) { + mDrawWakeLockOverrideFromSidekick = keepState; + mDirty |= DIRTY_SETTINGS; + updatePowerStateLocked(); + } + } + } + @VisibleForTesting void setVrModeEnabled(boolean enabled) { mIsVrModeEnabled = enabled; @@ -3381,6 +3395,7 @@ public final class PowerManagerService extends SystemService + mUserInactiveOverrideFromWindowManager); pw.println(" mDozeScreenStateOverrideFromDreamManager=" + mDozeScreenStateOverrideFromDreamManager); + pw.println(" mDrawWakeLockOverrideFromSidekick=" + mDrawWakeLockOverrideFromSidekick); pw.println(" mDozeScreenBrightnessOverrideFromDreamManager=" + mDozeScreenBrightnessOverrideFromDreamManager); pw.println(" mScreenBrightnessSettingMinimum=" + mScreenBrightnessSettingMinimum); @@ -3717,6 +3732,10 @@ public final class PowerManagerService extends SystemService mDozeScreenStateOverrideFromDreamManager); proto.write( PowerServiceSettingsAndConfigurationDumpProto + .DRAW_WAKE_LOCK_OVERRIDE_FROM_SIDEKICK, + mDrawWakeLockOverrideFromSidekick); + proto.write( + PowerServiceSettingsAndConfigurationDumpProto .DOZED_SCREEN_BRIGHTNESS_OVERRIDE_FROM_DREAM_MANAGER, mDozeScreenBrightnessOverrideFromDreamManager); @@ -4703,6 +4722,11 @@ public final class PowerManagerService extends SystemService } @Override + public void setDrawWakeLockOverrideFromSidekick(boolean keepState) { + setDrawWakeLockOverrideFromSidekickInternal(keepState); + } + + @Override public void setMaximumScreenOffTimeoutFromDeviceAdmin(@UserIdInt int userId, long timeMs) { setMaximumScreenOffTimeoutFromDeviceAdminInternal(userId, timeMs); } |