Merge "Don't register for UDFPS long press in STATE_DOZE" into tm-qpr-dev am: e85826a6e8

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

Change-Id: Iea0ab5c2cd101baad65ece65a40127c05fb5bafe
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Beverly Tai
2023-01-17 16:54:28 +00:00
committed by Automerger Merge Worker
4 changed files with 164 additions and 62 deletions

View File

@@ -116,6 +116,7 @@ public class DozeSensors {
private boolean mListening;
private boolean mListeningTouchScreenSensors;
private boolean mListeningProxSensors;
private boolean mListeningAodOnlySensors;
private boolean mUdfpsEnrolled;
@DevicePostureController.DevicePostureInt
@@ -184,7 +185,8 @@ public class DozeSensors {
dozeParameters.getPulseOnSigMotion(),
DozeLog.PULSE_REASON_SENSOR_SIGMOTION,
false /* touchCoords */,
false /* touchscreen */),
false /* touchscreen */
),
new TriggerSensor(
mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
Settings.Secure.DOZE_PICK_UP_GESTURE,
@@ -195,14 +197,17 @@ public class DozeSensors {
false /* touchscreen */,
false /* ignoresSetting */,
false /* requires prox */,
true /* immediatelyReRegister */),
true /* immediatelyReRegister */,
false /* requiresAod */
),
new TriggerSensor(
findSensor(config.doubleTapSensorType()),
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
true /* configured */,
DozeLog.REASON_SENSOR_DOUBLE_TAP,
dozeParameters.doubleTapReportsTouchCoordinates(),
true /* touchscreen */),
true /* touchscreen */
),
new TriggerSensor(
findSensors(config.tapSensorTypeMapping()),
Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
@@ -214,7 +219,9 @@ public class DozeSensors {
false /* ignoresSetting */,
dozeParameters.singleTapUsesProx(mDevicePosture) /* requiresProx */,
true /* immediatelyReRegister */,
mDevicePosture),
mDevicePosture,
false
),
new TriggerSensor(
findSensor(config.longPressSensorType()),
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
@@ -225,7 +232,9 @@ public class DozeSensors {
true /* touchscreen */,
false /* ignoresSetting */,
dozeParameters.longPressUsesProx() /* requiresProx */,
true /* immediatelyReRegister */),
true /* immediatelyReRegister */,
false /* requiresAod */
),
new TriggerSensor(
findSensor(config.udfpsLongPressSensorType()),
"doze_pulse_on_auth",
@@ -236,7 +245,9 @@ public class DozeSensors {
true /* touchscreen */,
false /* ignoresSetting */,
dozeParameters.longPressUsesProx(),
false /* immediatelyReRegister */),
false /* immediatelyReRegister */,
true /* requiresAod */
),
new PluginSensor(
new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY),
Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE,
@@ -244,7 +255,8 @@ public class DozeSensors {
&& mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT),
DozeLog.REASON_SENSOR_WAKE_UP_PRESENCE,
false /* reports touch coordinates */,
false /* touchscreen */),
false /* touchscreen */
),
new PluginSensor(
new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN),
Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE,
@@ -252,7 +264,8 @@ public class DozeSensors {
DozeLog.PULSE_REASON_SENSOR_WAKE_REACH,
false /* reports touch coordinates */,
false /* touchscreen */,
mConfig.getWakeLockScreenDebounce()),
mConfig.getWakeLockScreenDebounce()
),
new TriggerSensor(
findSensor(config.quickPickupSensorType()),
Settings.Secure.DOZE_QUICK_PICKUP_GESTURE,
@@ -263,7 +276,9 @@ public class DozeSensors {
false /* requiresTouchscreen */,
false /* ignoresSetting */,
false /* requiresProx */,
true /* immediatelyReRegister */),
true /* immediatelyReRegister */,
false /* requiresAod */
),
};
setProxListening(false); // Don't immediately start listening when we register.
mProximitySensor.register(
@@ -357,29 +372,36 @@ public class DozeSensors {
/**
* If sensors should be registered and sending signals.
*/
public void setListening(boolean listen, boolean includeTouchScreenSensors) {
if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors) {
public void setListening(boolean listen, boolean includeTouchScreenSensors,
boolean includeAodOnlySensors) {
if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors
&& mListeningAodOnlySensors == includeAodOnlySensors) {
return;
}
mListening = listen;
mListeningTouchScreenSensors = includeTouchScreenSensors;
mListeningAodOnlySensors = includeAodOnlySensors;
updateListening();
}
/**
* If sensors should be registered and sending signals.
*/
public void setListening(boolean listen, boolean includeTouchScreenSensors,
boolean lowPowerStateOrOff) {
public void setListeningWithPowerState(boolean listen, boolean includeTouchScreenSensors,
boolean includeAodRequiringSensors, boolean lowPowerStateOrOff) {
final boolean shouldRegisterProxSensors =
!mSelectivelyRegisterProxSensors || lowPowerStateOrOff;
if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors
&& mListeningProxSensors == shouldRegisterProxSensors) {
if (mListening == listen
&& mListeningTouchScreenSensors == includeTouchScreenSensors
&& mListeningProxSensors == shouldRegisterProxSensors
&& mListeningAodOnlySensors == includeAodRequiringSensors
) {
return;
}
mListening = listen;
mListeningTouchScreenSensors = includeTouchScreenSensors;
mListeningProxSensors = shouldRegisterProxSensors;
mListeningAodOnlySensors = includeAodRequiringSensors;
updateListening();
}
@@ -391,7 +413,8 @@ public class DozeSensors {
for (TriggerSensor s : mTriggerSensors) {
boolean listen = mListening
&& (!s.mRequiresTouchscreen || mListeningTouchScreenSensors)
&& (!s.mRequiresProx || mListeningProxSensors);
&& (!s.mRequiresProx || mListeningProxSensors)
&& (!s.mRequiresAod || mListeningAodOnlySensors);
s.setListening(listen);
if (listen) {
anyListening = true;
@@ -499,6 +522,9 @@ public class DozeSensors {
private final boolean mRequiresTouchscreen;
private final boolean mRequiresProx;
// Whether the sensor should only register if the device is in AOD
private final boolean mRequiresAod;
// Whether to immediately re-register this sensor after the sensor is triggered.
// If false, the sensor registration will be updated on the next AOD state transition.
private final boolean mImmediatelyReRegister;
@@ -527,7 +553,8 @@ public class DozeSensors {
requiresTouchscreen,
false /* ignoresSetting */,
false /* requiresProx */,
true /* immediatelyReRegister */
true /* immediatelyReRegister */,
false
);
}
@@ -541,7 +568,8 @@ public class DozeSensors {
boolean requiresTouchscreen,
boolean ignoresSetting,
boolean requiresProx,
boolean immediatelyReRegister
boolean immediatelyReRegister,
boolean requiresAod
) {
this(
new Sensor[]{ sensor },
@@ -554,7 +582,8 @@ public class DozeSensors {
ignoresSetting,
requiresProx,
immediatelyReRegister,
DevicePostureController.DEVICE_POSTURE_UNKNOWN
DevicePostureController.DEVICE_POSTURE_UNKNOWN,
requiresAod
);
}
@@ -569,7 +598,8 @@ public class DozeSensors {
boolean ignoresSetting,
boolean requiresProx,
boolean immediatelyReRegister,
@DevicePostureController.DevicePostureInt int posture
@DevicePostureController.DevicePostureInt int posture,
boolean requiresAod
) {
mSensors = sensors;
mSetting = setting;
@@ -580,6 +610,7 @@ public class DozeSensors {
mRequiresTouchscreen = requiresTouchscreen;
mIgnoresSetting = ignoresSetting;
mRequiresProx = requiresProx;
mRequiresAod = requiresAod;
mPosture = posture;
mImmediatelyReRegister = immediatelyReRegister;
}

View File

@@ -111,6 +111,7 @@ public class DozeTriggers implements DozeMachine.Part {
private boolean mWantProxSensor;
private boolean mWantTouchScreenSensors;
private boolean mWantSensors;
private boolean mInAod;
private final UserTracker.Callback mUserChangedCallback =
new UserTracker.Callback() {
@@ -460,12 +461,19 @@ public class DozeTriggers implements DozeMachine.Part {
mDozeSensors.requestTemporaryDisable();
break;
case DOZE:
case DOZE_AOD:
mAodInterruptRunnable = null;
mWantProxSensor = newState != DozeMachine.State.DOZE;
mWantProxSensor = false;
mWantSensors = true;
mWantTouchScreenSensors = true;
if (newState == DozeMachine.State.DOZE_AOD && !sWakeDisplaySensorState) {
mInAod = false;
break;
case DOZE_AOD:
mAodInterruptRunnable = null;
mWantProxSensor = true;
mWantSensors = true;
mWantTouchScreenSensors = true;
mInAod = true;
if (!sWakeDisplaySensorState) {
onWakeScreen(false, newState, DozeLog.REASON_SENSOR_WAKE_UP_PRESENCE);
}
break;
@@ -491,7 +499,7 @@ public class DozeTriggers implements DozeMachine.Part {
break;
default:
}
mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors);
mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors, mInAod);
}
private void registerCallbacks() {
@@ -510,11 +518,12 @@ public class DozeTriggers implements DozeMachine.Part {
private void stopListeningToAllTriggers() {
unregisterCallbacks();
mDozeSensors.setListening(false, false);
mDozeSensors.setListening(false, false, false);
mDozeSensors.setProxListening(false);
mWantSensors = false;
mWantProxSensor = false;
mWantTouchScreenSensors = false;
mInAod = false;
}
@Override
@@ -523,7 +532,8 @@ public class DozeTriggers implements DozeMachine.Part {
final boolean lowPowerStateOrOff = state == Display.STATE_DOZE
|| state == Display.STATE_DOZE_SUSPEND || state == Display.STATE_OFF;
mDozeSensors.setProxListening(mWantProxSensor && lowPowerStateOrOff);
mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors, lowPowerStateOrOff);
mDozeSensors.setListeningWithPowerState(mWantSensors, mWantTouchScreenSensors,
mInAod, lowPowerStateOrOff);
if (mAodInterruptRunnable != null && state == Display.STATE_ON) {
mAodInterruptRunnable.run();

View File

@@ -144,7 +144,7 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test
public void testSensorDebounce() {
mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true, true, true);
mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class));
mTestableLooper.processAllMessages();
@@ -162,7 +162,7 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test
public void testSetListening_firstTrue_registerSettingsObserver() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true, true, true);
verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
}
@@ -170,8 +170,8 @@ public class DozeSensorsTest extends SysuiTestCase {
@Test
public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt());
mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true, true, true);
mDozeSensors.setListening(true, true, true);
verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
}
@@ -196,7 +196,7 @@ public class DozeSensorsTest extends SysuiTestCase {
assertFalse(mSensorTap.mRequested);
// WHEN we're now in a low powered state
dozeSensors.setListening(true, true, true);
dozeSensors.setListeningWithPowerState(true, true, true, true);
// THEN the tap sensor is registered
assertTrue(mSensorTap.mRequested);
@@ -207,12 +207,12 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN doze sensors enabled
when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);
// GIVEN a trigger sensor
// GIVEN a trigger sensor that's enabled by settings
Sensor mockSensor = mock(Sensor.class);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorWithSettingEnabled(
mockSensor,
/* settingEnabled */ true,
/* requiresTouchScreen */ true);
/* settingEnabled */ true
);
when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
.thenReturn(true);
@@ -228,12 +228,12 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN doze sensors enabled
when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);
// GIVEN a trigger sensor
// GIVEN a trigger sensor that's not enabled by settings
Sensor mockSensor = mock(Sensor.class);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorWithSettingEnabled(
mockSensor,
/* settingEnabled*/ false,
/* requiresTouchScreen */ true);
/* settingEnabled*/ false
);
when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
.thenReturn(true);
@@ -249,12 +249,12 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN doze sensors enabled
when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);
// GIVEN a trigger sensor that's
// GIVEN a trigger sensor that's not enabled by settings
Sensor mockSensor = mock(Sensor.class);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorWithSettingEnabled(
mockSensor,
/* settingEnabled*/ false,
/* requiresTouchScreen */ true);
/* settingEnabled*/ false
);
when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
.thenReturn(true);
@@ -264,7 +264,7 @@ public class DozeSensorsTest extends SysuiTestCase {
// WHEN ignoreSetting is called
triggerSensor.ignoreSetting(true);
// THEN the sensor is registered
// THEN the sensor is still registered since the setting is ignore
assertTrue(triggerSensor.mRegistered);
}
@@ -275,10 +275,10 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN a trigger sensor
Sensor mockSensor = mock(Sensor.class);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorWithSettingEnabled(
mockSensor,
/* settingEnabled*/ true,
/* requiresTouchScreen */ true);
/* settingEnabled*/ true
);
when(mSensorManager.requestTriggerSensor(eq(triggerSensor), eq(mockSensor)))
.thenReturn(true);
@@ -295,7 +295,7 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN doze sensor that supports postures
Sensor closedSensor = createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT);
Sensor openedSensor = createSensor(Sensor.TYPE_PROXIMITY, Sensor.STRING_TYPE_LIGHT);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorForPosture(
new Sensor[] {
null /* unknown */,
closedSensor,
@@ -316,7 +316,7 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN doze sensor that supports postures
Sensor closedSensor = createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT);
Sensor openedSensor = createSensor(Sensor.TYPE_PROXIMITY, Sensor.STRING_TYPE_LIGHT);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorForPosture(
new Sensor[] {
null /* unknown */,
closedSensor,
@@ -345,7 +345,7 @@ public class DozeSensorsTest extends SysuiTestCase {
// GIVEN doze sensor that supports postures
Sensor closedSensor = createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT);
Sensor openedSensor = createSensor(Sensor.TYPE_PROXIMITY, Sensor.STRING_TYPE_LIGHT);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorForPosture(
new Sensor[] {
null /* unknown */,
closedSensor,
@@ -400,7 +400,7 @@ public class DozeSensorsTest extends SysuiTestCase {
public void testUdfpsEnrollmentChanged() throws Exception {
// GIVEN a UDFPS_LONG_PRESS trigger sensor that's not configured
Sensor mockSensor = mock(Sensor.class);
TriggerSensor triggerSensor = mDozeSensors.createDozeSensor(
TriggerSensor triggerSensor = mDozeSensors.createDozeSensorForPosture(
mockSensor,
REASON_SENSOR_UDFPS_LONG_PRESS,
/* configured */ false);
@@ -409,7 +409,7 @@ public class DozeSensorsTest extends SysuiTestCase {
.thenReturn(true);
// WHEN listening state is set to TRUE
mDozeSensors.setListening(true, true);
mDozeSensors.setListening(true, true, true);
// THEN mRegistered is still false b/c !mConfigured
assertFalse(triggerSensor.mConfigured);
@@ -438,6 +438,35 @@ public class DozeSensorsTest extends SysuiTestCase {
}
}
@Test
public void aodOnlySensor_onlyRegisteredWhenAodSensorsIncluded() {
// GIVEN doze sensors enabled
when(mAmbientDisplayConfiguration.enabled(anyInt())).thenReturn(true);
// GIVEN a trigger sensor that requires aod
Sensor mockSensor = mock(Sensor.class);
TriggerSensor aodOnlyTriggerSensor = mDozeSensors.createDozeSensorRequiringAod(mockSensor);
when(mSensorManager.requestTriggerSensor(eq(aodOnlyTriggerSensor), eq(mockSensor)))
.thenReturn(true);
mDozeSensors.addSensor(aodOnlyTriggerSensor);
// WHEN aod only sensors aren't included
mDozeSensors.setListening(/* listen */ true, /* includeTouchScreenSensors */true,
/* includeAodOnlySensors */false);
// THEN the sensor is not registered or requested
assertFalse(aodOnlyTriggerSensor.mRequested);
assertFalse(aodOnlyTriggerSensor.mRegistered);
// WHEN aod only sensors ARE included
mDozeSensors.setListening(/* listen */ true, /* includeTouchScreenSensors */true,
/* includeAodOnlySensors */true);
// THEN the sensor is registered and requested
assertTrue(aodOnlyTriggerSensor.mRequested);
assertTrue(aodOnlyTriggerSensor.mRegistered);
}
@Test
public void liftToWake_defaultSetting_configDefaultFalse() {
// WHEN the default lift to wake gesture setting is false
@@ -494,8 +523,8 @@ public class DozeSensorsTest extends SysuiTestCase {
mTriggerSensors = new TriggerSensor[] {mTriggerSensor, mSensorTap};
}
public TriggerSensor createDozeSensor(Sensor sensor, boolean settingEnabled,
boolean requiresTouchScreen) {
public TriggerSensor createDozeSensorWithSettingEnabled(Sensor sensor,
boolean settingEnabled) {
return new TriggerSensor(/* sensor */ sensor,
/* setting name */ "test_setting",
/* settingDefault */ settingEnabled,
@@ -504,11 +533,13 @@ public class DozeSensorsTest extends SysuiTestCase {
/* reportsTouchCoordinate*/ false,
/* requiresTouchscreen */ false,
/* ignoresSetting */ false,
requiresTouchScreen,
/* immediatelyReRegister */ true);
/* requiresProx */ false,
/* immediatelyReRegister */ true,
/* requiresAod */false
);
}
public TriggerSensor createDozeSensor(
public TriggerSensor createDozeSensorForPosture(
Sensor sensor,
int pulseReason,
boolean configured
@@ -522,15 +553,35 @@ public class DozeSensorsTest extends SysuiTestCase {
/* requiresTouchscreen */ false,
/* ignoresSetting */ false,
/* requiresTouchScreen */ false,
/* immediatelyReRegister*/ true);
/* immediatelyReRegister*/ true,
false
);
}
/**
* create a doze sensor that supports postures and is enabled
* Create a doze sensor that requires Aod
*/
public TriggerSensor createDozeSensor(Sensor[] sensors, int posture) {
public TriggerSensor createDozeSensorRequiringAod(Sensor sensor) {
return new TriggerSensor(/* sensor */ sensor,
/* setting name */ "aod_requiring_sensor",
/* settingDefault */ true,
/* configured */ true,
/* pulseReason*/ 0,
/* reportsTouchCoordinate*/ false,
/* requiresTouchscreen */ false,
/* ignoresSetting */ false,
/* requiresProx */ false,
/* immediatelyReRegister */ true,
/* requiresAoD */ true
);
}
/**
* Create a doze sensor that supports postures and is enabled
*/
public TriggerSensor createDozeSensorForPosture(Sensor[] sensors, int posture) {
return new TriggerSensor(/* sensor */ sensors,
/* setting name */ "test_setting",
/* setting name */ "posture_test_setting",
/* settingDefault */ true,
/* configured */ true,
/* pulseReason*/ 0,
@@ -539,7 +590,9 @@ public class DozeSensorsTest extends SysuiTestCase {
/* ignoresSetting */ true,
/* requiresProx */ false,
/* immediatelyReRegister */ true,
posture);
posture,
/* requiresUi */ false
);
}
public void addSensor(TriggerSensor sensor) {

View File

@@ -395,6 +395,14 @@ public class DozeTriggersTest extends SysuiTestCase {
verify(mAuthController).onAodInterrupt(anyInt(), anyInt(), anyFloat(), anyFloat());
}
@Test
public void udfpsLongPress_dozeState_notRegistered() {
// GIVEN device is DOZE_AOD_PAUSED
when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
// beverlyt
}
private void waitForSensorManager() {
mExecutor.runAllReady();
}