Merge "Support customization for biometrics SafeSourceIssue" into main

This commit is contained in:
Treehugger Robot
2025-02-07 16:05:30 -08:00
committed by Android (Google) Code Review
6 changed files with 64 additions and 6 deletions

View File

@@ -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.BIOMETRIC_AUTH_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_DENIED; 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_CONSENT_GRANTED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
import static com.google.android.setupdesign.transition.TransitionHelper.TRANSITION_FADE_THROUGH; 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.R;
import com.android.settings.SetupWizardUtils; import com.android.settings.SetupWizardUtils;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.biometrics.combination.CombinedBiometricStatusUtils;
import com.android.settings.core.InstrumentedActivity; import com.android.settings.core.InstrumentedActivity;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockGeneric;
@@ -131,6 +133,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
private Bundle mParentalOptions; private Bundle mParentalOptions;
@Nullable private Long mGkPwHandle; @Nullable private Long mGkPwHandle;
@Nullable private ParentalConsentHelper mParentalConsentHelper; @Nullable private ParentalConsentHelper mParentalConsentHelper;
private boolean mIsPreviousEnrollmentCanceled = false;
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -531,6 +534,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
} else { } else {
Log.d(TAG, "Unknown result for set/choose lock: " + resultCode); Log.d(TAG, "Unknown result for set/choose lock: " + resultCode);
setResult(resultCode, newResultIntent()); setResult(resultCode, newResultIntent());
notifySafetyIssueActionLaunchedIfNeeded(resultCode);
finish(); finish();
} }
break; break;
@@ -549,16 +553,21 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
// SetupFingerprintEnroll*/FingerprintEnrollmentActivity to // SetupFingerprintEnroll*/FingerprintEnrollmentActivity to
// SetupFaceEnrollIntroduction // SetupFaceEnrollIntroduction
TransitionHelper.applyForwardTransition(this, TRANSITION_FADE_THROUGH); TransitionHelper.applyForwardTransition(this, TRANSITION_FADE_THROUGH);
mIsPreviousEnrollmentCanceled =
resultCode != BiometricEnrollBase.RESULT_FINISHED;
launchFaceOnlyEnroll(); launchFaceOnlyEnroll();
} else { } else {
notifySafetyIssueActionLaunchedIfNeeded(resultCode);
finishOrLaunchHandToParent(resultCode); finishOrLaunchHandToParent(resultCode);
} }
break; break;
case REQUEST_SINGLE_ENROLL_FACE: case REQUEST_SINGLE_ENROLL_FACE:
mIsSingleEnrolling = false; mIsSingleEnrolling = false;
if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable) { if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable) {
mIsPreviousEnrollmentCanceled = true;
launchFingerprintOnlyEnroll(); launchFingerprintOnlyEnroll();
} else { } else {
notifySafetyIssueActionLaunchedIfNeeded(resultCode);
finishOrLaunchHandToParent(resultCode); finishOrLaunchHandToParent(resultCode);
} }
break; break;
@@ -742,6 +751,15 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
startActivityForResult(intent, REQUEST_HANDOFF_PARENT); 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 @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.BIOMETRIC_ENROLL_ACTIVITY; return SettingsEnums.BIOMETRIC_ENROLL_ACTIVITY;

View File

@@ -36,6 +36,13 @@ import com.android.settingslib.utils.StringUtil;
*/ */
public class CombinedBiometricStatusUtils { 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 int mUserId;
private final Context mContext; private final Context mContext;
@Nullable @Nullable

View File

@@ -16,10 +16,13 @@
package com.android.settings.biometrics.face package com.android.settings.biometrics.face
import android.app.ComponentCaller
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.appcompat.app.AppCompatActivity 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 import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
@@ -46,9 +49,23 @@ class FaceEnroll: AppCompatActivity() {
*/ */
Log.d("FaceEnroll", "forward to $nextActivityClass") Log.d("FaceEnroll", "forward to $nextActivityClass")
val nextIntent = Intent(this, nextActivityClass) val nextIntent = Intent(this, nextActivityClass)
nextIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
nextIntent.putExtras(intent) 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() finish()
} }
} }

View File

@@ -16,10 +16,13 @@
package com.android.settings.biometrics.fingerprint package com.android.settings.biometrics.fingerprint
import android.app.ComponentCaller
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.appcompat.app.AppCompatActivity 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 import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
/** /**
@@ -69,9 +72,24 @@ open class FingerprintEnroll: AppCompatActivity() {
*/ */
Log.d("FingerprintEnroll", "forward to $nextActivityClass") Log.d("FingerprintEnroll", "forward to $nextActivityClass")
val nextIntent = Intent(this, nextActivityClass) val nextIntent = Intent(this, nextActivityClass)
nextIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
nextIntent.putExtras(intent) 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() finish()
} }
} }

View File

@@ -68,7 +68,6 @@ class FaceEnrollTest {
currentActivityInstance : FaceEnroll, currentActivityInstance : FaceEnroll,
nextActivityClass: Class<out Activity> nextActivityClass: Class<out Activity>
) { ) {
Truth.assertThat(currentActivityInstance.isFinishing).isTrue()
val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity
assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name) assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name)
assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1) assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1)

View File

@@ -95,7 +95,6 @@ class FingerprintEnrollTest {
currentActivityInstance : FingerprintEnroll, currentActivityInstance : FingerprintEnroll,
nextActivityClass: Class<out Activity> nextActivityClass: Class<out Activity>
) { ) {
assertThat(currentActivityInstance.isFinishing).isTrue()
val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity
assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name) assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name)
assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1) assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1)