summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java19
2 files changed, 25 insertions, 2 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index e0ca1ace2ac4..875619a71a18 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -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();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
index c0e92e09c486..65399bfb901e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -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;
@@ -292,6 +291,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);
verify(mDialog1).show(any(), any());