Run error callback when BiometricPrompt dismissed early
Currently, if BiometricPrompt is dismissed quickly (e.g. by tapping on the top half of the screen to dismiss it while it's being shown) the ongoing authentication session may not be canceled and the onAuthenticationError callback may not be run. This commit fixes the issue by ensuring that a dismissal reason is sent to callback if the prompt is shown while in the "pending dismissal" state. Test: atest com.android.systemui.biometrics Test: Manual: 1. Using a custom test app, trigger BiometricPrompt to be shown 2. While the prompt is being shown, repeatedly tap top half of screen 3. Ensure the prompt is dismissed and onAuthenticationError is called Fixes: 173417042 Change-Id: I240efba1b008681534380c5e4a10bff973f258a6
This commit is contained in:
@@ -96,7 +96,7 @@ public class AuthContainerView extends LinearLayout
|
||||
|
||||
@VisibleForTesting final WakefulnessLifecycle mWakefulnessLifecycle;
|
||||
|
||||
private @ContainerState int mContainerState = STATE_UNKNOWN;
|
||||
@VisibleForTesting @ContainerState int mContainerState = STATE_UNKNOWN;
|
||||
|
||||
// Non-null only if the dialog is in the act of dismissing and has not sent the reason yet.
|
||||
@Nullable @AuthDialogCallback.DismissedReason Integer mPendingCallbackReason;
|
||||
@@ -607,10 +607,11 @@ public class AuthContainerView extends LinearLayout
|
||||
mWindowManager.removeView(this);
|
||||
}
|
||||
|
||||
private void onDialogAnimatedIn() {
|
||||
@VisibleForTesting
|
||||
void onDialogAnimatedIn() {
|
||||
if (mContainerState == STATE_PENDING_DISMISS) {
|
||||
Log.d(TAG, "onDialogAnimatedIn(): mPendingDismissDialog=true, dismissing now");
|
||||
animateAway(false /* sendReason */, 0);
|
||||
animateAway(AuthDialogCallback.DISMISSED_USER_CANCELED);
|
||||
return;
|
||||
}
|
||||
mContainerState = STATE_SHOWING;
|
||||
|
||||
@@ -203,6 +203,16 @@ public class AuthContainerViewTest extends SysuiTestCase {
|
||||
eq(View.IMPORTANT_FOR_ACCESSIBILITY_NO));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnDialogAnimatedIn_sendsCancelReason_whenPendingDismiss() {
|
||||
initializeContainer(Authenticators.BIOMETRIC_WEAK);
|
||||
mAuthContainer.mContainerState = AuthContainerView.STATE_PENDING_DISMISS;
|
||||
mAuthContainer.onDialogAnimatedIn();
|
||||
verify(mCallback).onDismissed(
|
||||
eq(AuthDialogCallback.DISMISSED_USER_CANCELED),
|
||||
eq(null) /* credentialAttestation */);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLayoutParams_hasSecureWindowFlag() {
|
||||
final IBinder windowToken = mock(IBinder.class);
|
||||
|
||||
Reference in New Issue
Block a user