summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-03-03 08:52:24 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-03 08:52:24 +0000
commitaccbe584f284c15d63755a1eb322e651354f18ac (patch)
treef6b7a1c432855690def1f2dca2c584e42260de15
parent4415e6e1e304f83abbe2961fc8db99f811919bf3 (diff)
parent8f2b1f41841f1fdbed3375364acdb0dd8bf3b7af (diff)
Merge "Move DisplayPowerRequest logic into PowerGroup." into tm-dev
-rw-r--r--services/core/java/com/android/server/power/PowerGroup.java151
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java227
-rw-r--r--services/tests/servicestests/src/com/android/server/power/PowerGroupTest.java463
-rw-r--r--services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java12
4 files changed, 670 insertions, 183 deletions
diff --git a/services/core/java/com/android/server/power/PowerGroup.java b/services/core/java/com/android/server/power/PowerGroup.java
index c1bfdf7a343f..8b3d82a508d7 100644
--- a/services/core/java/com/android/server/power/PowerGroup.java
+++ b/services/core/java/com/android/server/power/PowerGroup.java
@@ -22,12 +22,21 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
import static android.os.PowerManagerInternal.isInteractive;
+import static com.android.server.power.PowerManagerService.USER_ACTIVITY_SCREEN_BRIGHT;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_DOZE;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_DRAW;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_BRIGHT;
+
+import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
import android.os.PowerManager;
+import android.os.PowerSaveState;
import android.os.Trace;
import android.util.Slog;
import android.view.Display;
+import com.android.internal.annotations.VisibleForTesting;
+
/**
* Used to store power related requests to every display in a
* {@link com.android.server.display.DisplayGroup}.
@@ -40,8 +49,11 @@ public class PowerGroup {
private static final String TAG = PowerGroup.class.getSimpleName();
private static final boolean DEBUG = false;
- private final DisplayPowerRequest mDisplayPowerRequest;
+ @VisibleForTesting
+ final DisplayPowerRequest mDisplayPowerRequest = new DisplayPowerRequest();
private final PowerGroupListener mWakefulnessListener;
+ private final Notifier mNotifier;
+ private final DisplayManagerInternal mDisplayManagerInternal;
private final boolean mSupportsSandman;
private final int mGroupId;
/** True if DisplayManagerService has applied all the latest display states that were requested
@@ -63,12 +75,13 @@ public class PowerGroup {
/** Timestamp (milliseconds since boot) of the last time the power group was put to sleep. */
private long mLastSleepTime;
- PowerGroup(int groupId, PowerGroupListener wakefulnessListener,
- DisplayPowerRequest displayPowerRequest, int wakefulness, boolean ready,
+ PowerGroup(int groupId, PowerGroupListener wakefulnessListener, Notifier notifier,
+ DisplayManagerInternal displayManagerInternal, int wakefulness, boolean ready,
boolean supportsSandman, long eventTime) {
mGroupId = groupId;
mWakefulnessListener = wakefulnessListener;
- mDisplayPowerRequest = displayPowerRequest;
+ mNotifier = notifier;
+ mDisplayManagerInternal = displayManagerInternal;
mWakefulness = wakefulness;
mReady = ready;
mSupportsSandman = supportsSandman;
@@ -76,18 +89,17 @@ public class PowerGroup {
mLastSleepTime = eventTime;
}
- PowerGroup(int wakefulness, PowerGroupListener wakefulnessListener, long eventTime) {
+ PowerGroup(int wakefulness, PowerGroupListener wakefulnessListener, Notifier notifier,
+ DisplayManagerInternal displayManagerInternal, long eventTime) {
mGroupId = Display.DEFAULT_DISPLAY_GROUP;
mWakefulnessListener = wakefulnessListener;
- mDisplayPowerRequest = new DisplayPowerRequest();
+ mNotifier = notifier;
+ mDisplayManagerInternal = displayManagerInternal;
mWakefulness = wakefulness;
mReady = false;
mSupportsSandman = true;
mLastWakeTime = eventTime;
- mLastSleepTime = eventTime; }
-
- DisplayPowerRequest getDisplayPowerRequestLocked() {
- return mDisplayPowerRequest;
+ mLastSleepTime = eventTime;
}
long getLastWakeTimeLocked() {
@@ -261,6 +273,23 @@ public class PowerGroup {
return mUserActivitySummary;
}
+ public boolean isPolicyBrightLocked() {
+ return mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT;
+ }
+
+ public boolean isPolicyDimLocked() {
+ return mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM;
+ }
+
+ public boolean isPolicyVrLocked() {
+ return mDisplayPowerRequest.isVr();
+
+ }
+
+ public boolean isBrightOrDimLocked() {
+ return mDisplayPowerRequest.isBrightOrDim();
+ }
+
public void setUserActivitySummaryLocked(int summary) {
mUserActivitySummary = summary;
}
@@ -281,6 +310,108 @@ public class PowerGroup {
return mSupportsSandman;
}
+ /**
+ * Return true if we must keep a suspend blocker active on behalf of a power group.
+ * We do so if the screen is on or is in transition between states.
+ */
+ boolean needSuspendBlockerLocked(boolean proximityPositive,
+ boolean suspendWhenScreenOffDueToProximityConfig) {
+ if (isBrightOrDimLocked()) {
+ // If we asked for the screen to be on but it is off due to the proximity
+ // sensor then we may suspend but only if the configuration allows it.
+ // On some hardware it may not be safe to suspend because the proximity
+ // sensor may not be correctly configured as a wake-up source.
+ if (!mDisplayPowerRequest.useProximitySensor || !proximityPositive
+ || !suspendWhenScreenOffDueToProximityConfig) {
+ return true;
+ }
+ }
+
+ if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE
+ && mDisplayPowerRequest.dozeScreenState == Display.STATE_ON) {
+ // Although we are in DOZE and would normally allow the device to suspend,
+ // the doze service has explicitly requested the display to remain in the ON
+ // state which means we should hold the display suspend blocker.
+ return true;
+ }
+ return false;
+ }
+
+ @VisibleForTesting
+ int getDesiredScreenPolicyLocked(boolean quiescent, boolean dozeAfterScreenOff,
+ boolean vrModeEnabled, boolean bootCompleted, boolean screenBrightnessBoostInProgress) {
+ final int wakefulness = getWakefulnessLocked();
+ final int wakeLockSummary = getWakeLockSummaryLocked();
+ if (wakefulness == WAKEFULNESS_ASLEEP || quiescent) {
+ return DisplayPowerRequest.POLICY_OFF;
+ } else if (wakefulness == WAKEFULNESS_DOZING) {
+ if ((wakeLockSummary & WAKE_LOCK_DOZE) != 0) {
+ return DisplayPowerRequest.POLICY_DOZE;
+ }
+ if (dozeAfterScreenOff) {
+ return DisplayPowerRequest.POLICY_OFF;
+ }
+ // Fall through and preserve the current screen policy if not configured to
+ // doze after screen off. This causes the screen off transition to be skipped.
+ }
+
+ // It is important that POLICY_VR check happens after the wakefulness checks above so
+ // that VR-mode does not prevent displays from transitioning to the correct state when
+ // dozing or sleeping.
+ if (vrModeEnabled) {
+ return DisplayPowerRequest.POLICY_VR;
+ }
+
+ if ((wakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0
+ || !bootCompleted
+ || (getUserActivitySummaryLocked() & USER_ACTIVITY_SCREEN_BRIGHT) != 0
+ || screenBrightnessBoostInProgress) {
+ return DisplayPowerRequest.POLICY_BRIGHT;
+ }
+
+ return DisplayPowerRequest.POLICY_DIM;
+ }
+
+ int getPolicyLocked() {
+ return mDisplayPowerRequest.policy;
+ }
+
+ boolean updateLocked(float screenBrightnessOverride, boolean autoBrightness,
+ boolean useProximitySensor, boolean boostScreenBrightness, int dozeScreenState,
+ float dozeScreenBrightness, boolean overrideDrawWakeLock,
+ PowerSaveState powerSaverState, boolean quiescent, boolean dozeAfterScreenOff,
+ boolean vrModeEnabled, boolean bootCompleted, boolean screenBrightnessBoostInProgress,
+ boolean waitForNegativeProximity) {
+ mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked(quiescent, dozeAfterScreenOff,
+ vrModeEnabled, bootCompleted, screenBrightnessBoostInProgress);
+ mDisplayPowerRequest.screenBrightnessOverride = screenBrightnessOverride;
+ mDisplayPowerRequest.useAutoBrightness = autoBrightness;
+ mDisplayPowerRequest.useProximitySensor = useProximitySensor;
+ mDisplayPowerRequest.boostScreenBrightness = boostScreenBrightness;
+
+ if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
+ mDisplayPowerRequest.dozeScreenState = dozeScreenState;
+ if ((getWakeLockSummaryLocked() & WAKE_LOCK_DRAW) != 0 && !overrideDrawWakeLock) {
+ if (mDisplayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) {
+ mDisplayPowerRequest.dozeScreenState = Display.STATE_DOZE;
+ }
+ if (mDisplayPowerRequest.dozeScreenState == Display.STATE_ON_SUSPEND) {
+ mDisplayPowerRequest.dozeScreenState = Display.STATE_ON;
+ }
+ }
+ mDisplayPowerRequest.dozeScreenBrightness = dozeScreenBrightness;
+ } else {
+ mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;
+ mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+ }
+ mDisplayPowerRequest.lowPowerMode = powerSaverState.batterySaverEnabled;
+ mDisplayPowerRequest.screenLowPowerBrightnessFactor = powerSaverState.brightnessFactor;
+ boolean ready = mDisplayManagerInternal.requestPowerState(mGroupId, mDisplayPowerRequest,
+ waitForNegativeProximity);
+ mNotifier.onScreenPolicyUpdate(mGroupId, mDisplayPowerRequest.policy);
+ return ready;
+ }
+
protected interface PowerGroupListener {
/**
* Informs the recipient about a wakefulness change of a {@link PowerGroup}.
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 914e5eccd192..1032ca660f14 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -54,7 +54,6 @@ import android.hardware.SystemSensorManager;
import android.hardware.devicestate.DeviceStateManager;
import android.hardware.display.AmbientDisplayConfiguration;
import android.hardware.display.DisplayManagerInternal;
-import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
import android.hardware.power.Boost;
import android.hardware.power.Mode;
import android.net.Uri;
@@ -196,19 +195,19 @@ public final class PowerManagerService extends SystemService
private static final int DIRTY_DISPLAY_GROUP_WAKEFULNESS = 1 << 16;
// Summarizes the state of all active wakelocks.
- private static final int WAKE_LOCK_CPU = 1 << 0;
- private static final int WAKE_LOCK_SCREEN_BRIGHT = 1 << 1;
- private static final int WAKE_LOCK_SCREEN_DIM = 1 << 2;
- private static final int WAKE_LOCK_BUTTON_BRIGHT = 1 << 3;
- private static final int WAKE_LOCK_PROXIMITY_SCREEN_OFF = 1 << 4;
- private static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
- private static final int WAKE_LOCK_DOZE = 1 << 6;
- private static final int WAKE_LOCK_DRAW = 1 << 7;
+ static final int WAKE_LOCK_CPU = 1 << 0;
+ static final int WAKE_LOCK_SCREEN_BRIGHT = 1 << 1;
+ static final int WAKE_LOCK_SCREEN_DIM = 1 << 2;
+ static final int WAKE_LOCK_BUTTON_BRIGHT = 1 << 3;
+ static final int WAKE_LOCK_PROXIMITY_SCREEN_OFF = 1 << 4;
+ static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
+ static final int WAKE_LOCK_DOZE = 1 << 6;
+ static final int WAKE_LOCK_DRAW = 1 << 7;
// Summarizes the user activity state.
- private static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
- private static final int USER_ACTIVITY_SCREEN_DIM = 1 << 1;
- private static final int USER_ACTIVITY_SCREEN_DREAM = 1 << 2;
+ static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
+ static final int USER_ACTIVITY_SCREEN_DIM = 1 << 1;
+ static final int USER_ACTIVITY_SCREEN_DREAM = 1 << 2;
// Default timeout in milliseconds. This is only used until the settings
// provider populates the actual default value (R.integer.def_screen_off_timeout).
@@ -696,7 +695,8 @@ public final class PowerManagerService extends SystemService
final PowerGroup powerGroup = new PowerGroup(
groupId,
mPowerGroupWakefulnessChangeListener,
- new DisplayPowerRequest(),
+ mNotifier,
+ mDisplayManagerInternal,
WAKEFULNESS_AWAKE,
/* ready= */ false,
supportsSandman,
@@ -1214,12 +1214,6 @@ public final class PowerManagerService extends SystemService
mPolicy = getLocalService(WindowManagerPolicy.class);
mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);
mAttentionDetector.systemReady(mContext);
- mPowerGroups.append(Display.DEFAULT_DISPLAY_GROUP,
- new PowerGroup(WAKEFULNESS_AWAKE, mPowerGroupWakefulnessChangeListener,
- mClock.uptimeMillis()));
- DisplayGroupPowerChangeListener displayGroupPowerChangeListener =
- new DisplayGroupPowerChangeListener();
- mDisplayManagerInternal.registerDisplayGroupListener(displayGroupPowerChangeListener);
SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
@@ -1230,6 +1224,13 @@ public final class PowerManagerService extends SystemService
mInjector.createSuspendBlocker(this, "PowerManagerService.Broadcasts"),
mPolicy, mFaceDownDetector, mScreenUndimDetector);
+ mPowerGroups.append(Display.DEFAULT_DISPLAY_GROUP,
+ new PowerGroup(WAKEFULNESS_AWAKE, mPowerGroupWakefulnessChangeListener,
+ mNotifier, mDisplayManagerInternal, mClock.uptimeMillis()));
+ DisplayGroupPowerChangeListener displayGroupPowerChangeListener =
+ new DisplayGroupPowerChangeListener();
+ mDisplayManagerInternal.registerDisplayGroupListener(displayGroupPowerChangeListener);
+
mWirelessChargerDetector = mInjector.createWirelessChargerDetector(sensorManager,
mInjector.createSuspendBlocker(
this, "PowerManagerService.WirelessChargerDetector"),
@@ -2242,7 +2243,7 @@ public final class PowerManagerService extends SystemService
@GuardedBy("mLock")
private void finishWakefulnessChangeIfNeededLocked() {
- if (mWakefulnessChanging && areAllDisplaysReadyLocked()) {
+ if (mWakefulnessChanging && areAllPowerGroupsReadyLocked()) {
if (getGlobalWakefulnessLocked() == WAKEFULNESS_DOZING
&& (mWakeLockSummary & WAKE_LOCK_DOZE) == 0) {
return; // wait until dream has enabled dozing
@@ -2259,9 +2260,12 @@ public final class PowerManagerService extends SystemService
}
}
- /** Returns {@code true} if every display has its requested state matching its actual state. */
+ /**
+ * Returns {@code true} if all {@link PowerGroup}s are ready, i.e. every display has its
+ * requested state matching its actual state.
+ */
@GuardedBy("mLock")
- private boolean areAllDisplaysReadyLocked() {
+ private boolean areAllPowerGroupsReadyLocked() {
final int size = mPowerGroups.size();
for (int i = 0; i < size; i++) {
if (!mPowerGroups.valueAt(i).isReadyLocked()) {
@@ -2318,11 +2322,11 @@ public final class PowerManagerService extends SystemService
// Phase 2: Lock profiles that became inactive/not kept awake.
updateProfilesLocked(now);
- // Phase 3: Update display power state.
- final boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
+ // Phase 3: Update power state of all PowerGroups.
+ final boolean powerGroupsBecameReady = updatePowerGroupsLocked(dirtyPhase2);
- // Phase 4: Update dream state (depends on display ready signal).
- updateDreamLocked(dirtyPhase2, displayBecameReady);
+ // Phase 4: Update dream state (depends on power group ready signal).
+ updateDreamLocked(dirtyPhase2, powerGroupsBecameReady);
// Phase 5: Send notifications, if needed.
finishWakefulnessChangeIfNeededLocked();
@@ -2513,7 +2517,7 @@ public final class PowerManagerService extends SystemService
final int numWakeLocks = mWakeLocks.size();
for (int i = 0; i < numWakeLocks; i++) {
final WakeLock wakeLock = mWakeLocks.get(i);
- final Integer groupId = wakeLock.getDisplayGroupId();
+ final Integer groupId = wakeLock.getPowerGroupId();
// a wakelock with an invalid group ID should affect all groups
if (groupId == null || (groupId != Display.INVALID_DISPLAY_GROUP
&& !mPowerGroups.contains(groupId))) {
@@ -2727,12 +2731,9 @@ public final class PowerManagerService extends SystemService
>= powerGroup.getLastWakeTimeLocked()) {
groupNextTimeout = lastUserActivityTimeNoChangeLights + screenOffTimeout;
if (now < groupNextTimeout) {
- final DisplayPowerRequest displayPowerRequest =
- powerGroup.getDisplayPowerRequestLocked();
- if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT
- || displayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) {
+ if (powerGroup.isPolicyBrightLocked() || powerGroup.isPolicyVrLocked()) {
groupUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
- } else if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
+ } else if (powerGroup.isPolicyDimLocked()) {
groupUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
}
}
@@ -3102,7 +3103,7 @@ public final class PowerManagerService extends SystemService
* Determines whether to post a message to the sandman to update the dream state.
*/
@GuardedBy("mLock")
- private void updateDreamLocked(int dirty, boolean displayBecameReady) {
+ private void updateDreamLocked(int dirty, boolean powerGroupBecameReady) {
if ((dirty & (DIRTY_WAKEFULNESS
| DIRTY_USER_ACTIVITY
| DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED
@@ -3113,8 +3114,8 @@ public final class PowerManagerService extends SystemService
| DIRTY_IS_POWERED
| DIRTY_STAY_ON
| DIRTY_PROXIMITY_POSITIVE
- | DIRTY_BATTERY_STATE)) != 0 || displayBecameReady) {
- if (areAllDisplaysReadyLocked()) {
+ | DIRTY_BATTERY_STATE)) != 0 || powerGroupBecameReady) {
+ if (areAllPowerGroupsReadyLocked()) {
scheduleSandmanLocked();
}
}
@@ -3266,13 +3267,12 @@ public final class PowerManagerService extends SystemService
*/
@GuardedBy("mLock")
private boolean canDreamLocked(final PowerGroup powerGroup) {
- final DisplayPowerRequest displayPowerRequest = powerGroup.getDisplayPowerRequestLocked();
if (!mBootCompleted
|| getGlobalWakefulnessLocked() != WAKEFULNESS_DREAMING
|| !mDreamsSupportedConfig
|| !mDreamsEnabledSetting
- || !displayPowerRequest.isBrightOrDim()
- || displayPowerRequest.isVr()
+ || !(powerGroup.isBrightOrDimLocked())
+ || powerGroup.isPolicyVrLocked()
|| (powerGroup.getUserActivitySummaryLocked() & (USER_ACTIVITY_SCREEN_BRIGHT
| USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0) {
return false;
@@ -3303,24 +3303,24 @@ public final class PowerManagerService extends SystemService
}
/**
- * Updates the display power state asynchronously.
- * When the update is finished, the ready state of the displays will be updated. The display
- * controllers post a message to tell us when the actual display power state
+ * Updates the state of all {@link PowerGroup}s asynchronously.
+ * When the update is finished, the ready state of the {@link PowerGroup} will be updated.
+ * The display controllers post a message to tell us when the actual display power state
* has been updated so we come back here to double-check and finish up.
*
- * This function recalculates the display power state each time.
+ * This function recalculates the {@link PowerGroup} state each time.
*
- * @return {@code true} if all displays became ready; {@code false} otherwise
+ * @return {@code true} if all {@link PowerGroup}s became ready; {@code false} otherwise
*/
@GuardedBy("mLock")
- private boolean updateDisplayPowerStateLocked(int dirty) {
- final boolean oldDisplayReady = areAllDisplaysReadyLocked();
+ private boolean updatePowerGroupsLocked(int dirty) {
+ final boolean oldPowerGroupsReady = areAllPowerGroupsReadyLocked();
if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
| DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
| DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_VR_MODE_CHANGED |
DIRTY_QUIESCENT | DIRTY_DISPLAY_GROUP_WAKEFULNESS)) != 0) {
if ((dirty & DIRTY_QUIESCENT) != 0) {
- if (areAllDisplaysReadyLocked()) {
+ if (areAllPowerGroupsReadyLocked()) {
sQuiescent = false;
} else {
mDirty |= DIRTY_QUIESCENT;
@@ -3330,9 +3330,6 @@ public final class PowerManagerService extends SystemService
for (int idx = 0; idx < mPowerGroups.size(); idx++) {
final PowerGroup powerGroup = mPowerGroups.valueAt(idx);
final int groupId = powerGroup.getGroupId();
- final DisplayPowerRequest displayPowerRequest =
- powerGroup.getDisplayPowerRequestLocked();
- displayPowerRequest.policy = getDesiredScreenPolicyLocked(powerGroup);
// Determine appropriate screen brightness and auto-brightness adjustments.
final boolean autoBrightness;
@@ -3350,43 +3347,19 @@ public final class PowerManagerService extends SystemService
== Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
screenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
}
-
- // Update display power request.
- displayPowerRequest.screenBrightnessOverride = screenBrightnessOverride;
- displayPowerRequest.useAutoBrightness = autoBrightness;
- displayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();
- displayPowerRequest.boostScreenBrightness = shouldBoostScreenBrightness();
-
- updatePowerRequestFromBatterySaverPolicy(displayPowerRequest);
-
- if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
- displayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager;
- if ((powerGroup.getWakeLockSummaryLocked() & WAKE_LOCK_DRAW) != 0
- && !mDrawWakeLockOverrideFromSidekick) {
- if (displayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) {
- displayPowerRequest.dozeScreenState = Display.STATE_DOZE;
- }
- if (displayPowerRequest.dozeScreenState == Display.STATE_ON_SUSPEND) {
- displayPowerRequest.dozeScreenState = Display.STATE_ON;
- }
- }
- displayPowerRequest.dozeScreenBrightness =
- mDozeScreenBrightnessOverrideFromDreamManagerFloat;
- } else {
- displayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;
- displayPowerRequest.dozeScreenBrightness =
- PowerManager.BRIGHTNESS_INVALID_FLOAT;
- }
-
- final boolean ready = mDisplayManagerInternal.requestPowerState(groupId,
- displayPowerRequest, mRequestWaitForNegativeProximity);
- mNotifier.onScreenPolicyUpdate(powerGroup.getGroupId(), displayPowerRequest.policy);
+ boolean ready = powerGroup.updateLocked(screenBrightnessOverride, autoBrightness,
+ shouldUseProximitySensorLocked(), shouldBoostScreenBrightness(),
+ mDozeScreenStateOverrideFromDreamManager,
+ mDozeScreenBrightnessOverrideFromDreamManagerFloat,
+ mDrawWakeLockOverrideFromSidekick,
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS),
+ sQuiescent, mDozeAfterScreenOff, mIsVrModeEnabled, mBootCompleted,
+ mScreenBrightnessBoostInProgress, mRequestWaitForNegativeProximity);
int wakefulness = powerGroup.getWakefulnessLocked();
-
if (DEBUG_SPEW) {
Slog.d(TAG, "updateDisplayPowerStateLocked: displayReady=" + ready
+ ", groupId=" + groupId
- + ", policy=" + policyToString(displayPowerRequest.policy)
+ + ", policy=" + policyToString(powerGroup.getPolicyLocked())
+ ", mWakefulness="
+ PowerManagerInternal.wakefulnessToString(wakefulness)
+ ", mWakeLockSummary=0x" + Integer.toHexString(
@@ -3394,9 +3367,8 @@ public final class PowerManagerService extends SystemService
+ ", mUserActivitySummary=0x" + Integer.toHexString(
powerGroup.getUserActivitySummaryLocked())
+ ", mBootCompleted=" + mBootCompleted
- + ", screenBrightnessOverride="
- + displayPowerRequest.screenBrightnessOverride
- + ", useAutoBrightness=" + displayPowerRequest.useAutoBrightness
+ + ", screenBrightnessOverride=" + screenBrightnessOverride
+ + ", useAutoBrightness=" + autoBrightness
+ ", mScreenBrightnessBoostInProgress="
+ mScreenBrightnessBoostInProgress
+ ", mIsVrModeEnabled= " + mIsVrModeEnabled
@@ -3420,7 +3392,7 @@ public final class PowerManagerService extends SystemService
mRequestWaitForNegativeProximity = false;
}
- return areAllDisplaysReadyLocked() && !oldDisplayReady;
+ return areAllPowerGroupsReadyLocked() && !oldPowerGroupsReady;
}
@GuardedBy("mLock")
@@ -3457,40 +3429,9 @@ public final class PowerManagerService extends SystemService
@VisibleForTesting
@GuardedBy("mLock")
int getDesiredScreenPolicyLocked(int groupId) {
- return getDesiredScreenPolicyLocked(mPowerGroups.get(groupId));
- }
-
- int getDesiredScreenPolicyLocked(final PowerGroup powerGroup) {
- final int wakefulness = powerGroup.getWakefulnessLocked();
- final int wakeLockSummary = powerGroup.getWakeLockSummaryLocked();
- if (wakefulness == WAKEFULNESS_ASLEEP || sQuiescent) {
- return DisplayPowerRequest.POLICY_OFF;
- } else if (wakefulness == WAKEFULNESS_DOZING) {
- if ((wakeLockSummary & WAKE_LOCK_DOZE) != 0) {
- return DisplayPowerRequest.POLICY_DOZE;
- }
- if (mDozeAfterScreenOff) {
- return DisplayPowerRequest.POLICY_OFF;
- }
- // Fall through and preserve the current screen policy if not configured to
- // doze after screen off. This causes the screen off transition to be skipped.
- }
-
- // It is important that POLICY_VR check happens after the wakefulness checks above so
- // that VR-mode does not prevent displays from transitioning to the correct state when
- // dozing or sleeping.
- if (mIsVrModeEnabled) {
- return DisplayPowerRequest.POLICY_VR;
- }
-
- if ((wakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0
- || !mBootCompleted
- || (powerGroup.getUserActivitySummaryLocked() & USER_ACTIVITY_SCREEN_BRIGHT) != 0
- || mScreenBrightnessBoostInProgress) {
- return DisplayPowerRequest.POLICY_BRIGHT;
- }
-
- return DisplayPowerRequest.POLICY_DIM;
+ return mPowerGroups.get(groupId).getDesiredScreenPolicyLocked(sQuiescent,
+ mDozeAfterScreenOff, mIsVrModeEnabled, mBootCompleted,
+ mScreenBrightnessBoostInProgress);
}
private final DisplayManagerInternal.DisplayPowerCallbacks mDisplayPowerCallbacks =
@@ -3578,11 +3519,11 @@ public final class PowerManagerService extends SystemService
@GuardedBy("mLock")
private void updateSuspendBlockerLocked() {
final boolean needWakeLockSuspendBlocker = ((mWakeLockSummary & WAKE_LOCK_CPU) != 0);
- final boolean needDisplaySuspendBlocker = needDisplaySuspendBlockerLocked();
+ final boolean needDisplaySuspendBlocker = needSuspendBlockerLocked();
final boolean autoSuspend = !needDisplaySuspendBlocker;
boolean interactive = false;
for (int idx = 0; idx < mPowerGroups.size() && !interactive; idx++) {
- interactive = mPowerGroups.valueAt(idx).getDisplayPowerRequestLocked().isBrightOrDim();
+ interactive = mPowerGroups.valueAt(idx).isBrightOrDimLocked();
}
// Disable auto-suspend if needed.
@@ -3617,7 +3558,7 @@ public final class PowerManagerService extends SystemService
// until the display is actually ready so that all transitions have
// completed. This is probably a good sign that things have gotten
// too tangled over here...
- if (interactive || areAllDisplaysReadyLocked()) {
+ if (interactive || areAllPowerGroupsReadyLocked()) {
setHalInteractiveModeLocked(interactive);
}
}
@@ -3643,12 +3584,11 @@ public final class PowerManagerService extends SystemService
}
/**
- * Return true if we must keep a suspend blocker active on behalf of the display.
- * We do so if the screen is on or is in transition between states.
+ * Return true if we must keep a suspend blocker active on behalf of a power group.
*/
@GuardedBy("mLock")
- private boolean needDisplaySuspendBlockerLocked() {
- if (!areAllDisplaysReadyLocked()) {
+ private boolean needSuspendBlockerLocked() {
+ if (!areAllPowerGroupsReadyLocked()) {
return true;
}
@@ -3666,24 +3606,9 @@ public final class PowerManagerService extends SystemService
}
for (int idx = 0; idx < mPowerGroups.size(); idx++) {
- final DisplayPowerRequest displayPowerRequest =
- mPowerGroups.valueAt(idx).getDisplayPowerRequestLocked();
- if (displayPowerRequest.isBrightOrDim()) {
- // If we asked for the screen to be on but it is off due to the proximity
- // sensor then we may suspend but only if the configuration allows it.
- // On some hardware it may not be safe to suspend because the proximity
- // sensor may not be correctly configured as a wake-up source.
- if (!displayPowerRequest.useProximitySensor || !mProximityPositive
- || !mSuspendWhenScreenOffDueToProximityConfig) {
- return true;
- }
- }
-
- if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE
- && displayPowerRequest.dozeScreenState == Display.STATE_ON) {
- // Although we are in DOZE and would normally allow the device to suspend,
- // the doze service has explicitly requested the display to remain in the ON
- // state which means we should hold the display suspend blocker.
+ final PowerGroup powerGroup = mPowerGroups.valueAt(idx);
+ if (powerGroup.needSuspendBlockerLocked(mProximityPositive,
+ mSuspendWhenScreenOffDueToProximityConfig)) {
return true;
}
}
@@ -3832,14 +3757,6 @@ public final class PowerManagerService extends SystemService
}
}
- @VisibleForTesting
- void updatePowerRequestFromBatterySaverPolicy(DisplayPowerRequest displayPowerRequest) {
- PowerSaveState state = mBatterySaverPolicy.
- getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS);
- displayPowerRequest.lowPowerMode = state.batterySaverEnabled;
- displayPowerRequest.screenLowPowerBrightnessFactor = state.brightnessFactor;
- }
-
void setStayOnSettingInternal(int val) {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, val);
@@ -5170,8 +5087,8 @@ public final class PowerManagerService extends SystemService
mWorkSource = copyWorkSource(workSource);
}
- /** Returns the DisplayGroup Id of this wakeLock or {@code null} if info not available. */
- public Integer getDisplayGroupId() {
+ /** Returns the PowerGroup Id of this wakeLock or {@code null} if info not available.. */
+ public Integer getPowerGroupId() {
if (!mSystemReady || mDisplayId == Display.INVALID_DISPLAY) {
return Display.INVALID_DISPLAY_GROUP;
}
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerGroupTest.java b/services/tests/servicestests/src/com/android/server/power/PowerGroupTest.java
index c59b58d5c4d2..bc996d6789aa 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerGroupTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerGroupTest.java
@@ -17,6 +17,11 @@
package com.android.server.power;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DIM;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_VR;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_APPLICATION;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN;
import static android.os.PowerManager.GO_TO_SLEEP_REASON_TIMEOUT;
@@ -26,6 +31,10 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
+import static com.android.server.power.PowerManagerService.USER_ACTIVITY_SCREEN_BRIGHT;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_DOZE;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_BRIGHT;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -33,7 +42,10 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.verify;
-import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
+import android.hardware.display.DisplayManagerInternal;
+import android.os.PowerManager;
+import android.os.PowerSaveState;
+import android.view.Display;
import org.junit.Before;
import org.junit.Test;
@@ -49,21 +61,31 @@ import org.mockito.MockitoAnnotations;
public class PowerGroupTest {
private static final int GROUP_ID = 0;
+ private static final int UID = 11;
private static final long TIMESTAMP_CREATE = 1;
private static final long TIMESTAMP1 = 999;
private static final long TIMESTAMP2 = TIMESTAMP1 + 10;
private static final long TIMESTAMP3 = TIMESTAMP2 + 10;
- private static final int UID = 11;
+
+ private static final float PRECISION = 0.001f;
+
+ private static final float BRIGHTNESS = 0.99f;
+ private static final float BRIGHTNESS_DOZE = 0.5f;
+
+
private PowerGroup mPowerGroup;
- @Mock
- private PowerGroup.PowerGroupListener mWakefulnessCallbackMock;
+ @Mock private PowerGroup.PowerGroupListener mWakefulnessCallbackMock;
+ @Mock private Notifier mNotifier;
+ @Mock private DisplayManagerInternal mDisplayManagerInternal;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mPowerGroup = new PowerGroup(GROUP_ID, mWakefulnessCallbackMock, new DisplayPowerRequest(),
- WAKEFULNESS_AWAKE, /* ready= */ true, /* supportsSandman= */true, TIMESTAMP_CREATE);
+ mPowerGroup = new PowerGroup(GROUP_ID, mWakefulnessCallbackMock, mNotifier,
+ mDisplayManagerInternal, WAKEFULNESS_AWAKE, /* ready= */ true,
+ /* supportsSandman= */ true, TIMESTAMP_CREATE);
}
@Test
@@ -126,4 +148,433 @@ public class PowerGroupTest {
eq(WAKEFULNESS_ASLEEP), eq(TIMESTAMP3), eq(GO_TO_SLEEP_REASON_DEVICE_ADMIN),
eq(UID), /* opUid= */anyInt(), /* opPackageName= */ isNull(), eq(details));
}
+
+ @Test
+ public void testUpdateWhileAwake_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = true;
+ float brightnessFactor = 0.7f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ false,
+ /* useProximitySensor= */ false,
+ /* boostScreenBrightness= */ false,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_DIM);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(false);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(false);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(false);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileDozing_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ mPowerGroup.dozeLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_APPLICATION);
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
+ mPowerGroup.setWakeLockSummaryLocked(WAKE_LOCK_DOZE);
+
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_DOZE);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_ON);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isWithin(PRECISION).of(
+ BRIGHTNESS_DOZE);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileDozing_DozeAfterScreenOff() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ mPowerGroup.dozeLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_APPLICATION);
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING);
+
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ true,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_OFF);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateQuiescent() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ true,
+ /* dozeAfterScreenOff= */ true,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_OFF);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileAsleep_VrModeEnabled() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ mPowerGroup.sleepLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_TIMEOUT);
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ true,
+ /* vrModeEnabled= */ true,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_OFF);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileAwake_VrModeEnabled() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ true,
+ /* vrModeEnabled= */ true,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_VR);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileAsleep_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ mPowerGroup.sleepLocked(TIMESTAMP1, UID, GO_TO_SLEEP_REASON_TIMEOUT);
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_OFF);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileDreamingWithScreenBrightWakelock_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ mPowerGroup.dreamLocked(TIMESTAMP1, UID);
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
+ mPowerGroup.setWakeLockSummaryLocked(WAKE_LOCK_SCREEN_BRIGHT);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_BRIGHT);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileAwakeBootNotComplete_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ false,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_BRIGHT);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileAwakeUserActivityScreenBright_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ mPowerGroup.setUserActivitySummaryLocked(USER_ACTIVITY_SCREEN_BRIGHT);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ false,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_BRIGHT);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
+
+ @Test
+ public void testUpdateWhileAwakeScreenBrightnessBoostInProgress_UpdatesDisplayPowerRequest() {
+ final boolean batterySaverEnabled = false;
+ float brightnessFactor = 0.3f;
+ PowerSaveState powerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(batterySaverEnabled)
+ .setBrightnessFactor(brightnessFactor)
+ .build();
+ assertThat(mPowerGroup.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ mPowerGroup.updateLocked(/* screenBrightnessOverride= */ BRIGHTNESS,
+ /* autoBrightness = */ true,
+ /* useProximitySensor= */ true,
+ /* boostScreenBrightness= */ true,
+ /* dozeScreenStateOverride= */ Display.STATE_ON,
+ /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
+ /* overrideDrawWakeLock= */ false,
+ powerSaveState,
+ /* quiescent= */ false,
+ /* dozeAfterScreenOff= */ false,
+ /* vrModeEnabled= */ false,
+ /* bootCompleted= */ true,
+ /* screenBrightnessBoostInProgress= */ true,
+ /* waitForNegativeProximity= */ false);
+ DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
+ mPowerGroup.mDisplayPowerRequest;
+ assertThat(displayPowerRequest.policy).isEqualTo(POLICY_BRIGHT);
+ assertThat(displayPowerRequest.screenBrightnessOverride).isWithin(PRECISION).of(BRIGHTNESS);
+ assertThat(displayPowerRequest.useAutoBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.useProximitySensor).isEqualTo(true);
+ assertThat(displayPowerRequest.boostScreenBrightness).isEqualTo(true);
+ assertThat(displayPowerRequest.dozeScreenState).isEqualTo(Display.STATE_UNKNOWN);
+ assertThat(displayPowerRequest.dozeScreenBrightness).isEqualTo(
+ PowerManager.BRIGHTNESS_INVALID_FLOAT);
+ assertThat(displayPowerRequest.lowPowerMode).isEqualTo(batterySaverEnabled);
+ assertThat(displayPowerRequest.screenLowPowerBrightnessFactor).isWithin(PRECISION).of(
+ brightnessFactor);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 1b92017b8a00..b2f506a5b1f9 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -123,7 +123,6 @@ public class PowerManagerServiceTest {
private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent";
private static final String SYSTEM_PROPERTY_REBOOT_REASON = "sys.boot.reason";
- private static final float PRECISION = 0.001f;
private static final float BRIGHTNESS_FACTOR = 0.7f;
private static final boolean BATTERY_SAVER_ENABLED = true;
@@ -146,7 +145,6 @@ public class PowerManagerServiceTest {
private InattentiveSleepWarningController mInattentiveSleepWarningControllerMock;
private PowerManagerService mService;
- private DisplayPowerRequest mDisplayPowerRequest;
private ContextWrapper mContextSpy;
private BatteryReceiver mBatteryReceiver;
private UserSwitchedReceiver mUserSwitchedReceiver;
@@ -195,7 +193,6 @@ public class PowerManagerServiceTest {
when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn("");
when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(true);
- mDisplayPowerRequest = new DisplayPowerRequest();
addLocalServiceMock(LightsManager.class, mLightsManagerMock);
addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock);
addLocalServiceMock(BatteryManagerInternal.class, mBatteryManagerInternalMock);
@@ -419,15 +416,6 @@ public class PowerManagerServiceTest {
}
@Test
- public void testUpdatePowerScreenPolicy_UpdateDisplayPowerRequest() {
- createService();
- mService.updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest);
- assertThat(mDisplayPowerRequest.lowPowerMode).isEqualTo(BATTERY_SAVER_ENABLED);
- assertThat(mDisplayPowerRequest.screenLowPowerBrightnessFactor)
- .isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
- }
-
- @Test
public void testGetLastShutdownReasonInternal() {
when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_REBOOT_REASON), any())).thenReturn(
"shutdown,thermal");