Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0b08bc1 authored by Piotr Wilczyński's avatar Piotr Wilczyński Committed by Android (Google) Code Review
Browse files

Merge "Fix Wear brightness after tilt-to-wake" into main

parents 8db6daa3 a3e0371d
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
        }
@@ -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 {
+2 −2
Original line number Diff line number Diff line
@@ -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
@@ -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);
+4 −3
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ public class AutomaticBrightnessStrategy {
                        : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED;

        accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness,
                policy, mBrightnessConfiguration, autoBrightnessState);
                policy, targetDisplayState, mBrightnessConfiguration, autoBrightnessState);
    }

    public boolean isAutoBrightnessEnabled() {
@@ -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
@@ -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.
+53 −18
Original line number Diff line number Diff line
@@ -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;
@@ -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);
    }

@@ -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.
@@ -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,
@@ -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);
@@ -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(
@@ -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);
@@ -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);
@@ -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.
@@ -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
@@ -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);
@@ -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);
    }
@@ -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();
    }

@@ -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(
@@ -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),
@@ -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
@@ -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
@@ -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);
+8 −6
Original line number Diff line number Diff line
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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
@@ -1697,6 +1697,7 @@ public final class DisplayPowerControllerTest {
                /* adjustment= */ anyFloat(),
                /* userChangedAutoBrightnessAdjustment= */ anyBoolean(),
                /* displayPolicy= */ anyInt(),
                /* displayState= */ anyInt(),
                /* shouldResetShortTermModel= */ anyBoolean());
        verify(mBrightnessTrackerMock, never()).notifyBrightnessChanged(
                /* brightness= */ anyFloat(),
@@ -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