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

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

Change-Id: I60f0be13550e1db052a00c1c9dadc3b7512f9031
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:59:38 +00:00
committed by Automerger Merge Worker
4 changed files with 164 additions and 62 deletions

View File

@@ -119,6 +119,7 @@ public class DozeSensors {
private boolean mListening;
private boolean mListeningTouchScreenSensors;
private boolean mListeningProxSensors;
private boolean mListeningAodOnlySensors;
private boolean mUdfpsEnrolled;
@DevicePostureController.DevicePostureInt
@@ -187,7 +188,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,
@@ -198,14 +200,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,
@@ -217,7 +222,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,
@@ -228,7 +235,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",
@@ -239,7 +248,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,
@@ -247,7 +258,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,
@@ -255,7 +267,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,
@@ -266,7 +279,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(
@@ -360,29 +375,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();
}
@@ -394,7 +416,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;
@@ -502,6 +525,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;
@@ -530,7 +556,8 @@ public class DozeSensors {
requiresTouchscreen,
false /* ignoresSetting */,
false /* requiresProx */,
true /* immediatelyReRegister */
true /* immediatelyReRegister */,
false
);
}
@@ -544,7 +571,8 @@ public class DozeSensors {
boolean requiresTouchscreen,
boolean ignoresSetting,
boolean requiresProx,
boolean immediatelyReRegister
boolean immediatelyReRegister,
boolean requiresAod
) {
this(
new Sensor[]{ sensor },
@@ -557,7 +585,8 @@ public class DozeSensors {
ignoresSetting,
requiresProx,
immediatelyReRegister,
DevicePostureController.DEVICE_POSTURE_UNKNOWN
DevicePostureController.DEVICE_POSTURE_UNKNOWN,
requiresAod
);
}
@@ -572,7 +601,8 @@ public class DozeSensors {
boolean ignoresSetting,
boolean requiresProx,
boolean immediatelyReRegister,
@DevicePostureController.DevicePostureInt int posture
@DevicePostureController.DevicePostureInt int posture,
boolean requiresAod
) {
mSensors = sensors;
mSetting = setting;
@@ -583,6 +613,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

@@ -146,7 +146,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();
@@ -164,7 +164,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));
}
@@ -172,8 +172,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));
}
@@ -198,7 +198,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);
@@ -209,12 +209,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);
@@ -230,12 +230,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);
@@ -251,12 +251,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);
@@ -266,7 +266,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);
}
@@ -277,10 +277,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);
@@ -297,7 +297,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,
@@ -318,7 +318,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,
@@ -347,7 +347,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,
@@ -402,7 +402,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);
@@ -411,7 +411,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);
@@ -440,6 +440,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
@@ -496,8 +525,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,
@@ -506,11 +535,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
@@ -524,15 +555,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,
@@ -541,7 +592,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();
}