Don't register for UDFPS long press in STATE_DOZE

We only want to register for the udfps longpress when the
device is in AoD. This includes the AOD_PAUSED state in
case the user immediately attempts to authenticate with UDFPS
right after taking out of their pocket. We allow UDFPS longpress
to trigger in that state even though UI hasn't shown yet.

Test: atest DozeSensorsTest DozeTriggerstest
Fixes: 245657872
Change-Id: Iaecb0e37deed6ad2ba10eb8cbda098bf6443c01f
This commit is contained in:
Beverly
2022-12-21 19:47:26 +00:00
committed by Beverly Tai
parent 2f3a6b6a2b
commit f3b7a9aff4
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();
}