From e5f62676c868db35f69110535f3049c51024cb57 Mon Sep 17 00:00:00 2001 From: Joshua McCloskey Date: Thu, 21 Dec 2023 21:31:53 +0000 Subject: [PATCH] Adding biometric FRR Notification atom. Test: statsd_testdrive 793 Test: statsd_testdrive 184 Test: m -j50 RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.biometrics Test: atest FingerprintUpdaterTest FaceUpdaterTest Bug: 302171089 Change-Id: I4c921b75321db79cc975b98b54b176a43379cd7c --- .../settings/biometrics/BiometricUtils.java | 2 ++ .../biometrics/face/FaceEnrollEducation.java | 2 ++ .../biometrics/face/FaceEnrollEnrolling.java | 2 +- .../face/FaceEnrollIntroduction.java | 3 ++ .../biometrics/face/FaceEnrollSidecar.java | 8 +++-- .../settings/biometrics/face/FaceUpdater.java | 21 ++++++++++--- .../FingerprintEnrollEnrolling.java | 2 +- .../FingerprintEnrollFindSensor.java | 4 ++- .../FingerprintEnrollIntroduction.java | 3 +- .../fingerprint/FingerprintEnrollSidecar.java | 26 +++++++++++++--- .../fingerprint/FingerprintUpdater.java | 18 +++++++++-- .../FingerprintManagerInteractorImpl.kt | 27 ++++++++++++++++ .../FingerprintEnrollmentV2Activity.kt | 1 + .../fragment/FingerprintSettingsV2Fragment.kt | 1 + .../FingerprintEnrollProgressViewModel.java | 6 ++-- .../face/FaceEnrollIntroductionTest.java | 15 +++++++++ .../FingerprintEnrollEnrollingTest.java | 3 +- .../FingerprintEnrollFindSensorTest.java | 3 +- .../FingerprintEnrollIntroductionTest.java | 14 +++++++++ .../biometrics/face/FaceUpdaterTest.java | 31 ++++++++++++------- .../fingerprint/FingerprintUpdaterTest.java | 16 ++++++---- ...ingerprintEnrollProgressViewModelTest.java | 13 ++++---- .../FingerprintManagerInteractorTest.kt | 11 +++++-- 23 files changed, 184 insertions(+), 48 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java index 53892bd9a1c..3376d86c115 100644 --- a/src/com/android/settings/biometrics/BiometricUtils.java +++ b/src/com/android/settings/biometrics/BiometricUtils.java @@ -25,6 +25,7 @@ import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.SensorProperties; import android.hardware.face.FaceManager; import android.hardware.face.FaceSensorPropertiesInternal; @@ -65,6 +66,7 @@ import java.lang.annotation.RetentionPolicy; */ public class BiometricUtils { private static final String TAG = "BiometricUtils"; + public static final String EXTRA_ENROLL_REASON = BiometricManager.EXTRA_ENROLL_REASON; /** The character ' • ' to separate the setup choose options */ public static final String SEPARATOR = " \u2022 "; diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java index 62e9757b365..6862bc921d7 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java @@ -265,6 +265,8 @@ public class FaceEnrollEducation extends BiometricEnrollBase { } intent.putExtra(EXTRA_KEY_REQUIRE_DIVERSITY, !mSwitchDiversity.isChecked()); + intent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + getIntent().getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1)); if (!mSwitchDiversity.isChecked() && mAccessibilityEnabled) { FaceEnrollAccessibilityDialog dialog = FaceEnrollAccessibilityDialog.newInstance(); diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java index e8bd0efea26..da3689a6b95 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java @@ -165,7 +165,7 @@ public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling { disabledFeatures[i] = mDisabledFeatures.get(i); } - return new FaceEnrollSidecar(disabledFeatures); + return new FaceEnrollSidecar(disabledFeatures, getIntent()); } @Override diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index eb50e0874c0..b0996a4f2b6 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -484,6 +484,9 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { protected Intent getEnrollingIntent() { Intent intent = new Intent(this, FaceEnrollEducation.class); WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent); + intent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + getIntent().getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1)); + return intent; } diff --git a/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java b/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java index de713dd3386..b7ba1b52508 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java @@ -18,6 +18,7 @@ package com.android.settings.biometrics.face; import android.app.Activity; import android.app.settings.SettingsEnums; +import android.content.Intent; import android.hardware.face.FaceManager; import com.android.settings.biometrics.BiometricEnrollSidecar; @@ -33,8 +34,11 @@ public class FaceEnrollSidecar extends BiometricEnrollSidecar { private FaceUpdater mFaceUpdater; - public FaceEnrollSidecar(int[] disabledFeatures) { + private Intent mIntent; + + public FaceEnrollSidecar(int[] disabledFeatures, Intent intent) { mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length); + mIntent = intent; } @Override @@ -47,7 +51,7 @@ public class FaceEnrollSidecar extends BiometricEnrollSidecar { public void startEnrollment() { super.startEnrollment(); mFaceUpdater.enroll(mUserId, mToken, mEnrollmentCancel, - mEnrollmentCallback, mDisabledFeatures); + mEnrollmentCallback, mDisabledFeatures, mIntent); } private FaceManager.EnrollmentCallback mEnrollmentCallback diff --git a/src/com/android/settings/biometrics/face/FaceUpdater.java b/src/com/android/settings/biometrics/face/FaceUpdater.java index 57c11953d6a..ddb68129df1 100644 --- a/src/com/android/settings/biometrics/face/FaceUpdater.java +++ b/src/com/android/settings/biometrics/face/FaceUpdater.java @@ -17,8 +17,10 @@ package com.android.settings.biometrics.face; import android.content.Context; +import android.content.Intent; import android.hardware.face.Face; import android.hardware.face.FaceEnrollCell; +import android.hardware.face.FaceEnrollOptions; import android.hardware.face.FaceManager; import android.os.CancellationSignal; import android.view.Surface; @@ -26,6 +28,7 @@ import android.view.Surface; import androidx.annotation.Nullable; import com.android.settings.Utils; +import com.android.settings.biometrics.BiometricUtils; import com.android.settings.safetycenter.BiometricsSafetySource; /** @@ -49,19 +52,19 @@ public class FaceUpdater { /** Wrapper around the {@link FaceManager#enroll} method. */ public void enroll(int userId, byte[] hardwareAuthToken, CancellationSignal cancel, - FaceManager.EnrollmentCallback callback, int[] disabledFeatures) { + FaceManager.EnrollmentCallback callback, int[] disabledFeatures, Intent intent) { this.enroll(userId, hardwareAuthToken, cancel, new NotifyingEnrollmentCallback(mContext, callback), disabledFeatures, - null, false); + null, false, intent); } /** Wrapper around the {@link FaceManager#enroll} method. */ public void enroll(int userId, byte[] hardwareAuthToken, CancellationSignal cancel, FaceManager.EnrollmentCallback callback, int[] disabledFeatures, - @Nullable Surface previewSurface, boolean debugConsent) { + @Nullable Surface previewSurface, boolean debugConsent, Intent intent) { mFaceManager.enroll(userId, hardwareAuthToken, cancel, new NotifyingEnrollmentCallback(mContext, callback), disabledFeatures, - previewSurface, debugConsent); + previewSurface, debugConsent, toFaceEnrollOptions(intent)); } /** Wrapper around the {@link FaceManager#remove} method. */ @@ -135,4 +138,14 @@ public class FaceUpdater { BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed } } + + private FaceEnrollOptions toFaceEnrollOptions(Intent intent) { + final int reason = intent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1); + final FaceEnrollOptions.Builder builder = new FaceEnrollOptions.Builder(); + builder.setEnrollReason(FaceEnrollOptions.ENROLL_REASON_UNKNOWN); + if (reason != -1) { + builder.setEnrollReason(reason); + } + return builder.build(); + } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 175e8f908ba..90b93461b9c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -352,7 +352,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { @Override protected BiometricEnrollSidecar getSidecar() { final FingerprintEnrollSidecar sidecar = new FingerprintEnrollSidecar(this, - FingerprintManager.ENROLL_ENROLL); + FingerprintManager.ENROLL_ENROLL, getIntent()); return sidecar; } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java index be3a769839e..6b7538ae220 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java @@ -292,6 +292,8 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements @Override protected Intent getFingerprintEnrollingIntent() { final Intent ret = super.getFingerprintEnrollingIntent(); + ret.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + getIntent().getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1)); if (Flags.udfpsEnrollCalibration()) { if (mCalibrator != null) { ret.putExtras(mCalibrator.getExtrasForNextIntent(true)); @@ -349,7 +351,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements FingerprintEnrollEnrolling.TAG_SIDECAR); if (mSidecar == null) { mSidecar = new FingerprintEnrollSidecar(this, - FingerprintManager.ENROLL_FIND_SENSOR); + FingerprintManager.ENROLL_FIND_SENSOR, getIntent()); getSupportFragmentManager().beginTransaction() .add(mSidecar, FingerprintEnrollEnrolling.TAG_SIDECAR) .commitAllowingStateLoss(); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index 242b7450c4d..f92cfbf6696 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -59,7 +59,6 @@ import com.google.android.setupdesign.util.DeviceHelper; import java.util.List; public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { - private static final String TAG = "FingerprintIntro"; @VisibleForTesting @@ -388,6 +387,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { intent.putExtras(mCalibrator.getExtrasForNextIntent(false)); } } + intent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + getIntent().getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1)); return intent; } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java index 493302bd13c..52d7d2be7a3 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java @@ -21,6 +21,8 @@ import static android.hardware.fingerprint.FingerprintManager.ENROLL_ENROLL; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.Intent; +import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; import android.os.SystemClock; import android.util.Log; @@ -28,6 +30,9 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.biometrics.BiometricEnrollSidecar; +import com.android.settings.biometrics.BiometricUtils; + +import com.google.android.setupcompat.util.WizardManagerHelper; /** * Sidecar fragment to handle the state around fingerprint enrollment. @@ -39,15 +44,18 @@ public class FingerprintEnrollSidecar extends BiometricEnrollSidecar { private @FingerprintManager.EnrollReason int mEnrollReason; private final MessageDisplayController mMessageDisplayController; private final boolean mMessageDisplayControllerFlag; + private final Intent mIntent; /** * Create a new FingerprintEnrollSidecar object. - * @param context associated context + * + * @param context associated context * @param enrollReason reason for enrollment */ public FingerprintEnrollSidecar(Context context, - @FingerprintManager.EnrollReason int enrollReason) { + @FingerprintManager.EnrollReason int enrollReason, Intent intent) { mEnrollReason = enrollReason; + mIntent = intent; int helpMinimumDisplayTime = context.getResources().getInteger( R.integer.enrollment_help_minimum_time_display); @@ -85,14 +93,21 @@ public class FingerprintEnrollSidecar extends BiometricEnrollSidecar { return; } + if (mIntent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1) == -1) { + final boolean isSuw = WizardManagerHelper.isAnySetupWizard(mIntent); + mIntent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + isSuw ? FingerprintEnrollOptions.ENROLL_REASON_SUW : + FingerprintEnrollOptions.ENROLL_REASON_SETTINGS); + } + if (mEnrollReason == ENROLL_ENROLL && mMessageDisplayControllerFlag) { //API calls need to be processed for {@link FingerprintEnrollEnrolling} mFingerprintUpdater.enroll(mToken, mEnrollmentCancel, mUserId, - mMessageDisplayController, mEnrollReason); + mMessageDisplayController, mEnrollReason, mIntent); } else { //No processing required for {@link FingerprintEnrollFindSensor} mFingerprintUpdater.enroll(mToken, mEnrollmentCancel, mUserId, mEnrollmentCallback, - mEnrollReason); + mEnrollReason, mIntent); } } @@ -100,7 +115,8 @@ public class FingerprintEnrollSidecar extends BiometricEnrollSidecar { mEnrollReason = enrollReason; } - @VisibleForTesting FingerprintManager.EnrollmentCallback mEnrollmentCallback + @VisibleForTesting + FingerprintManager.EnrollmentCallback mEnrollmentCallback = new FingerprintManager.EnrollmentCallback() { @Override diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java b/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java index 306b1a3e136..ea9abf1bb5c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java @@ -17,13 +17,16 @@ package com.android.settings.biometrics.fingerprint; import android.content.Context; +import android.content.Intent; import android.hardware.fingerprint.Fingerprint; +import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; import android.os.CancellationSignal; import androidx.annotation.Nullable; import com.android.settings.Utils; +import com.android.settings.biometrics.BiometricUtils; import com.android.settings.safetycenter.BiometricsSafetySource; /** @@ -48,9 +51,10 @@ public class FingerprintUpdater { /** Wrapper around the {@link FingerprintManager#enroll} method. */ public void enroll(byte [] hardwareAuthToken, CancellationSignal cancel, int userId, FingerprintManager.EnrollmentCallback callback, - @FingerprintManager.EnrollReason int enrollReason) { + @FingerprintManager.EnrollReason int enrollReason, Intent intent) { mFingerprintManager.enroll(hardwareAuthToken, cancel, userId, - new NotifyingEnrollmentCallback(mContext, callback), enrollReason); + new NotifyingEnrollmentCallback(mContext, callback), enrollReason, + toFingerprintEnrollOptions(intent)); } /** Wrapper around the {@link FingerprintManager#remove} method. */ @@ -138,4 +142,14 @@ public class FingerprintUpdater { BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed } } + + private FingerprintEnrollOptions toFingerprintEnrollOptions(Intent intent) { + final int reason = intent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1); + final FingerprintEnrollOptions.Builder builder = new FingerprintEnrollOptions.Builder(); + builder.setEnrollReason(FingerprintEnrollOptions.ENROLL_REASON_UNKNOWN); + if (reason != -1) { + builder.setEnrollReason(reason); + } + return builder.build(); + } } diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt index 135a36ce538..900f7cfb734 100644 --- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt +++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt @@ -18,12 +18,16 @@ package com.android.settings.biometrics.fingerprint2.domain.interactor import android.content.Context import android.content.Intent +import android.hardware.biometrics.BiometricConstants; +import android.hardware.biometrics.BiometricFingerprintConstants +import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager import android.hardware.fingerprint.FingerprintManager.GenerateChallengeCallback import android.hardware.fingerprint.FingerprintManager.RemovalCallback import android.os.CancellationSignal import android.util.Log import com.android.settings.biometrics.GatekeeperPasswordProvider +import com.android.settings.biometrics.BiometricUtils import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository @@ -35,6 +39,8 @@ import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard import com.android.settings.password.ChooseLockSettingsHelper +import com.android.systemui.biometrics.shared.model.toFingerprintSensor +import com.google.android.setupcompat.util.WizardManagerHelper import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.CancellableContinuation @@ -60,6 +66,7 @@ class FingerprintManagerInteractorImpl( private val gatekeeperPasswordProvider: GatekeeperPasswordProvider, private val pressToAuthInteractor: PressToAuthInteractor, private val fingerprintFlow: FingerprintFlow, + private val intent: Intent, ) : FingerprintManagerInteractor { private val maxFingerprints = @@ -158,12 +165,21 @@ class FingerprintManagerInteractorImpl( } val cancellationSignal = CancellationSignal() + + if (intent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1) === -1) { + val isSuw: Boolean = WizardManagerHelper.isAnySetupWizard(intent) + intent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + if (isSuw) FingerprintEnrollOptions.ENROLL_REASON_SUW else + FingerprintEnrollOptions.ENROLL_REASON_SETTINGS) + } + fingerprintManager.enroll( hardwareAuthToken, cancellationSignal, applicationContext.userId, enrollmentCallback, enrollReason.toOriginalReason(), + toFingerprintEnrollOptions(intent) ) awaitClose { // If the stream has not been ended, and the user has stopped collecting the flow @@ -244,4 +260,15 @@ class FingerprintManagerInteractorImpl( applicationContext.userId, ) } + + private fun toFingerprintEnrollOptions(intent: Intent): FingerprintEnrollOptions { + val reason: Int = + intent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1) + val builder: FingerprintEnrollOptions.Builder = FingerprintEnrollOptions.Builder() + builder.setEnrollReason(FingerprintEnrollOptions.ENROLL_REASON_UNKNOWN) + if (reason != -1) { + builder.setEnrollReason(reason) + } + return builder.build() + } } diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt index 9f3935bf070..65030de3f07 100644 --- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt +++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt @@ -191,6 +191,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() { GatekeeperPasswordProvider(LockPatternUtils(context)), pressToAuthInteractor, enrollType, + getIntent(), ) var challenge: Long? = intent.getExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE) as Long? diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt index a5f20212180..bd905242fc3 100644 --- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt +++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt @@ -232,6 +232,7 @@ class FingerprintSettingsV2Fragment : GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext)), pressToAuthInteractor, Settings, + getIntent() ) val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN) diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java index 9b25ee8f0a1..1cfec52df69 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java @@ -23,6 +23,7 @@ import static com.android.settings.biometrics2.ui.model.EnrollmentProgress.INITI import static com.android.settings.biometrics2.ui.model.EnrollmentProgress.INITIAL_STEPS; import android.app.Application; +import android.content.Intent; import android.content.res.Resources; import android.hardware.fingerprint.FingerprintManager.EnrollReason; import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback; @@ -212,10 +213,11 @@ public class FingerprintEnrollProgressViewModel extends AndroidViewModel { res.getBoolean(R.bool.enrollment_progress_priority_over_help), res.getBoolean(R.bool.enrollment_prioritize_acquire_messages), res.getInteger(R.integer.enrollment_collect_time)); - mFingerprintUpdater.enroll(mToken, mCancellationSignal, mUserId, callback, reason); + mFingerprintUpdater.enroll(mToken, mCancellationSignal, mUserId, callback, reason, + new Intent()); } else { mFingerprintUpdater.enroll(mToken, mCancellationSignal, mUserId, mEnrollmentCallback, - reason); + reason, new Intent()); } return mCancellationSignal; } diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java index beb7a9f4f11..a56c34cacdf 100644 --- a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java @@ -43,6 +43,7 @@ import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.hardware.face.Face; +import android.hardware.face.FaceEnrollOptions; import android.hardware.face.FaceManager; import android.hardware.face.FaceSensorProperties; import android.hardware.face.FaceSensorPropertiesInternal; @@ -196,6 +197,8 @@ public class FaceEnrollIntroductionTest { final Intent testIntent = new Intent(); // Set the challenge token so the confirm screen will not be shown testIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]); + testIntent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + FaceEnrollOptions.ENROLL_REASON_SETTINGS); when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn( null /* Simulate no posture intent */); @@ -220,6 +223,8 @@ public class FaceEnrollIntroductionTest { testIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]); testIntent.putExtra(EXTRA_KEY_NEXT_LAUNCHED, false); testIntent.putExtra(EXTRA_LAUNCHED_POSTURE_GUIDANCE, false); + testIntent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + FaceEnrollOptions.ENROLL_REASON_SETTINGS); when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn( testIntent); @@ -641,4 +646,14 @@ public class FaceEnrollIntroductionTest { final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(dialog).isNull(); } + + @Test + public void testFaceEnrollIntroduction_forwardsEnrollOptions() { + setupActivity(); + final Intent intent = mActivity.getEnrollingIntent(); + + assertThat(intent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1)) + .isEqualTo(FaceEnrollOptions.ENROLL_REASON_SETTINGS); + } + } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java index 4de369e5f41..91707cd6e84 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java @@ -669,7 +669,8 @@ public class FingerprintEnrollEnrollingTest { any(CancellationSignal.class), anyInt(), callbackCaptor.capture(), - eq(FingerprintManager.ENROLL_ENROLL)); + eq(FingerprintManager.ENROLL_ENROLL), + any()); return callbackCaptor.getValue(); } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java index 4d13bb63d19..68395b27001 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java @@ -227,7 +227,8 @@ public class FingerprintEnrollFindSensorTest { any(CancellationSignal.class), anyInt(), callbackCaptor.capture(), - eq(FingerprintManager.ENROLL_FIND_SENSOR)); + eq(FingerprintManager.ENROLL_FIND_SENSOR), + any()); return callbackCaptor.getValue(); } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java index 3eba91c854f..89e70d2990f 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java @@ -40,6 +40,7 @@ import android.content.res.Resources; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.Fingerprint; +import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; @@ -52,6 +53,7 @@ import androidx.annotation.Nullable; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.VerifyCredentialResponse; import com.android.settings.R; +import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.GatekeeperPasswordProvider; import com.google.android.setupcompat.util.WizardManagerHelper; @@ -289,6 +291,18 @@ public class FingerprintEnrollIntroductionTest { assertThat(mFingerprintEnrollIntroduction.shouldFinishWhenBackgrounded()).isEqualTo(true); } + @Test + public void testFingerprintEnrollIntroduction_forwardsEnrollOptions() { + final Intent intent = newTokenOnlyIntent(); + intent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON, + FingerprintEnrollOptions.ENROLL_REASON_SETTINGS); + setupFingerprintEnrollIntroWith(intent); + + final Intent enrollingIntent = mFingerprintEnrollIntroduction.getEnrollingIntent(); + assertThat(enrollingIntent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1)) + .isEqualTo(FingerprintEnrollOptions.ENROLL_REASON_SUW); + } + private Intent newTokenOnlyIntent() { return new Intent() .putExtra(EXTRA_KEY_CHALLENGE_TOKEN, new byte[] { 1 }); diff --git a/tests/unit/src/com/android/settings/biometrics/face/FaceUpdaterTest.java b/tests/unit/src/com/android/settings/biometrics/face/FaceUpdaterTest.java index 9190d0a5b82..1701eaae14e 100644 --- a/tests/unit/src/com/android/settings/biometrics/face/FaceUpdaterTest.java +++ b/tests/unit/src/com/android/settings/biometrics/face/FaceUpdaterTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.Context; +import android.content.Intent; import android.hardware.face.Face; import android.hardware.face.FaceEnrollCell; import android.hardware.face.FaceEnrollStages; @@ -93,7 +94,7 @@ public class FaceUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FaceManager.EnrollmentCallback.class); mFaceUpdater.enroll(USER_ID, HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, mEnrollmentCallback, - DISABLED_FEATURES); + DISABLED_FEATURES, new Intent()); verify(mFaceManager).enroll( eq(USER_ID), same(HARDWARE_AUTH_TOKEN), @@ -101,7 +102,8 @@ public class FaceUpdaterTest { callbackCaptor.capture(), same(DISABLED_FEATURES), same(null), - eq(false)); + eq(false), + any()); FaceManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentError(ERR_MSG_ID, ERR_STRING); @@ -121,7 +123,7 @@ public class FaceUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FaceManager.EnrollmentCallback.class); mFaceUpdater.enroll(USER_ID, HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, mEnrollmentCallback, - DISABLED_FEATURES); + DISABLED_FEATURES, new Intent()); verify(mFaceManager).enroll( eq(USER_ID), same(HARDWARE_AUTH_TOKEN), @@ -129,7 +131,8 @@ public class FaceUpdaterTest { callbackCaptor.capture(), same(DISABLED_FEATURES), same(null), - eq(false)); + eq(false), + any()); FaceManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentProgress(/* remaining= */ 0); @@ -142,7 +145,7 @@ public class FaceUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FaceManager.EnrollmentCallback.class); mFaceUpdater.enroll(USER_ID, HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, mEnrollmentCallback, - DISABLED_FEATURES); + DISABLED_FEATURES, new Intent()); verify(mFaceManager).enroll( eq(USER_ID), same(HARDWARE_AUTH_TOKEN), @@ -150,7 +153,8 @@ public class FaceUpdaterTest { callbackCaptor.capture(), same(DISABLED_FEATURES), same(null), - eq(false)); + eq(false), + any()); FaceManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentProgress(/* remaining= */ 1); @@ -163,7 +167,7 @@ public class FaceUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FaceManager.EnrollmentCallback.class); mFaceUpdater.enroll(USER_ID, HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, mEnrollmentCallback, - DISABLED_FEATURES, PREVIEW_SURFACE, DEBUG_CONSENT); + DISABLED_FEATURES, PREVIEW_SURFACE, DEBUG_CONSENT, new Intent()); verify(mFaceManager).enroll( eq(USER_ID), same(HARDWARE_AUTH_TOKEN), @@ -171,7 +175,8 @@ public class FaceUpdaterTest { callbackCaptor.capture(), same(DISABLED_FEATURES), same(PREVIEW_SURFACE), - eq(DEBUG_CONSENT)); + eq(DEBUG_CONSENT), + any()); FaceManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentError(ERR_MSG_ID, ERR_STRING); @@ -191,7 +196,7 @@ public class FaceUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FaceManager.EnrollmentCallback.class); mFaceUpdater.enroll(USER_ID, HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, mEnrollmentCallback, - DISABLED_FEATURES, PREVIEW_SURFACE, DEBUG_CONSENT); + DISABLED_FEATURES, PREVIEW_SURFACE, DEBUG_CONSENT, new Intent()); verify(mFaceManager).enroll( eq(USER_ID), same(HARDWARE_AUTH_TOKEN), @@ -199,7 +204,8 @@ public class FaceUpdaterTest { callbackCaptor.capture(), same(DISABLED_FEATURES), same(PREVIEW_SURFACE), - eq(DEBUG_CONSENT)); + eq(DEBUG_CONSENT), + any()); FaceManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentProgress(/* remaining= */ 0); @@ -212,7 +218,7 @@ public class FaceUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FaceManager.EnrollmentCallback.class); mFaceUpdater.enroll(USER_ID, HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, mEnrollmentCallback, - DISABLED_FEATURES, PREVIEW_SURFACE, DEBUG_CONSENT); + DISABLED_FEATURES, PREVIEW_SURFACE, DEBUG_CONSENT, new Intent()); verify(mFaceManager).enroll( eq(USER_ID), same(HARDWARE_AUTH_TOKEN), @@ -220,7 +226,8 @@ public class FaceUpdaterTest { callbackCaptor.capture(), same(DISABLED_FEATURES), same(PREVIEW_SURFACE), - eq(DEBUG_CONSENT)); + eq(DEBUG_CONSENT), + any()); FaceManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentProgress(/* remaining= */ 1); diff --git a/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintUpdaterTest.java b/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintUpdaterTest.java index 62435b4f8b2..6218efb0172 100644 --- a/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintUpdaterTest.java +++ b/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintUpdaterTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.Context; +import android.content.Intent; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; import android.os.CancellationSignal; @@ -78,13 +79,14 @@ public class FingerprintUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FingerprintManager.EnrollmentCallback.class); mFingerprintUpdater.enroll(HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, USER_ID, - mEnrollmentCallback, ENROLL_REASON); + mEnrollmentCallback, ENROLL_REASON, new Intent()); verify(mFingerprintManager).enroll( same(HARDWARE_AUTH_TOKEN), same(CANCELLATION_SIGNAL), eq(USER_ID), callbackCaptor.capture(), - eq(ENROLL_REASON)); + eq(ENROLL_REASON), + any()); FingerprintManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentError(ERR_MSG_ID, ERR_STRING); @@ -101,13 +103,14 @@ public class FingerprintUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FingerprintManager.EnrollmentCallback.class); mFingerprintUpdater.enroll(HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, USER_ID, - mEnrollmentCallback, ENROLL_REASON); + mEnrollmentCallback, ENROLL_REASON, new Intent()); verify(mFingerprintManager).enroll( same(HARDWARE_AUTH_TOKEN), same(CANCELLATION_SIGNAL), eq(USER_ID), callbackCaptor.capture(), - eq(ENROLL_REASON)); + eq(ENROLL_REASON), + any()); FingerprintManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentProgress(/* remaining= */ 0); @@ -120,13 +123,14 @@ public class FingerprintUpdaterTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(FingerprintManager.EnrollmentCallback.class); mFingerprintUpdater.enroll(HARDWARE_AUTH_TOKEN, CANCELLATION_SIGNAL, USER_ID, - mEnrollmentCallback, ENROLL_REASON); + mEnrollmentCallback, ENROLL_REASON, new Intent()); verify(mFingerprintManager).enroll( same(HARDWARE_AUTH_TOKEN), same(CANCELLATION_SIGNAL), eq(USER_ID), callbackCaptor.capture(), - eq(ENROLL_REASON)); + eq(ENROLL_REASON), + any()); FingerprintManager.EnrollmentCallback callback = callbackCaptor.getValue(); callback.onEnrollmentProgress(/* remaining= */ 1); diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java index 418db04f7cc..2c7afa62fe4 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java @@ -98,7 +98,7 @@ public class FingerprintEnrollProgressViewModelTest { mCallbackWrapper.mValue = invocation.getArgument(3); return null; }).when(mFingerprintUpdater).enroll(any(byte[].class), any(CancellationSignal.class), - eq(TEST_USER_ID), any(EnrollmentCallback.class), anyInt()); + eq(TEST_USER_ID), any(EnrollmentCallback.class), anyInt(), any()); } @Test @@ -112,7 +112,7 @@ public class FingerprintEnrollProgressViewModelTest { assertThat(ret).isNotNull(); verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class), - eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason)); + eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason), any()); assertThat(mCallbackWrapper.mValue instanceof MessageDisplayController).isFalse(); } @@ -127,7 +127,7 @@ public class FingerprintEnrollProgressViewModelTest { assertThat(ret).isNotNull(); verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class), - eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason)); + eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason), any()); assertThat(mCallbackWrapper.mValue instanceof MessageDisplayController).isFalse(); } @@ -146,7 +146,7 @@ public class FingerprintEnrollProgressViewModelTest { assertThat(ret).isNotNull(); verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class), - eq(TEST_USER_ID), any(MessageDisplayController.class), eq(enrollReason)); + eq(TEST_USER_ID), any(MessageDisplayController.class), eq(enrollReason), any()); assertThat(mCallbackWrapper.mValue).isNotNull(); assertThat(mCallbackWrapper.mValue instanceof MessageDisplayController).isTrue(); @@ -158,7 +158,7 @@ public class FingerprintEnrollProgressViewModelTest { // Shall not use the same MessageDisplayController verify(mFingerprintUpdater, times(2)).enroll(eq(token), any(CancellationSignal.class), - eq(TEST_USER_ID), any(MessageDisplayController.class), eq(enrollReason)); + eq(TEST_USER_ID), any(MessageDisplayController.class), eq(enrollReason), any()); assertThat(mCallbackWrapper.mValue).isNotNull(); assertThat(callback1).isNotEqualTo(mCallbackWrapper.mValue); } @@ -170,7 +170,8 @@ public class FingerprintEnrollProgressViewModelTest { assertThat(ret).isNull(); verify(mFingerprintUpdater, never()).enroll(any(byte[].class), - any(CancellationSignal.class), anyInt(), any(EnrollmentCallback.class), anyInt()); + any(CancellationSignal.class), anyInt(), any(EnrollmentCallback.class), anyInt(), + any()); } @Test diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt index c284a6fee7f..2b4bff77bc7 100644 --- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt +++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt @@ -19,6 +19,7 @@ package com.android.settings.fingerprint2.domain.interactor import android.content.Context import android.content.Intent import android.hardware.fingerprint.Fingerprint +import android.hardware.fingerprint.FingerprintEnrollOptions import android.hardware.fingerprint.FingerprintManager import android.hardware.fingerprint.FingerprintManager.CryptoObject import android.hardware.fingerprint.FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT @@ -99,6 +100,7 @@ class FingerprintManagerInteractorTest { gateKeeperPasswordProvider, pressToAuthInteractor, Default, + Intent(), ) } @@ -312,7 +314,8 @@ class FingerprintManagerInteractorTest { any(CancellationSignal::class.java), anyInt(), capture(enrollCallback), - eq(FingerprintManager.ENROLL_FIND_SENSOR) + eq(FingerprintManager.ENROLL_FIND_SENSOR), + any(FingerprintEnrollOptions::class.java), ) enrollCallback.value.onEnrollmentProgress(1) runCurrent() @@ -336,7 +339,8 @@ class FingerprintManagerInteractorTest { any(CancellationSignal::class.java), anyInt(), capture(enrollCallback), - eq(FingerprintManager.ENROLL_FIND_SENSOR) + eq(FingerprintManager.ENROLL_FIND_SENSOR), + any(FingerprintEnrollOptions::class.java), ) enrollCallback.value.onEnrollmentHelp(-1, "help") runCurrent() @@ -360,7 +364,8 @@ class FingerprintManagerInteractorTest { any(CancellationSignal::class.java), anyInt(), capture(enrollCallback), - eq(FingerprintManager.ENROLL_FIND_SENSOR) + eq(FingerprintManager.ENROLL_FIND_SENSOR), + any(FingerprintEnrollOptions::class.java), ) enrollCallback.value.onEnrollmentError(-1, "error") runCurrent()