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

Commit 384af4ae authored by Josh Tsuji's avatar Josh Tsuji Committed by Automerger Merge Worker
Browse files

Merge "Clamp brightness to dim value if we're timing out and playing the...

Merge "Clamp brightness to dim value if we're timing out and playing the screen off animation." into sc-dev am: 8938a91f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15182384

Change-Id: I07a4722957a1c82a656230441c23ee81149b552e
parents fe884ea9 8938a91f
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,13 @@ public class AlwaysOnDisplayPolicy {
     */
     */
    public int defaultDozeBrightness;
    public int defaultDozeBrightness;


    /**
     * Integer used to dim the screen just before the screen turns off.
     *
     * @see R.integer.config_screenBrightnessDim
     */
    public int dimBrightness;

    /**
    /**
     * Integer array to map ambient brightness type to real screen brightness.
     * Integer array to map ambient brightness type to real screen brightness.
     *
     *
@@ -175,6 +182,8 @@ public class AlwaysOnDisplayPolicy {
                        DEFAULT_WALLPAPER_VISIBILITY_MS);
                        DEFAULT_WALLPAPER_VISIBILITY_MS);
                defaultDozeBrightness = resources.getInteger(
                defaultDozeBrightness = resources.getInteger(
                        com.android.internal.R.integer.config_screenBrightnessDoze);
                        com.android.internal.R.integer.config_screenBrightnessDoze);
                dimBrightness = resources.getInteger(
                        com.android.internal.R.integer.config_screenBrightnessDim);
                screenBrightnessArray = mParser.getIntArray(KEY_SCREEN_BRIGHTNESS_ARRAY,
                screenBrightnessArray = mParser.getIntArray(KEY_SCREEN_BRIGHTNESS_ARRAY,
                        resources.getIntArray(
                        resources.getIntArray(
                                R.array.config_doze_brightness_sensor_to_brightness));
                                R.array.config_doze_brightness_sensor_to_brightness));
+30 −2
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.SensorManager;
import android.os.Handler;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserHandle;
@@ -33,6 +34,8 @@ import android.view.Display;
import com.android.systemui.doze.dagger.BrightnessSensor;
import com.android.systemui.doze.dagger.BrightnessSensor;
import com.android.systemui.doze.dagger.DozeScope;
import com.android.systemui.doze.dagger.DozeScope;
import com.android.systemui.doze.dagger.WrappedService;
import com.android.systemui.doze.dagger.WrappedService;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.AsyncSensorManager;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -58,8 +61,11 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
    private final Handler mHandler;
    private final Handler mHandler;
    private final SensorManager mSensorManager;
    private final SensorManager mSensorManager;
    private final Optional<Sensor> mLightSensorOptional;
    private final Optional<Sensor> mLightSensorOptional;
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final DozeParameters mDozeParameters;
    private final int[] mSensorToBrightness;
    private final int[] mSensorToBrightness;
    private final int[] mSensorToScrimOpacity;
    private final int[] mSensorToScrimOpacity;
    private final int mScreenBrightnessDim;


    private boolean mRegistered;
    private boolean mRegistered;
    private int mDefaultDozeBrightness;
    private int mDefaultDozeBrightness;
@@ -79,15 +85,20 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
    public DozeScreenBrightness(Context context, @WrappedService DozeMachine.Service service,
    public DozeScreenBrightness(Context context, @WrappedService DozeMachine.Service service,
            AsyncSensorManager sensorManager,
            AsyncSensorManager sensorManager,
            @BrightnessSensor Optional<Sensor> lightSensorOptional, DozeHost host, Handler handler,
            @BrightnessSensor Optional<Sensor> lightSensorOptional, DozeHost host, Handler handler,
            AlwaysOnDisplayPolicy alwaysOnDisplayPolicy) {
            AlwaysOnDisplayPolicy alwaysOnDisplayPolicy,
            WakefulnessLifecycle wakefulnessLifecycle,
            DozeParameters dozeParameters) {
        mContext = context;
        mContext = context;
        mDozeService = service;
        mDozeService = service;
        mSensorManager = sensorManager;
        mSensorManager = sensorManager;
        mLightSensorOptional = lightSensorOptional;
        mLightSensorOptional = lightSensorOptional;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mDozeParameters = dozeParameters;
        mDozeHost = host;
        mDozeHost = host;
        mHandler = handler;
        mHandler = handler;


        mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness;
        mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness;
        mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness;
        mSensorToBrightness = alwaysOnDisplayPolicy.screenBrightnessArray;
        mSensorToBrightness = alwaysOnDisplayPolicy.screenBrightnessArray;
        mSensorToScrimOpacity = alwaysOnDisplayPolicy.dimmingScrimArray;
        mSensorToScrimOpacity = alwaysOnDisplayPolicy.dimmingScrimArray;
    }
    }
@@ -178,7 +189,9 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
    }
    }


    private void resetBrightnessToDefault() {
    private void resetBrightnessToDefault() {
        mDozeService.setDozeScreenBrightness(clampToUserSetting(mDefaultDozeBrightness));
        mDozeService.setDozeScreenBrightness(
                clampToDimBrightnessForScreenOff(
                        clampToUserSetting(mDefaultDozeBrightness)));
        mDozeHost.setAodDimmingScrim(0f);
        mDozeHost.setAodDimmingScrim(0f);
    }
    }
    //TODO: brightnessfloat change usages to float.
    //TODO: brightnessfloat change usages to float.
@@ -189,6 +202,21 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
        return Math.min(brightness, userSetting);
        return Math.min(brightness, userSetting);
    }
    }


    /**
     * 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.
     */
    private int clampToDimBrightnessForScreenOff(int brightness) {
        if (mDozeParameters.shouldControlUnlockedScreenOff()
                && mWakefulnessLifecycle.getLastSleepReason()
                == PowerManager.GO_TO_SLEEP_REASON_TIMEOUT) {
            return Math.min(mScreenBrightnessDim, brightness);
        } else {
            return brightness;
        }
    }

    private void setLightSensorEnabled(boolean enabled) {
    private void setLightSensorEnabled(boolean enabled) {
        if (enabled && !mRegistered && mLightSensorOptional.isPresent()) {
        if (enabled && !mRegistered && mLightSensorOptional.isPresent()) {
            // Wait until we get an event from the sensor until indicating ready.
            // Wait until we get an event from the sensor until indicating ready.
+53 −3
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;


import android.content.Intent;
import android.content.Intent;
import android.os.PowerManager;
import android.os.PowerManager;
@@ -46,6 +47,8 @@ import android.view.Display;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.concurrency.FakeThreadFactory;
import com.android.systemui.util.concurrency.FakeThreadFactory;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.AsyncSensorManager;
@@ -65,6 +68,7 @@ import java.util.Optional;
public class DozeScreenBrightnessTest extends SysuiTestCase {
public class DozeScreenBrightnessTest extends SysuiTestCase {


    private static final int DEFAULT_BRIGHTNESS = 10;
    private static final int DEFAULT_BRIGHTNESS = 10;
    private static final int DIM_BRIGHTNESS = 1;
    private static final int[] SENSOR_TO_BRIGHTNESS = new int[]{-1, 1, 2, 3, 4};
    private static final int[] SENSOR_TO_BRIGHTNESS = new int[]{-1, 1, 2, 3, 4};
    private static final int[] SENSOR_TO_OPACITY = new int[]{-1, 10, 0, 0, 0};
    private static final int[] SENSOR_TO_OPACITY = new int[]{-1, 10, 0, 0, 0};


@@ -74,6 +78,10 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
    private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
    private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
    @Mock
    @Mock
    DozeHost mDozeHost;
    DozeHost mDozeHost;
    @Mock
    WakefulnessLifecycle mWakefulnessLifecycle;
    @Mock
    DozeParameters mDozeParameters;
    private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor);
    private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor);


@@ -96,11 +104,12 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
        mAlwaysOnDisplayPolicy = new AlwaysOnDisplayPolicy(mContext);
        mAlwaysOnDisplayPolicy = new AlwaysOnDisplayPolicy(mContext);
        mAlwaysOnDisplayPolicy.defaultDozeBrightness = DEFAULT_BRIGHTNESS;
        mAlwaysOnDisplayPolicy.defaultDozeBrightness = DEFAULT_BRIGHTNESS;
        mAlwaysOnDisplayPolicy.screenBrightnessArray = SENSOR_TO_BRIGHTNESS;
        mAlwaysOnDisplayPolicy.screenBrightnessArray = SENSOR_TO_BRIGHTNESS;
        mAlwaysOnDisplayPolicy.dimBrightness = DIM_BRIGHTNESS;
        mAlwaysOnDisplayPolicy.dimmingScrimArray = SENSOR_TO_OPACITY;
        mAlwaysOnDisplayPolicy.dimmingScrimArray = SENSOR_TO_OPACITY;
        mSensor = fakeSensorManager.getFakeLightSensor();
        mSensor = fakeSensorManager.getFakeLightSensor();
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                Optional.of(mSensor.getSensor()), mDozeHost, null /* handler */,
                Optional.of(mSensor.getSensor()), mDozeHost, null /* handler */,
                mAlwaysOnDisplayPolicy);
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);


        mScreen.onScreenState(Display.STATE_ON);
        mScreen.onScreenState(Display.STATE_ON);
    }
    }
@@ -166,7 +175,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
    public void testPulsing_withoutLightSensor_setsAoDDimmingScrimTransparent() throws Exception {
    public void testPulsing_withoutLightSensor_setsAoDDimmingScrimTransparent() throws Exception {
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                Optional.empty() /* sensor */, mDozeHost, null /* handler */,
                Optional.empty() /* sensor */, mDozeHost, null /* handler */,
                mAlwaysOnDisplayPolicy);
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);
        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(INITIALIZED, DOZE);
        mScreen.transitionTo(INITIALIZED, DOZE);
        reset(mDozeHost);
        reset(mDozeHost);
@@ -207,7 +216,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
    public void testNullSensor() throws Exception {
    public void testNullSensor() throws Exception {
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                Optional.empty() /* sensor */, mDozeHost, null /* handler */,
                Optional.empty() /* sensor */, mDozeHost, null /* handler */,
                mAlwaysOnDisplayPolicy);
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);


        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(INITIALIZED, DOZE_AOD);
        mScreen.transitionTo(INITIALIZED, DOZE_AOD);
@@ -282,6 +291,47 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
        verify(mDozeHost).setAodDimmingScrim(eq(0f));
        verify(mDozeHost).setAodDimmingScrim(eq(0f));
    }
    }


    @Test
    public void transitionToDoze_duringScreenOff_afterTimeout_clampsToDim() {
        when(mWakefulnessLifecycle.getLastSleepReason()).thenReturn(
                PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
        when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true);

        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(INITIALIZED, DOZE);

        // If we're dozing after a timeout, and playing the unlocked screen animation, we should
        // stay at dim brightness, because the screen dims just before timeout.
        assertEquals(mServiceFake.screenBrightness, DIM_BRIGHTNESS);
    }

    @Test
    public void transitionToDoze_duringScreenOff_notAfterTimeout_doesNotClampToDim() {
        when(mWakefulnessLifecycle.getLastSleepReason()).thenReturn(
                PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON);
        when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(true);

        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(INITIALIZED, DOZE);

        // If we're playing the unlocked screen off animation after a power button press, we should
        // leave the brightness alone.
        assertEquals(mServiceFake.screenBrightness, DEFAULT_BRIGHTNESS);
    }

    @Test
    public void transitionToDoze_duringScreenOff_afterTimeout_noScreenOff_doesNotClampToDim() {
        when(mWakefulnessLifecycle.getLastSleepReason()).thenReturn(
                PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
        when(mDozeParameters.shouldControlUnlockedScreenOff()).thenReturn(false);

        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(INITIALIZED, DOZE);

        // If we aren't controlling the screen off animation, we should leave the brightness alone.
        assertEquals(mServiceFake.screenBrightness, DEFAULT_BRIGHTNESS);
    }

    private void waitForSensorManager() {
    private void waitForSensorManager() {
        mFakeExecutor.runAllReady();
        mFakeExecutor.runAllReady();
    }
    }