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

Commit a88d234f authored by Austin Wang's avatar Austin Wang Committed by Beverly Tai
Browse files

Auto adjust screen brightness when display state on while docked

Enable the auto screen brightness for display on when docked.
DOZE_AOD_DOCKED has STATE_ON display state in cases when
we don't need to worry about registering for the brightness sensor when
the display is on (ie: getSelectivelyRegisterProxSensor=false OR
brightness sensor doesn't use prox)

With this change, devices with getSelectivelyRegisterProxSensor=true
and brightnessSensorUsesProx=true will still not register for the
brightness sensor when the display state is on.

Bug: 194151347
Test: atest DozeScreenBrightnessTest
Test: manually verify under DOZE_AOD_DOCKED on devices with and w/o
under display prox sensors / brightness sensors that use prox

Change-Id: I04f88e7639a9cb0510a985d220da91fd1fb54313
parent 19340641
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -194,6 +194,11 @@
     low powered state yet. -->
    <bool name="doze_long_press_uses_prox">true</bool>

    <!-- Doze: whether the brightness sensor uses the proximity sensor.
     If both this parameter and doze_selectively_register_prox are true, registration for the
     brightness sensor won't occur when the display state is ON. -->
    <bool name="doze_brightness_uses_prox">true</bool>

    <!-- Doze: should notifications be used as a pulse signal? -->
    <bool name="doze_pulse_on_notifications">true</bool>

+13 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.view.Display;

import com.android.systemui.dock.DockManager;
import com.android.systemui.doze.dagger.BrightnessSensor;
import com.android.systemui.doze.dagger.DozeScope;
import com.android.systemui.doze.dagger.WrappedService;
@@ -63,6 +64,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
    private final Optional<Sensor> mLightSensorOptional;
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final DozeParameters mDozeParameters;
    private final DockManager mDockManager;
    private final int[] mSensorToBrightness;
    private final int[] mSensorToScrimOpacity;
    private final int mScreenBrightnessDim;
@@ -87,7 +89,8 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
            @BrightnessSensor Optional<Sensor> lightSensorOptional, DozeHost host, Handler handler,
            AlwaysOnDisplayPolicy alwaysOnDisplayPolicy,
            WakefulnessLifecycle wakefulnessLifecycle,
            DozeParameters dozeParameters) {
            DozeParameters dozeParameters,
            DockManager dockManager) {
        mContext = context;
        mDozeService = service;
        mSensorManager = sensorManager;
@@ -96,6 +99,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
        mDozeParameters = dozeParameters;
        mDozeHost = host;
        mHandler = handler;
        mDockManager = dockManager;

        mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness;
        mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness;
@@ -122,13 +126,20 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi

    @Override
    public void onScreenState(int state) {
        if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) {
        boolean isDockedScreenOn = state == Display.STATE_ON && mDockManager.isDocked();
        if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND
                || (isDockedScreenOn && shouldRegisterLightSensorWhenScreenOnDocked())) {
            setLightSensorEnabled(true);
        } else {
            setLightSensorEnabled(false);
        }
    }

    private boolean shouldRegisterLightSensorWhenScreenOnDocked() {
        return !mDozeParameters.brightnessUsesProx()
                || !mDozeParameters.getSelectivelyRegisterSensorsUsingProx();
    }

    private void onDestroy() {
        setLightSensorEnabled(false);
    }
+8 −0
Original line number Diff line number Diff line
@@ -267,6 +267,13 @@ public class DozeParameters implements TunerService.Tunable,
        return mResources.getBoolean(R.bool.doze_long_press_uses_prox);
    }

    /**
     * Whether the brightness sensor uses the proximity sensor.
     */
    public boolean brightnessUsesProx() {
        return mResources.getBoolean(R.bool.doze_brightness_uses_prox);
    }

    /**
     * Callback to listen for DozeParameter changes.
     */
