Allow UDFPS to be triggerd from AOD_PAUSED state

And from the AOD_PAUSING state.

So if users immediately attempt UDFPS right after
the prox sensor has become unblocked, the
authentication will still go through rather than
being dropped. The UDFPS longpress gesture is also
prox gated (by the sensor), so this is a safe change.

Test: programmatically set DOZE_AOD_PAUSED and see that UDFPS
longpress can still be triggered when prox isn't blocked
Test: atest DozeTriggersTest
Fixes: 244011650
Change-Id: Ic4f7956cb6082bec5c55d5177c8546e12b969378
This commit is contained in:
Beverly
2022-12-07 22:02:39 +00:00
committed by Beverly Tai
parent 0bfdbbf4c2
commit 4f8dbef6bd
4 changed files with 82 additions and 21 deletions

View File

@@ -28,6 +28,8 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.policy.DevicePostureController;
import com.google.errorprone.annotations.CompileTimeConstant;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -79,6 +81,13 @@ public class DozeLog implements Dumpable {
dumpManager.registerDumpable("DumpStats", this);
}
/**
* Log debug message to LogBuffer.
*/
public void d(@CompileTimeConstant String msg) {
mLogger.log(msg);
}
/**
* Appends pickup wakeup event to the logs
*/
@@ -88,6 +97,10 @@ public class DozeLog implements Dumpable {
: mPickupPulseNotNearVibrationStats).append();
}
public void traceSetIgnoreTouchWhilePulsing(boolean ignoreTouch) {
mLogger.logSetIgnoreTouchWhilePulsing(ignoreTouch);
}
/**
* Appends pulse started event to the logs.
* @param reason why the pulse started

View File

@@ -364,6 +364,14 @@ class DozeLogger @Inject constructor(
})
}
fun logSetIgnoreTouchWhilePulsing(ignoreTouchWhilePulsing: Boolean) {
buffer.log(TAG, DEBUG, {
bool1 = ignoreTouchWhilePulsing
}, {
"Prox changed while pulsing. setIgnoreTouchWhilePulsing=$bool1"
})
}
fun log(@CompileTimeConstant msg: String) {
buffer.log(TAG, DEBUG, msg)
}

View File

@@ -333,15 +333,18 @@ public class DozeTriggers implements DozeMachine.Part {
}
gentleWakeUp(pulseReason);
} else if (isUdfpsLongPress) {
final State state = mMachine.getState();
if (state == State.DOZE_AOD || state == State.DOZE) {
if (canPulse(mMachine.getState(), true)) {
mDozeLog.d("updfsLongPress - setting aodInterruptRunnable to run when "
+ "the display is on");
// Since the gesture won't be received by the UDFPS view, we need to
// manually inject an event once the display is ON
mAodInterruptRunnable = () ->
mAuthController.onAodInterrupt((int) screenX, (int) screenY,
rawValues[3] /* major */, rawValues[4] /* minor */);
mAuthController.onAodInterrupt((int) screenX, (int) screenY,
rawValues[3] /* major */, rawValues[4] /* minor */);
} else {
mDozeLog.d("udfpsLongPress - Not sending aodInterrupt. "
+ "Unsupported doze state.");
}
requestPulse(DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS, true, null);
} else {
mDozeHost.extendPulse(pulseReason);
@@ -380,7 +383,7 @@ public class DozeTriggers implements DozeMachine.Part {
// when a new event is arriving. This means that a state transition might have happened
// and the proximity check is now obsolete.
if (mMachine.isExecutingTransition()) {
Log.w(TAG, "onProximityFar called during transition. Ignoring sensor response.");
mDozeLog.d("onProximityFar called during transition. Ignoring sensor response.");
return;
}
@@ -392,21 +395,15 @@ public class DozeTriggers implements DozeMachine.Part {
if (state == DozeMachine.State.DOZE_PULSING
|| state == DozeMachine.State.DOZE_PULSING_BRIGHT) {
if (DEBUG) {
Log.i(TAG, "Prox changed, ignore touch = " + near);
}
mDozeLog.traceSetIgnoreTouchWhilePulsing(near);
mDozeHost.onIgnoreTouchWhilePulsing(near);
}
if (far && (paused || pausing)) {
if (DEBUG) {
Log.i(TAG, "Prox FAR, unpausing AOD");
}
mDozeLog.d("Prox FAR, unpausing AOD");
mMachine.requestState(DozeMachine.State.DOZE_AOD);
} else if (near && aod) {
if (DEBUG) {
Log.i(TAG, "Prox NEAR, pausing AOD");
}
mDozeLog.d("Prox NEAR, starting pausing AOD countdown");
mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSING);
}
}
@@ -551,12 +548,13 @@ public class DozeTriggers implements DozeMachine.Part {
return;
}
if (!mAllowPulseTriggers || mDozeHost.isPulsePending() || !canPulse(dozeState)) {
if (!mAllowPulseTriggers || mDozeHost.isPulsePending()
|| !canPulse(dozeState, performedProxCheck)) {
if (!mAllowPulseTriggers) {
mDozeLog.tracePulseDropped("requestPulse - !mAllowPulseTriggers");
} else if (mDozeHost.isPulsePending()) {
mDozeLog.tracePulseDropped("requestPulse - pulsePending");
} else if (!canPulse(dozeState)) {
} else if (!canPulse(dozeState, performedProxCheck)) {
mDozeLog.tracePulseDropped("requestPulse - dozeState cannot pulse", dozeState);
}
runIfNotNull(onPulseSuppressedListener);
@@ -574,14 +572,15 @@ public class DozeTriggers implements DozeMachine.Part {
// not in pocket, continue pulsing
final boolean isPulsePending = mDozeHost.isPulsePending();
mDozeHost.setPulsePending(false);
if (!isPulsePending || mDozeHost.isPulsingBlocked() || !canPulse(dozeState)) {
if (!isPulsePending || mDozeHost.isPulsingBlocked()
|| !canPulse(dozeState, performedProxCheck)) {
if (!isPulsePending) {
mDozeLog.tracePulseDropped("continuePulseRequest - pulse no longer"
+ " pending, pulse was cancelled before it could start"
+ " transitioning to pulsing state.");
} else if (mDozeHost.isPulsingBlocked()) {
mDozeLog.tracePulseDropped("continuePulseRequest - pulsingBlocked");
} else if (!canPulse(dozeState)) {
} else if (!canPulse(dozeState, performedProxCheck)) {
mDozeLog.tracePulseDropped("continuePulseRequest"
+ " - doze state cannot pulse", dozeState);
}
@@ -598,10 +597,13 @@ public class DozeTriggers implements DozeMachine.Part {
.ifPresent(uiEventEnum -> mUiEventLogger.log(uiEventEnum, getKeyguardSessionId()));
}
private boolean canPulse(DozeMachine.State dozeState) {
private boolean canPulse(DozeMachine.State dozeState, boolean pulsePerformedProximityCheck) {
final boolean dozePausedOrPausing = dozeState == State.DOZE_AOD_PAUSED
|| dozeState == State.DOZE_AOD_PAUSING;
return dozeState == DozeMachine.State.DOZE
|| dozeState == DozeMachine.State.DOZE_AOD
|| dozeState == DozeMachine.State.DOZE_AOD_DOCKED;
|| dozeState == DozeMachine.State.DOZE_AOD_DOCKED
|| (dozePausedOrPausing && pulsePerformedProximityCheck);
}
@Nullable

View File

@@ -357,6 +357,44 @@ public class DozeTriggersTest extends SysuiTestCase {
verify(mDozeLog).tracePulseDropped(anyString(), eq(null));
}
@Test
public void udfpsLongPress_triggeredWhenAodPaused() {
// GIVEN device is DOZE_AOD_PAUSED
when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE_AOD_PAUSED);
// WHEN udfps long-press is triggered
mTriggers.onSensor(DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS, 100, 100,
new float[]{0, 1, 2, 3, 4});
// THEN the pulse is NOT dropped
verify(mDozeLog, never()).tracePulseDropped(anyString(), any());
// WHEN the screen state is ON
mTriggers.onScreenState(Display.STATE_ON);
// THEN aod interrupt is sent
verify(mAuthController).onAodInterrupt(anyInt(), anyInt(), anyFloat(), anyFloat());
}
@Test
public void udfpsLongPress_triggeredWhenAodPausing() {
// GIVEN device is DOZE_AOD_PAUSED
when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE_AOD_PAUSING);
// WHEN udfps long-press is triggered
mTriggers.onSensor(DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS, 100, 100,
new float[]{0, 1, 2, 3, 4});
// THEN the pulse is NOT dropped
verify(mDozeLog, never()).tracePulseDropped(anyString(), any());
// WHEN the screen state is ON
mTriggers.onScreenState(Display.STATE_ON);
// THEN aod interrupt is sent
verify(mAuthController).onAodInterrupt(anyInt(), anyInt(), anyFloat(), anyFloat());
}
private void waitForSensorManager() {
mExecutor.runAllReady();
}