Loading services/core/java/com/android/server/display/AutomaticBrightnessController.java +10 −4 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.util.MathUtils; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; Loading Loading @@ -235,6 +236,8 @@ public class AutomaticBrightnessController { // where the light sensor may not be available. private int mDisplayPolicy = DisplayPowerRequest.POLICY_OFF; private int mDisplayState = Display.STATE_UNKNOWN; // True if we are collecting a brightness adjustment sample, along with some data // for the initial state of the sample. private boolean mBrightnessAdjustmentSamplePending; Loading Loading @@ -458,11 +461,12 @@ public class AutomaticBrightnessController { public void configure(int state, @Nullable BrightnessConfiguration configuration, float brightness, boolean userChangedBrightness, float adjustment, boolean userChangedAutoBrightnessAdjustment, int displayPolicy, boolean userChangedAutoBrightnessAdjustment, int displayPolicy, int displayState, boolean shouldResetShortTermModel) { mState = state; boolean changed = setBrightnessConfiguration(configuration, shouldResetShortTermModel); changed |= setDisplayPolicy(displayPolicy); mDisplayState = displayState; if (userChangedAutoBrightnessAdjustment) { changed |= setAutoBrightnessAdjustment(adjustment); } Loading Loading @@ -1262,9 +1266,11 @@ public class AutomaticBrightnessController { } private boolean shouldApplyDozeScaleFactor() { // Don't apply the doze scale factor if we have a designated brightness curve for doze return mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE && getMode() != AUTO_BRIGHTNESS_MODE_DOZE; // Apply the doze scale factor if the display is in doze. We shouldn't rely on the display // policy here - the screen might turn on while the policy is POLICY_DOZE and in this // situation, we shouldn't apply the doze scale factor. We also don't apply the doze scale // factor if we have a designated brightness curve for doze. return Display.isDozeState(mDisplayState) && getMode() != AUTO_BRIGHTNESS_MODE_DOZE; } private class ShortTermModel { Loading services/core/java/com/android/server/display/DisplayPowerController.java +2 −2 Original line number Diff line number Diff line Loading @@ -1478,7 +1478,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // If there's an offload session, we need to set the initial doze brightness before // the offload session starts controlling the brightness. if (Float.isNaN(brightnessState) && mFlags.isDisplayOffloadEnabled() && mPowerRequest.policy == POLICY_DOZE && mDisplayOffloadSession != null) { && Display.isDozeState(state) && mDisplayOffloadSession != null) { if (mAutomaticBrightnessController != null && mAutomaticBrightnessStrategy.shouldUseAutoBrightness()) { // Use the auto-brightness curve and the last observed lux Loading @@ -1498,7 +1498,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } // Use default brightness when dozing unless overridden. if (Float.isNaN(brightnessState) && mPowerRequest.policy == POLICY_DOZE) { if (Float.isNaN(brightnessState) && Display.isDozeState(state)) { rawBrightnessState = mScreenBrightnessDozeConfig; brightnessState = clampScreenBrightness(rawBrightnessState); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT); Loading services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java +4 −3 Original line number Diff line number Diff line Loading @@ -119,7 +119,7 @@ public class AutomaticBrightnessStrategy { : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED; accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness, policy, mBrightnessConfiguration, autoBrightnessState); policy, targetDisplayState, mBrightnessConfiguration, autoBrightnessState); } public boolean isAutoBrightnessEnabled() { Loading Loading @@ -372,7 +372,7 @@ public class AutomaticBrightnessStrategy { */ @VisibleForTesting void accommodateUserBrightnessChanges(boolean userSetBrightnessChanged, float lastUserSetScreenBrightness, int policy, float lastUserSetScreenBrightness, int policy, int displayState, BrightnessConfiguration brightnessConfiguration, int autoBrightnessState) { // Update the pending auto-brightness adjustments if any. This typically checks and adjusts // the state of the class if the user moves the brightness slider and has settled to a Loading @@ -390,7 +390,8 @@ public class AutomaticBrightnessStrategy { brightnessConfiguration, lastUserSetScreenBrightness, userSetBrightnessChanged, autoBrightnessAdjustment, mAutoBrightnessAdjustmentChanged, policy, mShouldResetShortTermModel); mAutoBrightnessAdjustmentChanged, policy, displayState, mShouldResetShortTermModel); mShouldResetShortTermModel = false; // We take note if the user brightness point is still being used in the current // auto-brightness model. Loading services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java +53 −18 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.os.Handler; import android.os.PowerManager; import android.os.test.TestLooper; import android.util.SparseArray; import android.view.Display; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; Loading Loading @@ -175,7 +176,7 @@ public class AutomaticBrightnessControllerTest { // through which we can deliver fake (for test) sensor values. mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0 /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); } Loading Loading @@ -281,7 +282,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // There should be a user data point added to the mapper. Loading @@ -305,7 +306,7 @@ public class AutomaticBrightnessControllerTest { null, ApplicationInfo.CATEGORY_UNDEFINED)).thenReturn(0.5f); mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); //Recalculating the spline with RBC enabled, verifying that the short term model is reset, Loading Loading @@ -339,7 +340,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); Loading Loading @@ -379,7 +380,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.51f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.shouldResetShortTermModel( Loading Loading @@ -419,7 +420,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); Loading Loading @@ -465,7 +466,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); Loading Loading @@ -552,7 +553,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // There should be a user data point added to the mapper. Loading @@ -579,7 +580,7 @@ public class AutomaticBrightnessControllerTest { // User sets idle brightness to 0.5 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // Ensure we use the correct mapping strategy Loading Loading @@ -741,7 +742,7 @@ public class AutomaticBrightnessControllerTest { mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ true); Display.STATE_ON, /* shouldResetShortTermModel= */ true); assertEquals(throttledBrightness, mController.getAutomaticScreenBrightness(), 0.0f); // The raw brightness value should not have throttling applied assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getRawAutomaticScreenBrightness(), 0.0f); Loading @@ -752,7 +753,7 @@ public class AutomaticBrightnessControllerTest { mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ true); Display.STATE_ON, /* shouldResetShortTermModel= */ true); assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getAutomaticScreenBrightness(), 0.0f); assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getRawAutomaticScreenBrightness(), 0.0f); } Loading Loading @@ -852,13 +853,13 @@ public class AutomaticBrightnessControllerTest { mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false); Display.STATE_ON, /* shouldResetShortTermModel= */ false); verify(mBrightnessMappingStrategy, never()).clearUserDataPoints(); mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ true); Display.STATE_ON, /* shouldResetShortTermModel= */ true); verify(mBrightnessMappingStrategy).clearUserDataPoints(); } Loading Loading @@ -1045,7 +1046,7 @@ public class AutomaticBrightnessControllerTest { listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux)); mController.configure(AUTO_BRIGHTNESS_DISABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightnessBasedOnLastObservedLux( Loading @@ -1053,7 +1054,7 @@ public class AutomaticBrightnessControllerTest { } @Test public void testAutoBrightnessInDoze_ShouldScaleIfNotUsingDozeCurve() throws Exception { public void testAutoBrightnessInDoze() throws Exception { ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor), Loading @@ -1073,7 +1074,7 @@ public class AutomaticBrightnessControllerTest { // Set policy to DOZE mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, Display.STATE_DOZE, /* shouldResetShortTermModel= */ true); // Send a new sensor value Loading Loading @@ -1112,7 +1113,7 @@ public class AutomaticBrightnessControllerTest { // Set policy to DOZE mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, Display.STATE_DOZE, /* shouldResetShortTermModel= */ true); // Send a new sensor value Loading @@ -1120,8 +1121,42 @@ public class AutomaticBrightnessControllerTest { // The brightness should not be scaled by the doze factor assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightness( mController.getAutomaticScreenBrightness(/* brightnessEvent= */ null), EPSILON); assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightnessBasedOnLastObservedLux( /* brightnessEvent= */ null), EPSILON); } @Test public void testAutoBrightnessInDoze_ShouldNotScaleIfScreenOn() throws Exception { ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor), eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class)); SensorEventListener listener = listenerCaptor.getValue(); // Set up system to return 0.3f as a brightness value float lux = 100.0f; // Brightness as float (from 0.0f to 1.0f) float normalizedBrightness = 0.3f; when(mAmbientBrightnessThresholds.getBrighteningThreshold(lux)).thenReturn(lux); when(mAmbientBrightnessThresholds.getDarkeningThreshold(lux)).thenReturn(lux); when(mBrightnessMappingStrategy.getBrightness(eq(lux), /* packageName= */ eq(null), /* category= */ anyInt())).thenReturn(normalizedBrightness); when(mBrightnessThrottler.getBrightnessCap()).thenReturn(BRIGHTNESS_MAX_FLOAT); // Set policy to DOZE mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // Send a new sensor value listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux)); // The brightness should not be scaled by the doze factor assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightness(/* brightnessEvent= */ null), EPSILON); assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightnessBasedOnLastObservedLux( /* brightnessEvent= */ null), EPSILON); Loading services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +8 −6 Original line number Diff line number Diff line Loading @@ -982,7 +982,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false Display.STATE_ON, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController) .setAutoBrightnessEnabled(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED); Loading @@ -1008,7 +1008,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_DOZE, /* shouldResetShortTermModel= */ false Display.STATE_DOZE, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController) .setAutoBrightnessEnabled(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED); Loading @@ -1031,7 +1031,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false Display.STATE_ON, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController) .setAutoBrightnessEnabled(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED); Loading @@ -1054,7 +1054,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_OFF, /* shouldResetShortTermModel= */ false Display.STATE_OFF, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController).setAutoBrightnessEnabled( AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE); Loading @@ -1080,7 +1080,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_DOZE, /* shouldResetShortTermModel= */ false Display.STATE_DOZE, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController).setAutoBrightnessEnabled( AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE); Loading @@ -1104,7 +1104,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false Display.STATE_ON, /* shouldResetShortTermModel= */ false ); // HBM should be allowed for the follower display Loading Loading @@ -1697,6 +1697,7 @@ public final class DisplayPowerControllerTest { /* adjustment= */ anyFloat(), /* userChangedAutoBrightnessAdjustment= */ anyBoolean(), /* displayPolicy= */ anyInt(), /* displayState= */ anyInt(), /* shouldResetShortTermModel= */ anyBoolean()); verify(mBrightnessTrackerMock, never()).notifyBrightnessChanged( /* brightness= */ anyFloat(), Loading Loading @@ -1815,6 +1816,7 @@ public final class DisplayPowerControllerTest { any(BrightnessEvent.class))).thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); when(mHolder.hbmController.getCurrentBrightnessMax()) .thenReturn(PowerManager.BRIGHTNESS_MAX); when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_DOZE); DisplayPowerRequest dpr = new DisplayPowerRequest(); dpr.policy = DisplayPowerRequest.POLICY_DOZE; Loading Loading
services/core/java/com/android/server/display/AutomaticBrightnessController.java +10 −4 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.util.MathUtils; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; Loading Loading @@ -235,6 +236,8 @@ public class AutomaticBrightnessController { // where the light sensor may not be available. private int mDisplayPolicy = DisplayPowerRequest.POLICY_OFF; private int mDisplayState = Display.STATE_UNKNOWN; // True if we are collecting a brightness adjustment sample, along with some data // for the initial state of the sample. private boolean mBrightnessAdjustmentSamplePending; Loading Loading @@ -458,11 +461,12 @@ public class AutomaticBrightnessController { public void configure(int state, @Nullable BrightnessConfiguration configuration, float brightness, boolean userChangedBrightness, float adjustment, boolean userChangedAutoBrightnessAdjustment, int displayPolicy, boolean userChangedAutoBrightnessAdjustment, int displayPolicy, int displayState, boolean shouldResetShortTermModel) { mState = state; boolean changed = setBrightnessConfiguration(configuration, shouldResetShortTermModel); changed |= setDisplayPolicy(displayPolicy); mDisplayState = displayState; if (userChangedAutoBrightnessAdjustment) { changed |= setAutoBrightnessAdjustment(adjustment); } Loading Loading @@ -1262,9 +1266,11 @@ public class AutomaticBrightnessController { } private boolean shouldApplyDozeScaleFactor() { // Don't apply the doze scale factor if we have a designated brightness curve for doze return mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE && getMode() != AUTO_BRIGHTNESS_MODE_DOZE; // Apply the doze scale factor if the display is in doze. We shouldn't rely on the display // policy here - the screen might turn on while the policy is POLICY_DOZE and in this // situation, we shouldn't apply the doze scale factor. We also don't apply the doze scale // factor if we have a designated brightness curve for doze. return Display.isDozeState(mDisplayState) && getMode() != AUTO_BRIGHTNESS_MODE_DOZE; } private class ShortTermModel { Loading
services/core/java/com/android/server/display/DisplayPowerController.java +2 −2 Original line number Diff line number Diff line Loading @@ -1478,7 +1478,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // If there's an offload session, we need to set the initial doze brightness before // the offload session starts controlling the brightness. if (Float.isNaN(brightnessState) && mFlags.isDisplayOffloadEnabled() && mPowerRequest.policy == POLICY_DOZE && mDisplayOffloadSession != null) { && Display.isDozeState(state) && mDisplayOffloadSession != null) { if (mAutomaticBrightnessController != null && mAutomaticBrightnessStrategy.shouldUseAutoBrightness()) { // Use the auto-brightness curve and the last observed lux Loading @@ -1498,7 +1498,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } // Use default brightness when dozing unless overridden. if (Float.isNaN(brightnessState) && mPowerRequest.policy == POLICY_DOZE) { if (Float.isNaN(brightnessState) && Display.isDozeState(state)) { rawBrightnessState = mScreenBrightnessDozeConfig; brightnessState = clampScreenBrightness(rawBrightnessState); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT); Loading
services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java +4 −3 Original line number Diff line number Diff line Loading @@ -119,7 +119,7 @@ public class AutomaticBrightnessStrategy { : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED; accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness, policy, mBrightnessConfiguration, autoBrightnessState); policy, targetDisplayState, mBrightnessConfiguration, autoBrightnessState); } public boolean isAutoBrightnessEnabled() { Loading Loading @@ -372,7 +372,7 @@ public class AutomaticBrightnessStrategy { */ @VisibleForTesting void accommodateUserBrightnessChanges(boolean userSetBrightnessChanged, float lastUserSetScreenBrightness, int policy, float lastUserSetScreenBrightness, int policy, int displayState, BrightnessConfiguration brightnessConfiguration, int autoBrightnessState) { // Update the pending auto-brightness adjustments if any. This typically checks and adjusts // the state of the class if the user moves the brightness slider and has settled to a Loading @@ -390,7 +390,8 @@ public class AutomaticBrightnessStrategy { brightnessConfiguration, lastUserSetScreenBrightness, userSetBrightnessChanged, autoBrightnessAdjustment, mAutoBrightnessAdjustmentChanged, policy, mShouldResetShortTermModel); mAutoBrightnessAdjustmentChanged, policy, displayState, mShouldResetShortTermModel); mShouldResetShortTermModel = false; // We take note if the user brightness point is still being used in the current // auto-brightness model. Loading
services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java +53 −18 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.os.Handler; import android.os.PowerManager; import android.os.test.TestLooper; import android.util.SparseArray; import android.view.Display; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; Loading Loading @@ -175,7 +176,7 @@ public class AutomaticBrightnessControllerTest { // through which we can deliver fake (for test) sensor values. mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0 /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); } Loading Loading @@ -281,7 +282,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // There should be a user data point added to the mapper. Loading @@ -305,7 +306,7 @@ public class AutomaticBrightnessControllerTest { null, ApplicationInfo.CATEGORY_UNDEFINED)).thenReturn(0.5f); mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); //Recalculating the spline with RBC enabled, verifying that the short term model is reset, Loading Loading @@ -339,7 +340,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); Loading Loading @@ -379,7 +380,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.51f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.shouldResetShortTermModel( Loading Loading @@ -419,7 +420,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); Loading Loading @@ -465,7 +466,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0.5f, /* userChangedBrightness= */ true, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); Loading Loading @@ -552,7 +553,7 @@ public class AutomaticBrightnessControllerTest { // User sets brightness to 100 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // There should be a user data point added to the mapper. Loading @@ -579,7 +580,7 @@ public class AutomaticBrightnessControllerTest { // User sets idle brightness to 0.5 mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, 0.5f /* brightness= */, true /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // Ensure we use the correct mapping strategy Loading Loading @@ -741,7 +742,7 @@ public class AutomaticBrightnessControllerTest { mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ true); Display.STATE_ON, /* shouldResetShortTermModel= */ true); assertEquals(throttledBrightness, mController.getAutomaticScreenBrightness(), 0.0f); // The raw brightness value should not have throttling applied assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getRawAutomaticScreenBrightness(), 0.0f); Loading @@ -752,7 +753,7 @@ public class AutomaticBrightnessControllerTest { mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ true); Display.STATE_ON, /* shouldResetShortTermModel= */ true); assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getAutomaticScreenBrightness(), 0.0f); assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getRawAutomaticScreenBrightness(), 0.0f); } Loading Loading @@ -852,13 +853,13 @@ public class AutomaticBrightnessControllerTest { mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false); Display.STATE_ON, /* shouldResetShortTermModel= */ false); verify(mBrightnessMappingStrategy, never()).clearUserDataPoints(); mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, BRIGHTNESS_MAX_FLOAT /* brightness= */, false /* userChangedBrightness= */, 0 /* adjustment= */, false /* userChanged= */, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ true); Display.STATE_ON, /* shouldResetShortTermModel= */ true); verify(mBrightnessMappingStrategy).clearUserDataPoints(); } Loading Loading @@ -1045,7 +1046,7 @@ public class AutomaticBrightnessControllerTest { listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux)); mController.configure(AUTO_BRIGHTNESS_DISABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* userChanged= */ false, DisplayPowerRequest.POLICY_BRIGHT, Display.STATE_ON, /* shouldResetShortTermModel= */ true); assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightnessBasedOnLastObservedLux( Loading @@ -1053,7 +1054,7 @@ public class AutomaticBrightnessControllerTest { } @Test public void testAutoBrightnessInDoze_ShouldScaleIfNotUsingDozeCurve() throws Exception { public void testAutoBrightnessInDoze() throws Exception { ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor), Loading @@ -1073,7 +1074,7 @@ public class AutomaticBrightnessControllerTest { // Set policy to DOZE mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, Display.STATE_DOZE, /* shouldResetShortTermModel= */ true); // Send a new sensor value Loading Loading @@ -1112,7 +1113,7 @@ public class AutomaticBrightnessControllerTest { // Set policy to DOZE mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, Display.STATE_DOZE, /* shouldResetShortTermModel= */ true); // Send a new sensor value Loading @@ -1120,8 +1121,42 @@ public class AutomaticBrightnessControllerTest { // The brightness should not be scaled by the doze factor assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightness( mController.getAutomaticScreenBrightness(/* brightnessEvent= */ null), EPSILON); assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightnessBasedOnLastObservedLux( /* brightnessEvent= */ null), EPSILON); } @Test public void testAutoBrightnessInDoze_ShouldNotScaleIfScreenOn() throws Exception { ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor), eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class)); SensorEventListener listener = listenerCaptor.getValue(); // Set up system to return 0.3f as a brightness value float lux = 100.0f; // Brightness as float (from 0.0f to 1.0f) float normalizedBrightness = 0.3f; when(mAmbientBrightnessThresholds.getBrighteningThreshold(lux)).thenReturn(lux); when(mAmbientBrightnessThresholds.getDarkeningThreshold(lux)).thenReturn(lux); when(mBrightnessMappingStrategy.getBrightness(eq(lux), /* packageName= */ eq(null), /* category= */ anyInt())).thenReturn(normalizedBrightness); when(mBrightnessThrottler.getBrightnessCap()).thenReturn(BRIGHTNESS_MAX_FLOAT); // Set policy to DOZE mController.configure(AUTO_BRIGHTNESS_ENABLED, /* configuration= */ null, /* brightness= */ 0, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChanged= */ false, DisplayPowerRequest.POLICY_DOZE, Display.STATE_ON, /* shouldResetShortTermModel= */ true); // Send a new sensor value listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux)); // The brightness should not be scaled by the doze factor assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightness(/* brightnessEvent= */ null), EPSILON); assertEquals(normalizedBrightness, mController.getAutomaticScreenBrightnessBasedOnLastObservedLux( /* brightnessEvent= */ null), EPSILON); Loading
services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +8 −6 Original line number Diff line number Diff line Loading @@ -982,7 +982,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false Display.STATE_ON, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController) .setAutoBrightnessEnabled(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED); Loading @@ -1008,7 +1008,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_DOZE, /* shouldResetShortTermModel= */ false Display.STATE_DOZE, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController) .setAutoBrightnessEnabled(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED); Loading @@ -1031,7 +1031,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false Display.STATE_ON, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController) .setAutoBrightnessEnabled(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED); Loading @@ -1054,7 +1054,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_OFF, /* shouldResetShortTermModel= */ false Display.STATE_OFF, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController).setAutoBrightnessEnabled( AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE); Loading @@ -1080,7 +1080,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_DOZE, /* shouldResetShortTermModel= */ false Display.STATE_DOZE, /* shouldResetShortTermModel= */ false ); verify(mHolder.hbmController).setAutoBrightnessEnabled( AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE); Loading @@ -1104,7 +1104,7 @@ public final class DisplayPowerControllerTest { /* configuration= */ null, PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userChangedBrightness= */ false, /* adjustment= */ 0, /* userChangedAutoBrightnessAdjustment= */ false, DisplayPowerRequest.POLICY_BRIGHT, /* shouldResetShortTermModel= */ false Display.STATE_ON, /* shouldResetShortTermModel= */ false ); // HBM should be allowed for the follower display Loading Loading @@ -1697,6 +1697,7 @@ public final class DisplayPowerControllerTest { /* adjustment= */ anyFloat(), /* userChangedAutoBrightnessAdjustment= */ anyBoolean(), /* displayPolicy= */ anyInt(), /* displayState= */ anyInt(), /* shouldResetShortTermModel= */ anyBoolean()); verify(mBrightnessTrackerMock, never()).notifyBrightnessChanged( /* brightness= */ anyFloat(), Loading Loading @@ -1815,6 +1816,7 @@ public final class DisplayPowerControllerTest { any(BrightnessEvent.class))).thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); when(mHolder.hbmController.getCurrentBrightnessMax()) .thenReturn(PowerManager.BRIGHTNESS_MAX); when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_DOZE); DisplayPowerRequest dpr = new DisplayPowerRequest(); dpr.policy = DisplayPowerRequest.POLICY_DOZE; Loading