Merge "Auto adjust screen brightness when display state on while docked" into sc-qpr1-dev

This commit is contained in:
Beverly Tai
2021-08-17 13:53:56 +00:00
committed by Android (Google) Code Review
5 changed files with 95 additions and 5 deletions

View File

@@ -194,6 +194,11 @@
low powered state yet. --> low powered state yet. -->
<bool name="doze_long_press_uses_prox">true</bool> <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? --> <!-- Doze: should notifications be used as a pulse signal? -->
<bool name="doze_pulse_on_notifications">true</bool> <bool name="doze_pulse_on_notifications">true</bool>

View File

@@ -31,6 +31,7 @@ import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.view.Display; import android.view.Display;
import com.android.systemui.dock.DockManager;
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;
@@ -63,6 +64,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
private final Optional<Sensor> mLightSensorOptional; private final Optional<Sensor> mLightSensorOptional;
private final WakefulnessLifecycle mWakefulnessLifecycle; private final WakefulnessLifecycle mWakefulnessLifecycle;
private final DozeParameters mDozeParameters; private final DozeParameters mDozeParameters;
private final DockManager mDockManager;
private final int[] mSensorToBrightness; private final int[] mSensorToBrightness;
private final int[] mSensorToScrimOpacity; private final int[] mSensorToScrimOpacity;
private final int mScreenBrightnessDim; private final int mScreenBrightnessDim;
@@ -87,7 +89,8 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
@BrightnessSensor Optional<Sensor> lightSensorOptional, DozeHost host, Handler handler, @BrightnessSensor Optional<Sensor> lightSensorOptional, DozeHost host, Handler handler,
AlwaysOnDisplayPolicy alwaysOnDisplayPolicy, AlwaysOnDisplayPolicy alwaysOnDisplayPolicy,
WakefulnessLifecycle wakefulnessLifecycle, WakefulnessLifecycle wakefulnessLifecycle,
DozeParameters dozeParameters) { DozeParameters dozeParameters,
DockManager dockManager) {
mContext = context; mContext = context;
mDozeService = service; mDozeService = service;
mSensorManager = sensorManager; mSensorManager = sensorManager;
@@ -96,6 +99,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
mDozeParameters = dozeParameters; mDozeParameters = dozeParameters;
mDozeHost = host; mDozeHost = host;
mHandler = handler; mHandler = handler;
mDockManager = dockManager;
mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness; mDefaultDozeBrightness = alwaysOnDisplayPolicy.defaultDozeBrightness;
mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness; mScreenBrightnessDim = alwaysOnDisplayPolicy.dimBrightness;
@@ -122,13 +126,20 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
@Override @Override
public void onScreenState(int state) { 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); setLightSensorEnabled(true);
} else { } else {
setLightSensorEnabled(false); setLightSensorEnabled(false);
} }
} }
private boolean shouldRegisterLightSensorWhenScreenOnDocked() {
return !mDozeParameters.brightnessUsesProx()
|| !mDozeParameters.getSelectivelyRegisterSensorsUsingProx();
}
private void onDestroy() { private void onDestroy() {
setLightSensorEnabled(false); setLightSensorEnabled(false);
} }

View File

@@ -267,6 +267,13 @@ public class DozeParameters implements TunerService.Tunable,
return mResources.getBoolean(R.bool.doze_long_press_uses_prox); 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. * Callback to listen for DozeParameter changes.
*/ */
@@ -303,6 +310,7 @@ public class DozeParameters implements TunerService.Tunable,
pw.print("getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold()); pw.print("getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
pw.print("getSelectivelyRegisterSensorsUsingProx(): "); pw.print("getSelectivelyRegisterSensorsUsingProx(): ");
pw.println(getSelectivelyRegisterSensorsUsingProx()); pw.println(getSelectivelyRegisterSensorsUsingProx());
pw.print("brightnessUsesProx(): "); pw.println(brightnessUsesProx());
} }
interface Callback { interface Callback {

View File

@@ -43,6 +43,7 @@ public class DozeConfigurationUtil {
when(params.singleTapUsesProx()).thenReturn(true); when(params.singleTapUsesProx()).thenReturn(true);
when(params.longPressUsesProx()).thenReturn(true); when(params.longPressUsesProx()).thenReturn(true);
when(params.getQuickPickupAodDuration()).thenReturn(500); when(params.getQuickPickupAodDuration()).thenReturn(500);
when(params.brightnessUsesProx()).thenReturn(true);
doneHolder[0] = true; doneHolder[0] = true;
return params; return params;

View File

@@ -29,6 +29,7 @@ import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
@@ -47,6 +48,7 @@ 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.dock.DockManager;
import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.concurrency.FakeExecutor;
@@ -82,6 +84,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
WakefulnessLifecycle mWakefulnessLifecycle; WakefulnessLifecycle mWakefulnessLifecycle;
@Mock @Mock
DozeParameters mDozeParameters; DozeParameters mDozeParameters;
@Mock
DockManager mDockManager;
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);
@@ -109,7 +113,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
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, mWakefulnessLifecycle, mDozeParameters); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager);
mScreen.onScreenState(Display.STATE_ON); mScreen.onScreenState(Display.STATE_ON);
} }
@@ -156,6 +160,67 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
assertEquals(maxBrightness, mServiceFake.screenBrightness); 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 @Test
public void testPausingAod_doesNotResetBrightness() throws Exception { public void testPausingAod_doesNotResetBrightness() throws Exception {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
@@ -175,7 +240,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, mWakefulnessLifecycle, mDozeParameters); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager);
mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE); mScreen.transitionTo(INITIALIZED, DOZE);
reset(mDozeHost); reset(mDozeHost);
@@ -216,7 +281,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, mWakefulnessLifecycle, mDozeParameters); mAlwaysOnDisplayPolicy, mWakefulnessLifecycle, mDozeParameters, mDockManager);
mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE_AOD); mScreen.transitionTo(INITIALIZED, DOZE_AOD);