From e37ac352365a75406863f452704a4b399cc7d7b8 Mon Sep 17 00:00:00 2001 From: Joshua McCloskey Date: Tue, 8 Nov 2022 19:32:18 +0000 Subject: [PATCH] Cancel side auth on power press Test: atest FingerprintAuthenticationClienTest Test: Verified fingerprint hal is now sent cancellation signal. Fixes: 258101086 Change-Id: I4b2f5ea1f7fe94b62071fb51b53224b1ca5756d0 --- .../aidl/FingerprintAuthenticationClient.java | 12 +++++++++--- .../aidl/FingerprintAuthenticationClientTest.java | 11 +++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 5f38a92f9e139..893c9b16ea02a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -94,6 +94,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient private long mSideFpsLastAcquireStartTime; private Runnable mAuthSuccessRunnable; private final Clock mClock; + private boolean mDidFinishSfps; FingerprintAuthenticationClient( @NonNull Context context, @@ -203,8 +204,9 @@ class FingerprintAuthenticationClient extends AuthenticationClient @Override protected void handleLifecycleAfterAuth(boolean authenticated) { - if (authenticated) { + if (authenticated && !mDidFinishSfps) { mCallback.onClientFinished(this, true /* success */); + mDidFinishSfps = true; } } @@ -504,12 +506,16 @@ class FingerprintAuthenticationClient extends AuthenticationClient if (mSensorProps.isAnySidefpsType()) { Slog.i(TAG, "(sideFPS): onPowerPressed"); mHandler.post(() -> { + if (mDidFinishSfps) { + return; + } Slog.i(TAG, "(sideFPS): finishing auth"); // Ignore auths after a power has been detected mHandler.removeMessages(MESSAGE_AUTH_SUCCESS); // Do not call onError() as that will send an additional callback to coex. - onErrorInternal(BiometricConstants.BIOMETRIC_ERROR_POWER_PRESSED, - 0, true); + mDidFinishSfps = true; + onErrorInternal(BiometricConstants.BIOMETRIC_ERROR_POWER_PRESSED, 0, true); + stopHalOperation(); mSensorOverlays.hide(getSensorId()); }); } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java index 22d1bc5ac4abd..5e5b48dd24c1b 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java @@ -373,6 +373,7 @@ public class FingerprintAuthenticationClientTest { @Test public void fingerprintPowerIgnoresAuthInWindow() throws Exception { when(mSensorProps.isAnySidefpsType()).thenReturn(true); + when(mHal.authenticate(anyLong())).thenReturn(mCancellationSignal); final FingerprintAuthenticationClient client = createClient(1); client.start(mCallback); @@ -383,11 +384,13 @@ public class FingerprintAuthenticationClientTest { mLooper.dispatchAll(); verify(mCallback).onClientFinished(any(), eq(false)); + verify(mCancellationSignal).cancel(); } @Test public void fingerprintAuthIgnoredWaitingForPower() throws Exception { when(mSensorProps.isAnySidefpsType()).thenReturn(true); + when(mHal.authenticate(anyLong())).thenReturn(mCancellationSignal); final FingerprintAuthenticationClient client = createClient(1); client.start(mCallback); @@ -398,11 +401,13 @@ public class FingerprintAuthenticationClientTest { mLooper.dispatchAll(); verify(mCallback).onClientFinished(any(), eq(false)); + verify(mCancellationSignal).cancel(); } @Test - public void fingerprintAuthSucceedsAfterPowerWindow() throws Exception { + public void fingerprintAuthFailsWhenAuthAfterPower() throws Exception { when(mSensorProps.isAnySidefpsType()).thenReturn(true); + when(mHal.authenticate(anyLong())).thenReturn(mCancellationSignal); final FingerprintAuthenticationClient client = createClient(1); client.start(mCallback); @@ -416,7 +421,9 @@ public class FingerprintAuthenticationClientTest { mLooper.moveTimeForward(1000); mLooper.dispatchAll(); - verify(mCallback).onClientFinished(any(), eq(true)); + verify(mCallback, never()).onClientFinished(any(), eq(true)); + verify(mCallback).onClientFinished(any(), eq(false)); + when(mHal.authenticateWithContext(anyLong(), any())).thenReturn(mCancellationSignal); } @Test