diff --git a/AndroidManifest.xml b/AndroidManifest.xml index dfbc02cf0a7..76a87706d6a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1562,6 +1562,11 @@ android:exported="false" android:screenOrientation="portrait"/> + + + diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index 1b4124018ff..64ddf4f8c48 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -20,11 +20,15 @@ import android.app.settings.SettingsEnums; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.UserHandle; +import com.android.settings.SetupWizardUtils; import com.android.settings.biometrics.face.FaceEnrollIntroduction; +import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor; import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction; import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction; import com.android.settings.core.InstrumentedActivity; +import com.android.settings.password.ChooseLockSettingsHelper; import com.google.android.setupcompat.util.WizardManagerHelper; @@ -36,6 +40,12 @@ import com.google.android.setupcompat.util.WizardManagerHelper; */ public class BiometricEnrollActivity extends InstrumentedActivity { + private static final String TAG = "BiometricEnrollActivity"; + + public static final String EXTRA_SKIP_INTRO = "skip_intro"; + + public static final class InternalActivity extends BiometricEnrollActivity {} + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -45,19 +55,43 @@ public class BiometricEnrollActivity extends InstrumentedActivity { // This logic may have to be modified on devices with multiple biometrics. if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { - intent = getFingerprintEnrollIntent(); + // ChooseLockGeneric can request to start fingerprint enroll bypassing the intro screen. + if (getIntent().getBooleanExtra(EXTRA_SKIP_INTRO, false) + && this instanceof InternalActivity) { + intent = getFingerprintFindSensorIntent(); + } else { + intent = getFingerprintIntroIntent(); + } } else if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { - intent = getFaceEnrollIntent(); + intent = getFaceIntroIntent(); } if (intent != null) { intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + + if (this instanceof InternalActivity) { + // Propagate challenge and user Id from ChooseLockGeneric. + final byte[] token = getIntent() + .getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); + final int userId = getIntent() + .getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL); + + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); + intent.putExtra(Intent.EXTRA_USER_ID, userId); + } + startActivity(intent); } finish(); } - private Intent getFingerprintEnrollIntent() { + private Intent getFingerprintFindSensorIntent() { + Intent intent = new Intent(this, FingerprintEnrollFindSensor.class); + SetupWizardUtils.copySetupExtras(getIntent(), intent); + return intent; + } + + private Intent getFingerprintIntroIntent() { if (WizardManagerHelper.isAnySetupWizard(getIntent())) { Intent intent = new Intent(this, SetupFingerprintEnrollIntroduction.class); WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent); @@ -67,7 +101,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } } - private Intent getFaceEnrollIntent() { + private Intent getFaceIntroIntent() { Intent intent = new Intent(this, FaceEnrollIntroduction.class); WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent); return intent; diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index a8e42060878..93e1fd487cc 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -150,7 +150,9 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase if (!mHasPassword) { // No password registered, launch into enrollment wizard. launchChooseLock(); - } else if (!mLaunchedConfirmLock || mToken == null) { + } else if (mToken == null) { + // It's possible to have a token but mLaunchedConfirmLock == false, since + // ChooseLockGeneric can pass us a token. launchConfirmLock(getConfirmLockTitleResId(), getChallenge()); } } diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 580c7ba334b..7eb8dc23818 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -66,8 +66,8 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; +import com.android.settings.biometrics.BiometricEnrollActivity; import com.android.settings.biometrics.BiometricEnrollBase; -import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.search.SearchFeatureProvider; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; @@ -76,7 +76,6 @@ import com.android.settingslib.RestrictedPreference; import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreferenceMixinCompat; -import java.util.Arrays; import java.util.List; public class ChooseLockGeneric extends SettingsActivity { @@ -141,7 +140,7 @@ public class ChooseLockGeneric extends SettingsActivity { @VisibleForTesting static final int CHOOSE_LOCK_REQUEST = 102; @VisibleForTesting - static final int CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST = 103; + static final int CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST = 103; @VisibleForTesting static final int SKIP_FINGERPRINT_REQUEST = 104; @@ -366,7 +365,7 @@ public class ChooseLockGeneric extends SettingsActivity { startActivityForResult( intent, mIsSetNewPassword && mHasChallenge - ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST + ? CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST : ENABLE_ENCRYPTION_REQUEST); } else { if (mForChangeCredRequiredForBoot) { @@ -411,9 +410,9 @@ public class ChooseLockGeneric extends SettingsActivity { finish(); } } - } else if (requestCode == CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST + } else if (requestCode == CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST && resultCode == BiometricEnrollBase.RESULT_FINISHED) { - Intent intent = getFindSensorIntent(getActivity()); + Intent intent = getBiometricEnrollIntent(getActivity()); if (data != null) { intent.putExtras(data.getExtras()); } @@ -438,8 +437,11 @@ public class ChooseLockGeneric extends SettingsActivity { } } - protected Intent getFindSensorIntent(Context context) { - return new Intent(context, FingerprintEnrollFindSensor.class); + protected Intent getBiometricEnrollIntent(Context context) { + final Intent intent = + new Intent(context, BiometricEnrollActivity.InternalActivity.class); + intent.putExtra(BiometricEnrollActivity.EXTRA_SKIP_INTRO, true); + return intent; } @Override @@ -764,7 +766,7 @@ public class ChooseLockGeneric extends SettingsActivity { intent.putExtra(EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS, getIntent().getExtras()); startActivityForResult(intent, mIsSetNewPassword && mHasChallenge - ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST + ? CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST : CHOOSE_LOCK_REQUEST); return; } diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java index 346e771d625..72b9fa8d328 100644 --- a/src/com/android/settings/password/SetupChooseLockGeneric.java +++ b/src/com/android/settings/password/SetupChooseLockGeneric.java @@ -42,6 +42,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.SetupEncryptionInterstitial; import com.android.settings.SetupWizardUtils; +import com.android.settings.biometrics.BiometricEnrollActivity; import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor; import com.android.settings.utils.SettingsDividerItemDecoration; @@ -229,8 +230,8 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric { } @Override - protected Intent getFindSensorIntent(Context context) { - final Intent intent = new Intent(context, SetupFingerprintEnrollFindSensor.class); + protected Intent getBiometricEnrollIntent(Context context) { + final Intent intent = getBiometricEnrollIntent(context); SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent); return intent; } diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java index a1db12ccf24..c692f55390d 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -224,7 +224,7 @@ public class ChooseLockGenericTest { initActivity(null); mFragment.onActivityResult( - ChooseLockGenericFragment.CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST, + ChooseLockGenericFragment.CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST, BiometricEnrollBase.RESULT_FINISHED, null /* data */); assertThat(mActivity.isFinishing()).isTrue();