Loading packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +30 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.android.systemui.doze.dagger.DozeScope; import com.android.systemui.doze.dagger.WrappedService; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.util.sensors.AsyncSensorManager; import java.io.PrintWriter; Loading @@ -55,6 +56,16 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi "com.android.systemui.doze.AOD_BRIGHTNESS"; protected static final String BRIGHTNESS_BUCKET = "brightness_bucket"; /** * Just before the screen times out from user inactivity, DisplayPowerController dims the screen * brightness to the lower of {@link #mScreenBrightnessDim}, or the current brightness minus * DisplayPowerController#SCREEN_DIM_MINIMUM_REDUCTION_FLOAT. * * This value is 0.04f * 255, which converts SCREEN_DIM_MINIMUM_REDUCTION_FLOAT to the integer * brightness values used by doze. */ private static final int SCREEN_DIM_MINIMUM_REDUCTION_INT = 10; private final Context mContext; private final DozeMachine.Service mDozeService; private final DozeHost mDozeHost; Loading Loading @@ -82,6 +93,8 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi */ private int mDebugBrightnessBucket = -1; private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; @Inject public DozeScreenBrightness(Context context, @WrappedService DozeMachine.Service service, AsyncSensorManager sensorManager, Loading @@ -89,7 +102,8 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi AlwaysOnDisplayPolicy alwaysOnDisplayPolicy, WakefulnessLifecycle wakefulnessLifecycle, DozeParameters dozeParameters, DockManager dockManager) { DockManager dockManager, UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { mContext = context; mDozeService = service; mSensorManager = sensorManager; Loading @@ -99,6 +113,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi mDozeHost = host; mHandler = handler; mDockManager = dockManager; mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness; mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness; Loading Loading @@ -148,14 +163,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi } } private void updateBrightnessAndReady(boolean force) { public void updateBrightnessAndReady(boolean force) { if (force || mRegistered || mDebugBrightnessBucket != -1) { int sensorValue = mDebugBrightnessBucket == -1 ? mLastSensorValue : mDebugBrightnessBucket; int brightness = computeBrightness(sensorValue); boolean brightnessReady = brightness > 0; if (brightnessReady) { mDozeService.setDozeScreenBrightness(clampToUserSetting(brightness)); mDozeService.setDozeScreenBrightness( clampToDimBrightnessForScreenOff(clampToUserSetting(brightness))); } int scrimOpacity = -1; Loading Loading @@ -207,13 +223,21 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi /** * Clamp the brightness to the dim brightness value used by PowerManagerService just before the * device times out and goes to sleep, if we are sleeping from a timeout. This ensures that we * don't raise the brightness back to the user setting before playing the screen off animation. * don't raise the brightness back to the user setting before or during the screen off * animation. */ private int clampToDimBrightnessForScreenOff(int brightness) { if (mDozeParameters.shouldControlUnlockedScreenOff() if (mUnlockedScreenOffAnimationController.isScreenOffAnimationPlaying() && mWakefulnessLifecycle.getLastSleepReason() == PowerManager.GO_TO_SLEEP_REASON_TIMEOUT) { return Math.min(mScreenBrightnessDim, brightness); return Math.max( PowerManager.BRIGHTNESS_OFF, // Use the lower of either the dim brightness, or the current brightness reduced // by the minimum dim amount. This is the same logic used in // DisplayPowerController#updatePowerState to apply a minimum dim amount. Math.min( brightness - SCREEN_DIM_MINIMUM_REDUCTION_INT, mScreenBrightnessDim)); } else { return brightness; } Loading packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +10 −1 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ public class DozeScreenState implements DozeMachine.Part { private final Provider<UdfpsController> mUdfpsControllerProvider; @Nullable private UdfpsController mUdfpsController; private final DozeLog mDozeLog; private final DozeScreenBrightness mDozeScreenBrightness; private int mPendingScreenState = Display.STATE_UNKNOWN; private SettableWakeLock mWakeLock; Loading @@ -90,7 +91,8 @@ public class DozeScreenState implements DozeMachine.Part { WakeLock wakeLock, AuthController authController, Provider<UdfpsController> udfpsControllerProvider, DozeLog dozeLog) { DozeLog dozeLog, DozeScreenBrightness dozeScreenBrightness) { mDozeService = service; mHandler = handler; mParameters = parameters; Loading @@ -99,6 +101,7 @@ public class DozeScreenState implements DozeMachine.Part { mAuthController = authController; mUdfpsControllerProvider = udfpsControllerProvider; mDozeLog = dozeLog; mDozeScreenBrightness = dozeScreenBrightness; updateUdfpsController(); if (mUdfpsController == null) { Loading Loading @@ -204,6 +207,12 @@ public class DozeScreenState implements DozeMachine.Part { if (screenState != Display.STATE_UNKNOWN) { if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")"); mDozeService.setDozeScreenState(screenState); if (screenState == Display.STATE_DOZE) { // If we're entering doze, update the doze screen brightness. We might have been // clamping it to the dim brightness during the screen off animation, and we should // now change it to the brightness we actually want according to the sensor. mDozeScreenBrightness.updateBrightnessAndReady(false /* force */); } mPendingScreenState = Display.STATE_UNKNOWN; mWakeLock.setAcquired(false); } Loading packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +9 −3 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.concurrency.FakeThreadFactory; import com.android.systemui.util.sensors.AsyncSensorManager; Loading Loading @@ -86,6 +87,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { DozeParameters mDozeParameters; @Mock DockManager mDockManager; @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor); Loading Loading @@ -113,7 +116,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { mSensor = fakeSensorManager.getFakeLightSensor(); mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, Optional.of(mSensor.getSensor()), mDozeHost, null /* handler */, mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager, mUnlockedScreenOffAnimationController); } @Test Loading Loading @@ -211,7 +215,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { public void testPulsing_withoutLightSensor_setsAoDDimmingScrimTransparent() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, Optional.empty() /* sensor */, mDozeHost, null /* handler */, mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager, mUnlockedScreenOffAnimationController); mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE); reset(mDozeHost); Loading Loading @@ -240,7 +245,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { public void testNullSensor() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, Optional.empty() /* sensor */, mDozeHost, null /* handler */, mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager, mUnlockedScreenOffAnimationController); mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); Loading packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -82,6 +82,8 @@ public class DozeScreenStateTest extends SysuiTestCase { private UdfpsController mUdfpsController; @Mock private DozeLog mDozeLog; @Mock private DozeScreenBrightness mDozeScreenBrightness; @Before public void setUp() throws Exception { Loading @@ -96,7 +98,8 @@ public class DozeScreenStateTest extends SysuiTestCase { mHandlerFake = new FakeHandler(Looper.getMainLooper()); mWakeLock = new WakeLockFake(); mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeHost, mDozeParameters, mWakeLock, mAuthController, mUdfpsControllerProvider, mDozeLog); mWakeLock, mAuthController, mUdfpsControllerProvider, mDozeLog, mDozeScreenBrightness); } @Test Loading Loading
packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +30 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.android.systemui.doze.dagger.DozeScope; import com.android.systemui.doze.dagger.WrappedService; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.util.sensors.AsyncSensorManager; import java.io.PrintWriter; Loading @@ -55,6 +56,16 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi "com.android.systemui.doze.AOD_BRIGHTNESS"; protected static final String BRIGHTNESS_BUCKET = "brightness_bucket"; /** * Just before the screen times out from user inactivity, DisplayPowerController dims the screen * brightness to the lower of {@link #mScreenBrightnessDim}, or the current brightness minus * DisplayPowerController#SCREEN_DIM_MINIMUM_REDUCTION_FLOAT. * * This value is 0.04f * 255, which converts SCREEN_DIM_MINIMUM_REDUCTION_FLOAT to the integer * brightness values used by doze. */ private static final int SCREEN_DIM_MINIMUM_REDUCTION_INT = 10; private final Context mContext; private final DozeMachine.Service mDozeService; private final DozeHost mDozeHost; Loading Loading @@ -82,6 +93,8 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi */ private int mDebugBrightnessBucket = -1; private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; @Inject public DozeScreenBrightness(Context context, @WrappedService DozeMachine.Service service, AsyncSensorManager sensorManager, Loading @@ -89,7 +102,8 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi AlwaysOnDisplayPolicy alwaysOnDisplayPolicy, WakefulnessLifecycle wakefulnessLifecycle, DozeParameters dozeParameters, DockManager dockManager) { DockManager dockManager, UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { mContext = context; mDozeService = service; mSensorManager = sensorManager; Loading @@ -99,6 +113,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi mDozeHost = host; mHandler = handler; mDockManager = dockManager; mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness; mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness; Loading Loading @@ -148,14 +163,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi } } private void updateBrightnessAndReady(boolean force) { public void updateBrightnessAndReady(boolean force) { if (force || mRegistered || mDebugBrightnessBucket != -1) { int sensorValue = mDebugBrightnessBucket == -1 ? mLastSensorValue : mDebugBrightnessBucket; int brightness = computeBrightness(sensorValue); boolean brightnessReady = brightness > 0; if (brightnessReady) { mDozeService.setDozeScreenBrightness(clampToUserSetting(brightness)); mDozeService.setDozeScreenBrightness( clampToDimBrightnessForScreenOff(clampToUserSetting(brightness))); } int scrimOpacity = -1; Loading Loading @@ -207,13 +223,21 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi /** * Clamp the brightness to the dim brightness value used by PowerManagerService just before the * device times out and goes to sleep, if we are sleeping from a timeout. This ensures that we * don't raise the brightness back to the user setting before playing the screen off animation. * don't raise the brightness back to the user setting before or during the screen off * animation. */ private int clampToDimBrightnessForScreenOff(int brightness) { if (mDozeParameters.shouldControlUnlockedScreenOff() if (mUnlockedScreenOffAnimationController.isScreenOffAnimationPlaying() && mWakefulnessLifecycle.getLastSleepReason() == PowerManager.GO_TO_SLEEP_REASON_TIMEOUT) { return Math.min(mScreenBrightnessDim, brightness); return Math.max( PowerManager.BRIGHTNESS_OFF, // Use the lower of either the dim brightness, or the current brightness reduced // by the minimum dim amount. This is the same logic used in // DisplayPowerController#updatePowerState to apply a minimum dim amount. Math.min( brightness - SCREEN_DIM_MINIMUM_REDUCTION_INT, mScreenBrightnessDim)); } else { return brightness; } Loading
packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +10 −1 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ public class DozeScreenState implements DozeMachine.Part { private final Provider<UdfpsController> mUdfpsControllerProvider; @Nullable private UdfpsController mUdfpsController; private final DozeLog mDozeLog; private final DozeScreenBrightness mDozeScreenBrightness; private int mPendingScreenState = Display.STATE_UNKNOWN; private SettableWakeLock mWakeLock; Loading @@ -90,7 +91,8 @@ public class DozeScreenState implements DozeMachine.Part { WakeLock wakeLock, AuthController authController, Provider<UdfpsController> udfpsControllerProvider, DozeLog dozeLog) { DozeLog dozeLog, DozeScreenBrightness dozeScreenBrightness) { mDozeService = service; mHandler = handler; mParameters = parameters; Loading @@ -99,6 +101,7 @@ public class DozeScreenState implements DozeMachine.Part { mAuthController = authController; mUdfpsControllerProvider = udfpsControllerProvider; mDozeLog = dozeLog; mDozeScreenBrightness = dozeScreenBrightness; updateUdfpsController(); if (mUdfpsController == null) { Loading Loading @@ -204,6 +207,12 @@ public class DozeScreenState implements DozeMachine.Part { if (screenState != Display.STATE_UNKNOWN) { if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")"); mDozeService.setDozeScreenState(screenState); if (screenState == Display.STATE_DOZE) { // If we're entering doze, update the doze screen brightness. We might have been // clamping it to the dim brightness during the screen off animation, and we should // now change it to the brightness we actually want according to the sensor. mDozeScreenBrightness.updateBrightnessAndReady(false /* force */); } mPendingScreenState = Display.STATE_UNKNOWN; mWakeLock.setAcquired(false); } Loading
packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +9 −3 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.concurrency.FakeThreadFactory; import com.android.systemui.util.sensors.AsyncSensorManager; Loading Loading @@ -86,6 +87,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { DozeParameters mDozeParameters; @Mock DockManager mDockManager; @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor); Loading Loading @@ -113,7 +116,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { mSensor = fakeSensorManager.getFakeLightSensor(); mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, Optional.of(mSensor.getSensor()), mDozeHost, null /* handler */, mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager, mUnlockedScreenOffAnimationController); } @Test Loading Loading @@ -211,7 +215,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { public void testPulsing_withoutLightSensor_setsAoDDimmingScrimTransparent() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, Optional.empty() /* sensor */, mDozeHost, null /* handler */, mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager, mUnlockedScreenOffAnimationController); mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE); reset(mDozeHost); Loading Loading @@ -240,7 +245,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { public void testNullSensor() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, Optional.empty() /* sensor */, mDozeHost, null /* handler */, mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager, mUnlockedScreenOffAnimationController); mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(INITIALIZED, DOZE_AOD); Loading
packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -82,6 +82,8 @@ public class DozeScreenStateTest extends SysuiTestCase { private UdfpsController mUdfpsController; @Mock private DozeLog mDozeLog; @Mock private DozeScreenBrightness mDozeScreenBrightness; @Before public void setUp() throws Exception { Loading @@ -96,7 +98,8 @@ public class DozeScreenStateTest extends SysuiTestCase { mHandlerFake = new FakeHandler(Looper.getMainLooper()); mWakeLock = new WakeLockFake(); mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeHost, mDozeParameters, mWakeLock, mAuthController, mUdfpsControllerProvider, mDozeLog); mWakeLock, mAuthController, mUdfpsControllerProvider, mDozeLog, mDozeScreenBrightness); } @Test Loading