@@ -303,6 +310,7 @@ public class DozeParameters implements TunerService.Tunable,
        pw.print("getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
        pw.print("getSelectivelyRegisterSensorsUsingProx(): ");
        pw.println(getSelectivelyRegisterSensorsUsingProx());
        pw.print("brightnessUsesProx(): "); pw.println(brightnessUsesProx());
    }

    interface Callback {
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ public class DozeConfigurationUtil {
        when(params.singleTapUsesProx()).thenReturn(true);
        when(params.longPressUsesProx()).thenReturn(true);
        when(params.getQuickPickupAodDuration()).thenReturn(500);
        when(params.brightnessUsesProx()).thenReturn(true);

        doneHolder[0] = true;
        return params;
+68 −3
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
@@ -47,6 +48,7 @@ import android.view.Display;
import androidx.test.filters.SmallTest;

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.util.concurrency.FakeExecutor;
@@ -82,6 +84,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
    WakefulnessLifecycle mWakefulnessLifecycle;
    @Mock
    DozeParameters mDozeParameters;
    @Mock
    DockManager mDockManager;
    private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
    private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor);

@@ -109,7 +113,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
        mSensor = fakeSensorManager.getFakeLightSensor();
        mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
                Optional.of(mSensor.getSensor()), mDozeHost, null /* handler */,
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters);
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager);

        mScreen.onScreenState(Display.STATE_ON);
    }
@@ -156,6 +160,67 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
        assertEquals(maxBrightness, mServiceFake.screenBrightness);
    }

    @Test
    public void testAodDocked_doNotSelectivelyUseProx_usesLightSensor() {
        // GIVEN the device doesn't need to selectively register for prox sensors and
        // brightness sensor uses prox
        when(mDozeParameters.getSelectivelyRegisterSensorsUsingProx()).thenReturn(false);
        when(mDozeParameters.brightnessUsesProx()).thenReturn(true);

        // GIVEN the device is docked and the display state changes to ON
        when(mDockManager.isDocked()).thenReturn(true);
        mScreen.onScreenState(Display.STATE_ON);
        waitForSensorManager();

        // WHEN new sensor event sent
        mSensor.sendSensorEvent(3);

        // THEN brightness is updated
        assertEquals(3, mServiceFake.screenBrightness);
    }

    @Test
    public void testAodDocked_brightnessDoesNotUseProx_usesLightSensor() {
        // GIVEN the device doesn't need to selectively register for prox sensors but
        // the brightness sensor doesn't use prox
        when(mDozeParameters.getSelectivelyRegisterSensorsUsingProx()).thenReturn(true);
        when(mDozeParameters.brightnessUsesProx()).thenReturn(false);

        // GIVEN the device is docked and the display state changes to ON
        when(mDockManager.isDocked()).thenReturn(true);
        mScreen.onScreenState(Display.STATE_ON);
        waitForSensorManager();

        // WHEN new sensor event sent
        mSensor.sendSensorEvent(3);

        // THEN brightness is updated
        assertEquals(3, mServiceFake.screenBrightness);
    }


    @Test
    public void testAodDocked_noProx_brightnessUsesProx_doNotUseLightSensor() {
        final int startBrightness = mServiceFake.screenBrightness;

        // GIVEN the device needs to selectively register for prox sensors and
        // the brightness sensor uses prox
        when(mDozeParameters.getSelectivelyRegisterSensorsUsingProx()).thenReturn(true);
        when(mDozeParameters.brightnessUsesProx()).thenReturn(true);

        // GIVEN the device is docked and the display state is on
        when(mDockManager.isDocked()).thenReturn(true);
        mScreen.onScreenState(Display.STATE_ON);
        waitForSensorManager();

        // WHEN new sensor event sent
        mSensor.sendSensorEvent(3);

        // THEN brightness is NOT changed
        assertNotSame(3, mServiceFake.screenBrightness);
        assertEquals(startBrightness, mServiceFake.screenBrightness);
    }

    @Test
    public void testPausingAod_doesNotResetBrightness() throws Exception {
        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
@@ -175,7 +240,7 @@ 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);
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager);
        mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
        mScreen.transitionTo(INITIALIZED, DOZE);
        reset(mDozeHost);
@@ -216,7 +281,7 @@ 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);
                mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager);

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