Launch settings for clicking fingerprint unlock

Launch FingerprintSettings directly when user clicks "Fingerprint
Unlock". Let Fingerprint settings peform confirmLock() or chooseLock().
And to have smoothly animation, instead of generating challenge in
FingerprintSettings::onActivityResult(), challenge is generated in next
visible activity, and pass it back through next activity result.

Bug: 197717071
Test: atest GatekeeperPasswordProviderTest CredentialModelTest
Test: atest AutoCredentialViewModelTest FingerprintStatusUtilsTest
Test: RunSettingsRoboTests2 FingerprintEnrollIntroductionTest
Test: Manually test fingerprint enroll in settings or suw
Change-Id: Ie27c3c493ea475f6b53cb6bb3f2d45d555f47cb3
This commit is contained in:
Milton Wu
2022-12-05 03:09:58 +00:00
parent 58c3318e19
commit 160661dc6d
14 changed files with 899 additions and 131 deletions

View File

@@ -31,6 +31,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
@@ -58,6 +59,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
private static final String KEY_CONFIRMING_CREDENTIALS = "confirming_credentials";
private static final String KEY_SCROLLED_TO_BOTTOM = "scrolled";
private GatekeeperPasswordProvider mGatekeeperPasswordProvider;
private UserManager mUserManager;
private boolean mHasPassword;
private boolean mBiometricUnlockDisabledByAdmin;
@@ -178,7 +180,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
mErrorText = getErrorTextView();
mUserManager = UserManager.get(this);
mUserManager = getUserManager();
updatePasswordQuality();
if (!mConfirmingCredentials) {
@@ -253,8 +255,28 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
return super.shouldFinishWhenBackgrounded() && !mConfirmingCredentials && !mNextClicked;
}
@VisibleForTesting
@NonNull
protected GatekeeperPasswordProvider getGatekeeperPasswordProvider() {
if (mGatekeeperPasswordProvider == null) {
mGatekeeperPasswordProvider = new GatekeeperPasswordProvider(getLockPatternUtils());
}
return mGatekeeperPasswordProvider;
}
@VisibleForTesting
protected UserManager getUserManager() {
return UserManager.get(this);
}
@VisibleForTesting
@NonNull
protected LockPatternUtils getLockPatternUtils() {
return new LockPatternUtils(this);
}
private void updatePasswordQuality() {
final int passwordQuality = new LockPatternUtils(this)
final int passwordQuality = getLockPatternUtils()
.getActivePasswordQuality(mUserManager.getCredentialOwnerProfile(mUserId));
mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
}
@@ -301,6 +323,14 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST);
}
/**
* Returns the intent extra data for setResult(), null means nothing need to been sent back
*/
@Nullable
protected Intent getSetResultIntentExtra(@Nullable Intent activityResultIntent) {
return activityResultIntent;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG,
@@ -310,7 +340,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
&& BiometricUtils.isMultiBiometricFingerprintEnrollmentFlow(this);
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST) {
if (isResultFinished(resultCode)) {
handleBiometricResultSkipOrFinished(resultCode, data);
handleBiometricResultSkipOrFinished(resultCode, getSetResultIntentExtra(data));
} else if (isResultSkipped(resultCode)) {
if (!BiometricUtils.tryStartingNextBiometricEnroll(this,
ENROLL_NEXT_BIOMETRIC_REQUEST, "BIOMETRIC_FIND_SENSOR_SKIPPED")) {