From 6f4f66e5ed41e05a748a7520df679ffcb999251f Mon Sep 17 00:00:00 2001 From: Shawn Lin Date: Thu, 6 Feb 2025 05:42:16 +0000 Subject: [PATCH] Support customization for biometrics SafeSourceIssue Notify issue action launch when enrollment process is canceled Bug: 370940762 Test: atest FaceEnrollTest FingerprintEnrollTest Flag: com.android.settings.flags.biometrics_onboarding_education Change-Id: I91e2dcf44ee8cfd3e7c74d05f51a1ef30ea6f8b2 --- .../biometrics/BiometricEnrollActivity.java | 18 +++++++++++++++ .../CombinedBiometricStatusUtils.java | 7 ++++++ .../settings/biometrics/face/FaceEnroll.kt | 21 ++++++++++++++++-- .../fingerprint/FingerprintEnroll.kt | 22 +++++++++++++++++-- .../biometrics/face/FaceEnrollTest.kt | 1 - .../fingerprint/FingerprintEnrollTest.kt | 1 - 6 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index ec215670d0a..ef1970995df 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -22,6 +22,7 @@ import static android.provider.Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED; import static com.android.settings.biometrics.BiometricEnrollBase.BIOMETRIC_AUTH_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_DENIED; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_GRANTED; +import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED; import static com.google.android.setupdesign.transition.TransitionHelper.TRANSITION_FADE_THROUGH; @@ -53,6 +54,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.SetupWizardUtils; import com.android.settings.Utils; +import com.android.settings.biometrics.combination.CombinedBiometricStatusUtils; import com.android.settings.core.InstrumentedActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockGeneric; @@ -131,6 +133,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { private Bundle mParentalOptions; @Nullable private Long mGkPwHandle; @Nullable private ParentalConsentHelper mParentalConsentHelper; + private boolean mIsPreviousEnrollmentCanceled = false; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -531,6 +534,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } else { Log.d(TAG, "Unknown result for set/choose lock: " + resultCode); setResult(resultCode, newResultIntent()); + notifySafetyIssueActionLaunchedIfNeeded(resultCode); finish(); } break; @@ -549,16 +553,21 @@ public class BiometricEnrollActivity extends InstrumentedActivity { // SetupFingerprintEnroll*/FingerprintEnrollmentActivity to // SetupFaceEnrollIntroduction TransitionHelper.applyForwardTransition(this, TRANSITION_FADE_THROUGH); + mIsPreviousEnrollmentCanceled = + resultCode != BiometricEnrollBase.RESULT_FINISHED; launchFaceOnlyEnroll(); } else { + notifySafetyIssueActionLaunchedIfNeeded(resultCode); finishOrLaunchHandToParent(resultCode); } break; case REQUEST_SINGLE_ENROLL_FACE: mIsSingleEnrolling = false; if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable) { + mIsPreviousEnrollmentCanceled = true; launchFingerprintOnlyEnroll(); } else { + notifySafetyIssueActionLaunchedIfNeeded(resultCode); finishOrLaunchHandToParent(resultCode); } break; @@ -742,6 +751,15 @@ public class BiometricEnrollActivity extends InstrumentedActivity { startActivityForResult(intent, REQUEST_HANDOFF_PARENT); } + private void notifySafetyIssueActionLaunchedIfNeeded(int resultCode) { + if (getIntent().getBooleanExtra( + CombinedBiometricStatusUtils.EXTRA_LAUNCH_FROM_SAFETY_SOURCE_ISSUE, false) + && (resultCode != RESULT_FINISHED || mIsPreviousEnrollmentCanceled)) { + FeatureFactory.getFeatureFactory().getBiometricsFeatureProvider() + .notifySafetyIssueActionLaunched(); + } + } + @Override public int getMetricsCategory() { return SettingsEnums.BIOMETRIC_ENROLL_ACTIVITY; diff --git a/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java b/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java index 92b6d6042e4..6956faa2289 100644 --- a/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java +++ b/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java @@ -36,6 +36,13 @@ import com.android.settingslib.utils.StringUtil; */ public class CombinedBiometricStatusUtils { + /** + * An intent extra indicates that the enrollment process is launched from biometric + * SafetySourceIssue action. + */ + public static final String EXTRA_LAUNCH_FROM_SAFETY_SOURCE_ISSUE = + "launch_from_safety_source_issue"; + private final int mUserId; private final Context mContext; @Nullable diff --git a/src/com/android/settings/biometrics/face/FaceEnroll.kt b/src/com/android/settings/biometrics/face/FaceEnroll.kt index 0a3dae5d0a2..2ed628d30ed 100644 --- a/src/com/android/settings/biometrics/face/FaceEnroll.kt +++ b/src/com/android/settings/biometrics/face/FaceEnroll.kt @@ -16,10 +16,13 @@ package com.android.settings.biometrics.face +import android.app.ComponentCaller import android.content.Intent import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity +import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED +import com.android.settings.biometrics.combination.CombinedBiometricStatusUtils import com.android.settings.overlay.FeatureFactory.Companion.featureFactory @@ -46,9 +49,23 @@ class FaceEnroll: AppCompatActivity() { */ Log.d("FaceEnroll", "forward to $nextActivityClass") val nextIntent = Intent(this, nextActivityClass) - nextIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) nextIntent.putExtras(intent) - startActivity(nextIntent) + startActivityForResult(nextIntent, 0) + } + + override fun onActivityResult( + requestCode: Int, + resultCode: Int, + data: Intent?, + caller: ComponentCaller + ) { + super.onActivityResult(requestCode, resultCode, data, caller) + if (intent.getBooleanExtra( + CombinedBiometricStatusUtils.EXTRA_LAUNCH_FROM_SAFETY_SOURCE_ISSUE, false) + && resultCode != RESULT_FINISHED) { + featureFactory.biometricsFeatureProvider.notifySafetyIssueActionLaunched() + } + setResult(resultCode, data) finish() } } \ No newline at end of file diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnroll.kt b/src/com/android/settings/biometrics/fingerprint/FingerprintEnroll.kt index 6439fe6922c..795be132e64 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnroll.kt +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnroll.kt @@ -16,10 +16,13 @@ package com.android.settings.biometrics.fingerprint +import android.app.ComponentCaller import android.content.Intent import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity +import com.android.settings.biometrics.BiometricEnrollBase +import com.android.settings.biometrics.combination.CombinedBiometricStatusUtils import com.android.settings.overlay.FeatureFactory.Companion.featureFactory /** @@ -69,9 +72,24 @@ open class FingerprintEnroll: AppCompatActivity() { */ Log.d("FingerprintEnroll", "forward to $nextActivityClass") val nextIntent = Intent(this, nextActivityClass) - nextIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) nextIntent.putExtras(intent) - startActivity(nextIntent) + startActivityForResult(nextIntent, 0) + } + + override fun onActivityResult( + requestCode: Int, + resultCode: Int, + data: Intent?, + caller: ComponentCaller + ) { + super.onActivityResult(requestCode, resultCode, data, caller) + if (intent.getBooleanExtra( + CombinedBiometricStatusUtils.EXTRA_LAUNCH_FROM_SAFETY_SOURCE_ISSUE, false) + && resultCode != BiometricEnrollBase.RESULT_FINISHED + ) { + featureFactory.biometricsFeatureProvider.notifySafetyIssueActionLaunched() + } + setResult(resultCode, data) finish() } } \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollTest.kt b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollTest.kt index e600061b316..f4786388f50 100644 --- a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollTest.kt +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollTest.kt @@ -68,7 +68,6 @@ class FaceEnrollTest { currentActivityInstance : FaceEnroll, nextActivityClass: Class ) { - Truth.assertThat(currentActivityInstance.isFinishing).isTrue() val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name) assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1) diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt index 0bfa9f31220..b7d3d41af12 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt @@ -95,7 +95,6 @@ class FingerprintEnrollTest { currentActivityInstance : FingerprintEnroll, nextActivityClass: Class ) { - assertThat(currentActivityInstance.isFinishing).isTrue() val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name) assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1)