Fix corner case when auth is canceled but credential was already confirmed

Bug: 145991060

Test: atest AuthControllerTest

Change-Id: I94cd579c47b1299c498e0736d7f584e32d903029
This commit is contained in:
Kevin Chyn
2020-01-17 14:17:03 -08:00
parent 9670c9e118
commit a847a03c7d
2 changed files with 25 additions and 2 deletions

View File

@@ -338,7 +338,13 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
@Override
public void hideAuthenticationDialog() {
if (DEBUG) Log.d(TAG, "hideAuthenticationDialog");
if (DEBUG) Log.d(TAG, "hideAuthenticationDialog: " + mCurrentDialog);
if (mCurrentDialog == null) {
// Could be possible if the caller canceled authentication after credential success
// but before the client was notified.
return;
}
mCurrentDialog.dismissFromSystemServer();

View File

@@ -20,7 +20,6 @@ import static android.hardware.biometrics.BiometricManager.Authenticators;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static junit.framework.TestCase.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -291,6 +290,24 @@ public class AuthControllerTest extends SysuiTestCase {
// Corner case tests
@Test
public void testCancelAuthentication_whenCredentialConfirmed_doesntCrash() throws Exception {
// It's possible that before the client is notified that credential is confirmed, the client
// requests to cancel authentication.
//
// Test that the following sequence of events does not crash SystemUI:
// 1) Credential is confirmed
// 2) Client cancels authentication
showDialog(Authenticators.DEVICE_CREDENTIAL, BiometricPrompt.TYPE_NONE);
verify(mDialog1).show(any(), any());
mAuthController.onDismissed(AuthDialogCallback.DISMISSED_CREDENTIAL_AUTHENTICATED);
verify(mReceiver).onDialogDismissed(BiometricPrompt.DISMISSED_REASON_CREDENTIAL_CONFIRMED);
mAuthController.hideAuthenticationDialog();
}
@Test
public void testShowNewDialog_beforeOldDialogDismissed_SkipsAnimations() {
showDialog(Authenticators.BIOMETRIC_WEAK, BiometricPrompt.TYPE_FACE);