From 66bfe45f993581d49d738899a760a133c9a15958 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 30 Jul 2020 14:04:20 -0700 Subject: [PATCH] BiometricEnrollIntro should use non-blocking generateChallenge GenerateChallenge used to block when showing the credential screen. Now that GenerateChallenge is moved to after the credential screen is shown, we need to delay the next button instead. This is generally non percievable to the user, but this is more robust against busy system server. Fixes: 161325267 Test: Enroll fingerprint/face device Change-Id: I0fbbef8bf469e32bed251acf22556ad2ea8e2933 --- .../BiometricEnrollIntroduction.java | 21 ++++++++++++++----- .../face/FaceEnrollIntroduction.java | 7 ++++--- .../FingerprintEnrollIntroduction.java | 7 ++++--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index c97c4d98b7b..db2f2913342 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -101,7 +101,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase /** * @return the challenge generated by the biometric hardware */ - protected abstract long getChallenge(); + protected abstract void getChallenge(GenerateChallengeCallback callback); /** * @return one of the ChooseLockSettingsHelper#EXTRA_KEY_FOR_* constants @@ -125,6 +125,10 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase */ public abstract void onClick(LinkSpan span); + protected interface GenerateChallengeCallback { + void onChallengeGenerated(long challenge); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -267,12 +271,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase return; } } else if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) { + mConfirmingCredentials = false; if (resultCode == RESULT_FINISHED) { updatePasswordQuality(); - mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId, getChallenge()); overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out); - mConfirmingCredentials = false; - return; + getNextButton().setEnabled(false); + getChallenge((challenge -> { + mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId, challenge); + getNextButton().setEnabled(true); + })); } else { setResult(resultCode, data); finish(); @@ -280,8 +287,12 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase } else if (requestCode == CONFIRM_REQUEST) { mConfirmingCredentials = false; if (resultCode == RESULT_OK && data != null) { - mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId, getChallenge()); overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out); + getNextButton().setEnabled(false); + getChallenge((challenge -> { + mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId, challenge); + getNextButton().setEnabled(true); + })); } else { setResult(resultCode, data); finish(); diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index dbdf03de3bb..378a3c12f5d 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -180,12 +180,13 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { } @Override - protected long getChallenge() { + protected void getChallenge(GenerateChallengeCallback callback) { mFaceManager = Utils.getFaceManagerOrNull(this); if (mFaceManager == null) { - return 0; + callback.onChallengeGenerated(0L); + return; } - return mFaceManager.generateChallengeBlocking(); + mFaceManager.generateChallenge(callback::onChallengeGenerated); } @Override diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index ccfb0f26155..0b5c7b0ff77 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -131,12 +131,13 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { } @Override - protected long getChallenge() { + protected void getChallenge(GenerateChallengeCallback callback) { mFingerprintManager = Utils.getFingerprintManagerOrNull(this); if (mFingerprintManager == null) { - return 0; + callback.onChallengeGenerated(0L); + return; } - return mFingerprintManager.generateChallengeBlocking(); + mFingerprintManager.generateChallenge(callback::onChallengeGenerated); } @Override