Snap for 8837442 from d0695e781f to tm-qpr1-release

Change-Id: I8043a440e50921c09675434ed88050f5b9a34f9e
This commit is contained in:
Android Build Coastguard Worker
2022-07-16 03:25:41 +00:00
5 changed files with 77 additions and 14 deletions

View File

@@ -93,6 +93,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
public static final String EXTRA_PARENTAL_CONSENT_STATUS = "consent_status"; public static final String EXTRA_PARENTAL_CONSENT_STATUS = "consent_status";
private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials"; private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials";
private static final String SAVED_STATE_FINGERPRINT_ONLY_ENROLLING =
"fingerprint_only_enrolling";
private static final String SAVED_STATE_ENROLL_ACTION_LOGGED = "enroll_action_logged"; private static final String SAVED_STATE_ENROLL_ACTION_LOGGED = "enroll_action_logged";
private static final String SAVED_STATE_PARENTAL_OPTIONS = "enroll_preferences"; private static final String SAVED_STATE_PARENTAL_OPTIONS = "enroll_preferences";
private static final String SAVED_STATE_GK_PW_HANDLE = "gk_pw_handle"; private static final String SAVED_STATE_GK_PW_HANDLE = "gk_pw_handle";
@@ -101,6 +103,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
private int mUserId = UserHandle.myUserId(); private int mUserId = UserHandle.myUserId();
private boolean mConfirmingCredentials; private boolean mConfirmingCredentials;
private boolean mFingerprintOnlyEnrolling;
private boolean mIsEnrollActionLogged; private boolean mIsEnrollActionLogged;
private boolean mHasFeatureFace = false; private boolean mHasFeatureFace = false;
private boolean mHasFeatureFingerprint = false; private boolean mHasFeatureFingerprint = false;
@@ -129,6 +132,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
if (savedInstanceState != null) { if (savedInstanceState != null) {
mConfirmingCredentials = savedInstanceState.getBoolean( mConfirmingCredentials = savedInstanceState.getBoolean(
SAVED_STATE_CONFIRMING_CREDENTIALS, false); SAVED_STATE_CONFIRMING_CREDENTIALS, false);
mFingerprintOnlyEnrolling = savedInstanceState.getBoolean(
SAVED_STATE_FINGERPRINT_ONLY_ENROLLING, false);
mIsEnrollActionLogged = savedInstanceState.getBoolean( mIsEnrollActionLogged = savedInstanceState.getBoolean(
SAVED_STATE_ENROLL_ACTION_LOGGED, false); SAVED_STATE_ENROLL_ACTION_LOGGED, false);
mParentalOptions = savedInstanceState.getBundle(SAVED_STATE_PARENTAL_OPTIONS); mParentalOptions = savedInstanceState.getBundle(SAVED_STATE_PARENTAL_OPTIONS);
@@ -302,7 +307,11 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
setOrConfirmCredentialsNow(); setOrConfirmCredentialsNow();
} }
} else if (canUseFingerprint) { } else if (canUseFingerprint) {
launchFingerprintOnlyEnroll(); if (mGkPwHandle != null) {
launchFingerprintOnlyEnroll();
} else {
setOrConfirmCredentialsNow();
}
} else if (canUseFace) { } else if (canUseFace) {
launchFaceOnlyEnroll(); launchFaceOnlyEnroll();
} else { // no modalities available } else { // no modalities available
@@ -320,6 +329,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
protected void onSaveInstanceState(@NonNull Bundle outState) { protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putBoolean(SAVED_STATE_CONFIRMING_CREDENTIALS, mConfirmingCredentials); outState.putBoolean(SAVED_STATE_CONFIRMING_CREDENTIALS, mConfirmingCredentials);
outState.putBoolean(SAVED_STATE_FINGERPRINT_ONLY_ENROLLING, mFingerprintOnlyEnrolling);
outState.putBoolean(SAVED_STATE_ENROLL_ACTION_LOGGED, mIsEnrollActionLogged); outState.putBoolean(SAVED_STATE_ENROLL_ACTION_LOGGED, mIsEnrollActionLogged);
if (mParentalOptions != null) { if (mParentalOptions != null) {
outState.putBundle(SAVED_STATE_PARENTAL_OPTIONS, mParentalOptions); outState.putBundle(SAVED_STATE_PARENTAL_OPTIONS, mParentalOptions);
@@ -432,11 +442,14 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
mConfirmingCredentials = false; mConfirmingCredentials = false;
final boolean isOk = final boolean isOk =
isSuccessfulConfirmOrChooseCredential(requestCode, resultCode); isSuccessfulConfirmOrChooseCredential(requestCode, resultCode);
// single modality enrollment requests confirmation directly // single face enrollment requests confirmation directly
// via BiometricEnrollBase#onCreate and should never get here // via BiometricEnrollBase#onCreate and should never get here
if (isOk && mHasFeatureFace && mHasFeatureFingerprint) { if (isOk && mHasFeatureFace && mHasFeatureFingerprint) {
updateGatekeeperPasswordHandle(data); updateGatekeeperPasswordHandle(data);
launchFaceAndFingerprintEnroll(); launchFaceAndFingerprintEnroll();
} else if (isOk && mHasFeatureFingerprint) {
updateGatekeeperPasswordHandle(data);
launchFingerprintOnlyEnroll();
} else { } else {
Log.d(TAG, "Unknown result for set/choose lock: " + resultCode); Log.d(TAG, "Unknown result for set/choose lock: " + resultCode);
setResult(resultCode); setResult(resultCode);
@@ -444,6 +457,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
} }
break; break;
case REQUEST_SINGLE_ENROLL: case REQUEST_SINGLE_ENROLL:
mFingerprintOnlyEnrolling = false;
finishOrLaunchHandToParent(resultCode); finishOrLaunchHandToParent(resultCode);
break; break;
default: default:
@@ -572,15 +586,18 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
} }
private void launchFingerprintOnlyEnroll() { private void launchFingerprintOnlyEnroll() {
final Intent intent; if (!mFingerprintOnlyEnrolling) {
// ChooseLockGeneric can request to start fingerprint enroll bypassing the intro screen. mFingerprintOnlyEnrolling = true;
if (getIntent().getBooleanExtra(EXTRA_SKIP_INTRO, false) final Intent intent;
&& this instanceof InternalActivity) { // ChooseLockGeneric can request to start fingerprint enroll bypassing the intro screen.
intent = BiometricUtils.getFingerprintFindSensorIntent(this, getIntent()); if (getIntent().getBooleanExtra(EXTRA_SKIP_INTRO, false)
} else { && this instanceof InternalActivity) {
intent = BiometricUtils.getFingerprintIntroIntent(this, getIntent()); intent = BiometricUtils.getFingerprintFindSensorIntent(this, getIntent());
} else {
intent = BiometricUtils.getFingerprintIntroIntent(this, getIntent());
}
launchSingleSensorEnrollActivity(intent, REQUEST_SINGLE_ENROLL);
} }
launchSingleSensorEnrollActivity(intent, REQUEST_SINGLE_ENROLL);
} }
private void launchFaceOnlyEnroll() { private void launchFaceOnlyEnroll() {

View File

@@ -76,6 +76,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
private static final String TAG = "FingerprintEnrollEnrolling"; private static final String TAG = "FingerprintEnrollEnrolling";
static final String TAG_SIDECAR = "sidecar"; static final String TAG_SIDECAR = "sidecar";
static final String KEY_STATE_CANCELED = "is_canceled";
private static final int PROGRESS_BAR_MAX = 10000; private static final int PROGRESS_BAR_MAX = 10000;
@@ -130,6 +131,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
private boolean mRestoring; private boolean mRestoring;
private Vibrator mVibrator; private Vibrator mVibrator;
private boolean mIsSetupWizard; private boolean mIsSetupWizard;
private boolean mIsCanceled;
private AccessibilityManager mAccessibilityManager; private AccessibilityManager mAccessibilityManager;
private boolean mIsAccessibilityEnabled; private boolean mIsAccessibilityEnabled;
private LottieAnimationView mIllustrationLottie; private LottieAnimationView mIllustrationLottie;
@@ -154,6 +156,9 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
restoreSavedState(savedInstanceState);
}
mFingerprintManager = getSystemService(FingerprintManager.class); mFingerprintManager = getSystemService(FingerprintManager.class);
final List<FingerprintSensorPropertiesInternal> props = final List<FingerprintSensorPropertiesInternal> props =
mFingerprintManager.getSensorPropertiesInternal(); mFingerprintManager.getSensorPropertiesInternal();
@@ -240,7 +245,6 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
return true; return true;
}); });
} }
mRestoring = savedInstanceState != null;
} }
@Override @Override
@@ -255,11 +259,22 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
if (mCanAssumeUdfps) { if (mCanAssumeUdfps) {
// Continue enrollment if restoring (e.g. configuration changed). Otherwise, wait // Continue enrollment if restoring (e.g. configuration changed). Otherwise, wait
// for the entry animation to complete before starting. // for the entry animation to complete before starting.
return mRestoring; return mRestoring && !mIsCanceled;
} }
return true; return true;
} }
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(KEY_STATE_CANCELED, mIsCanceled);
}
private void restoreSavedState(Bundle savedInstanceState) {
mRestoring = true;
mIsCanceled = savedInstanceState.getBoolean(KEY_STATE_CANCELED, false);
}
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
@@ -500,7 +515,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
@Override @Override
public void onEnrollmentError(int errMsgId, CharSequence errString) { public void onEnrollmentError(int errMsgId, CharSequence errString) {
FingerprintErrorDialog.showErrorDialog(this, errMsgId); FingerprintErrorDialog.showErrorDialog(this, errMsgId);
mIsCanceled = true;
cancelEnrollment();
stopIconAnimation(); stopIconAnimation();
stopListenOrientationEvent();
if (!mCanAssumeUdfps) { if (!mCanAssumeUdfps) {
mErrorText.removeCallbacks(mTouchAgainRunnable); mErrorText.removeCallbacks(mTouchAgainRunnable);
} }

View File

@@ -241,6 +241,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent()); final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
final boolean isDeferredSetupWizard = final boolean isDeferredSetupWizard =
WizardManagerHelper.isDeferredSetupWizard(getIntent()); WizardManagerHelper.isDeferredSetupWizard(getIntent());
final boolean isPortalSetupWizard =
WizardManagerHelper.isPortalSetupWizard(getIntent());
if (mFingerprintManager != null) { if (mFingerprintManager != null) {
final List<FingerprintSensorPropertiesInternal> props = final List<FingerprintSensorPropertiesInternal> props =
mFingerprintManager.getSensorPropertiesInternal(); mFingerprintManager.getSensorPropertiesInternal();
@@ -252,7 +254,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
getApplicationContext() getApplicationContext()
.getResources() .getResources()
.getInteger(R.integer.suw_max_fingerprints_enrollable); .getInteger(R.integer.suw_max_fingerprints_enrollable);
if (isSetupWizard && !isDeferredSetupWizard) { if (isSetupWizard && !isDeferredSetupWizard && !isPortalSetupWizard) {
if (numEnrolledFingerprints >= maxFingerprintsEnrollableIfSUW) { if (numEnrolledFingerprints >= maxFingerprintsEnrollableIfSUW) {
return R.string.fingerprint_intro_error_max; return R.string.fingerprint_intro_error_max;
} else { } else {

View File

@@ -18,11 +18,13 @@ package com.android.settings.biometrics.fingerprint;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
import static com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.KEY_STATE_CANCELED;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricConstants;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
@@ -68,7 +70,11 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); dialog.dismiss();
getActivity().recreate(); Activity activity = getActivity();
Intent intent = activity.getIntent();
intent.putExtra(KEY_STATE_CANCELED, false);
activity.startActivity(intent);
activity.finish();
} }
}) })
.setNegativeButton( .setNegativeButton(

View File

@@ -173,4 +173,24 @@ public class FingerprintEnrollIntroductionTest {
assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max); assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
} }
@Test
public void intro_CheckCanEnrollDuringPortal() {
setupFingerprintEnrollIntroWith(
new Intent().putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, true));
setFingerprintManagerToHave(2 /* numEnrollments */);
int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
assertThat(result).isEqualTo(0);
}
@Test
public void intro_CheckMaxEnrolledDuringPortal() {
setupFingerprintEnrollIntroWith(
new Intent().putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, true));
setFingerprintManagerToHave(6 /* numEnrollments */);
int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
}
} }