Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3d4b76c authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add mandatory biometric prompt to platform surfaces (5/N)" into main

parents 1dfc1874 92ea474b
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -183,13 +183,16 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis

        if (requestCode == KEYGUARD_REQUEST) {
            final int userId = getActivity().getUserId();
            if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                    false /* biometricsSuccessfullyAuthenticated */,
            final Utils.BiometricStatus biometricAuthStatus =
                    Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                            false /* biometricsAuthenticationRequested */,
                    userId)) {
                            userId);
            if (biometricAuthStatus == Utils.BiometricStatus.OK) {
                Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRICS_REQUEST,
                        userId, false /* hideBackground */);
                return;
            } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) {
                return;
            }
        }

+32 −16
Original line number Diff line number Diff line
@@ -199,6 +199,15 @@ public final class Utils extends com.android.settingslib.Utils {
        return ActivityManager.isUserAMonkey();
    }

    /**
     * Enum for returning biometric status.
     * {@link OK} no error detected when requesting mandatory biometrics authentication
     * {@link NOT_ACTIVE} mandatory biometrics is not active
     * {@link LOCKOUT} biometric sensors are in lockout mode
     * {@link ERROR} corresponds to other errors
     */
    public enum BiometricStatus {OK, NOT_ACTIVE, LOCKOUT, ERROR}

    /**
     * Returns whether the device is voice-capable (meaning, it is also a phone).
     */
@@ -1490,33 +1499,40 @@ public final class Utils extends com.android.settingslib.Utils {
     * Request biometric authentication if all requirements for mandatory biometrics is satisfied.
     *
     * @param context                           of the corresponding activity/fragment
     * @param biometricsSuccessfullyAuthenticated if the user has already authenticated using
     *                                            biometrics
     * @param biometricsAuthenticationRequested if the activity/fragment has already requested for
     *                                          biometric prompt
     * @param userId                            user id for the authentication request
     * @return true if all requirements for mandatory biometrics is satisfied
     * @return biometric status when mandatory biometrics authentication is requested
     */
    public static boolean requestBiometricAuthenticationForMandatoryBiometrics(
    public static BiometricStatus requestBiometricAuthenticationForMandatoryBiometrics(
            @NonNull Context context,
            boolean biometricsSuccessfullyAuthenticated,
            boolean biometricsAuthenticationRequested, int userId) {
        final BiometricManager biometricManager = context.getSystemService(BiometricManager.class);
        if (biometricManager == null) {
            Log.e(TAG, "Biometric Manager is null.");
            return false;
            return BiometricStatus.NOT_ACTIVE;
        }
        final int status = biometricManager.canAuthenticate(userId,
                BiometricManager.Authenticators.MANDATORY_BIOMETRICS);
        return android.hardware.biometrics.Flags.mandatoryBiometrics()
                && status == BiometricManager.BIOMETRIC_SUCCESS
                && !biometricsSuccessfullyAuthenticated
                && !biometricsAuthenticationRequested;
        if (android.hardware.biometrics.Flags.mandatoryBiometrics()
                && !biometricsAuthenticationRequested) {
            switch(status) {
                case BiometricManager.BIOMETRIC_SUCCESS:
                    return BiometricStatus.OK;
                case BiometricManager.BIOMETRIC_ERROR_LOCKOUT:
                    return BiometricStatus.LOCKOUT;
                case BiometricManager.BIOMETRIC_ERROR_MANDATORY_NOT_ACTIVE:
                    return BiometricStatus.NOT_ACTIVE;
                default:
                    return BiometricStatus.ERROR;
            }
        }
        return BiometricStatus.NOT_ACTIVE;
    }

    /**
     * Launch biometric prompt for mandatory biometrics. Call
     * {@link #requestBiometricAuthenticationForMandatoryBiometrics(Context, boolean, boolean, int)}
     * {@link #requestBiometricAuthenticationForMandatoryBiometrics(Context, boolean, int)}
     * to check if all requirements for mandatory biometrics is satisfied
     * before launching biometric prompt.
     *
+15 −33
Original line number Diff line number Diff line
@@ -75,14 +75,11 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
    @VisibleForTesting
    static final String RETRY_PREFERENCE_BUNDLE = "retry_preference_bundle";
    private static final String BIOMETRICS_AUTH_REQUESTED = "biometrics_auth_requested";
    private static final String BIOMETRICS_AUTHENTICATED_SUCCESSFULLY =
            "biometrics_authenticated_successfully";

    protected int mUserId;
    protected long mGkPwHandle;
    private boolean mConfirmCredential;
    private boolean mBiometricsAuthenticationRequested;
    private boolean mBiometricsSuccessfullyAuthenticated;
    @Nullable private FaceManager mFaceManager;
    @Nullable private FingerprintManager mFingerprintManager;
    // Do not finish() if choosing/confirming credential, showing fp/face settings, or launching
@@ -120,9 +117,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
            mGkPwHandle = BiometricUtils.getGatekeeperPasswordHandle(getIntent());
        }

        mBiometricsSuccessfullyAuthenticated = getIntent().getBooleanExtra(
                BIOMETRICS_AUTHENTICATED_SUCCESSFULLY, false);

        if (savedInstanceState != null) {
            mConfirmCredential = savedInstanceState.getBoolean(SAVE_STATE_CONFIRM_CREDETIAL);
            mDoNotFinishActivity = savedInstanceState.getBoolean(DO_NOT_FINISH_ACTIVITY);
@@ -135,21 +129,12 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
            }
            mBiometricsAuthenticationRequested = savedInstanceState.getBoolean(
                    BIOMETRICS_AUTH_REQUESTED);
            mBiometricsSuccessfullyAuthenticated = savedInstanceState.getBoolean(
                    BIOMETRICS_AUTHENTICATED_SUCCESSFULLY);
        }

        if (mGkPwHandle == 0L && !mConfirmCredential) {
            mConfirmCredential = true;
            launchChooseOrConfirmLock();
        } else if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(
                getActivity(), mBiometricsSuccessfullyAuthenticated,
                mBiometricsAuthenticationRequested, mUserId)) {
            mBiometricsAuthenticationRequested = true;
            Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST,
                    mUserId, true /* hideBackground */);
        }

        updateUnlockPhonePreferenceSummary();

        final Preference useInAppsPreference = findPreference(getUseInAppsPreferenceKey());
@@ -161,13 +146,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
    @Override
    public void onResume() {
        super.onResume();
        if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested, mUserId)
                && mGkPwHandle != 0L) {
            mBiometricsAuthenticationRequested = true;
            Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST,
                    mUserId, true /* hideBackground */);
        }
        if (!mConfirmCredential) {
            mDoNotFinishActivity = false;
        }
@@ -204,9 +182,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
                    extras.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
                    extras.putInt(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, sensorId);
                    extras.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, challenge);
                    extras.putBoolean(
                            BiometricEnrollBase.EXTRA_BIOMETRICS_AUTHENTICATED_SUCCESSFULLY,
                            mBiometricsSuccessfullyAuthenticated);
                    onFaceOrFingerprintPreferenceTreeClick(preference);
                } catch (IllegalStateException e) {
                    if (retry) {
@@ -236,9 +211,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
                    final Bundle extras = preference.getExtras();
                    extras.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
                    extras.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, challenge);
                    extras.putBoolean(
                            BiometricEnrollBase.EXTRA_BIOMETRICS_AUTHENTICATED_SUCCESSFULLY,
                            mBiometricsSuccessfullyAuthenticated);
                    onFaceOrFingerprintPreferenceTreeClick(preference);
                } catch (IllegalStateException e) {
                    if (retry) {
@@ -323,8 +295,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
        }
        outState.putBoolean(BIOMETRICS_AUTH_REQUESTED,
                mBiometricsAuthenticationRequested);
        outState.putBoolean(BIOMETRICS_AUTHENTICATED_SUCCESSFULLY,
                mBiometricsSuccessfullyAuthenticated);
    }

    @Override
@@ -342,6 +312,20 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
                                com.google.android.setupdesign.R.anim.sud_slide_next_out);
                        retryPreferenceKey(mRetryPreferenceKey, mRetryPreferenceExtra);
                    }
                    final Utils.BiometricStatus biometricAuthStatus =
                            Utils.requestBiometricAuthenticationForMandatoryBiometrics(
                                    getActivity(),
                                    mBiometricsAuthenticationRequested,
                                    mUserId);
                    if (biometricAuthStatus == Utils.BiometricStatus.OK) {
                        mBiometricsAuthenticationRequested = true;
                        Utils.launchBiometricPromptForMandatoryBiometrics(this,
                                BIOMETRIC_AUTH_REQUEST,
                                mUserId, true /* hideBackground */);
                    } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) {
                        finish();
                        return;
                    }
                } else {
                    Log.d(getLogTag(), "Data null or GK PW missing.");
                    finish();
@@ -354,9 +338,7 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
            mRetryPreferenceExtra = null;
        } else if (requestCode == BIOMETRIC_AUTH_REQUEST) {
            mBiometricsAuthenticationRequested = false;
            if (resultCode == RESULT_OK) {
                mBiometricsSuccessfullyAuthenticated = true;
            } else {
            if (resultCode != RESULT_OK) {
                finish();
            }
        }
+12 −17
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static com.android.settings.Utils.isPrivateProfile;
import static com.android.settings.biometrics.BiometricEnrollBase.BIOMETRIC_AUTH_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_BIOMETRICS_AUTHENTICATED_SUCCESSFULLY;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;

@@ -98,7 +97,6 @@ public class FaceSettings extends DashboardFragment {

    private boolean mConfirmingPassword;
    private boolean mBiometricsAuthenticationRequested;
    private boolean mBiometricsSuccessfullyAuthenticated;

    private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {

@@ -150,8 +148,6 @@ public class FaceSettings extends DashboardFragment {
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putByteArray(KEY_TOKEN, mToken);
        outState.putBoolean(KEY_BIOMETRICS_SUCCESSFULLY_AUTHENTICATED,
                mBiometricsSuccessfullyAuthenticated);
    }

    @Override
@@ -171,8 +167,6 @@ public class FaceSettings extends DashboardFragment {
        mToken = getIntent().getByteArrayExtra(KEY_TOKEN);
        mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1);
        mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L);
        mBiometricsSuccessfullyAuthenticated = getIntent().getBooleanExtra(
                EXTRA_BIOMETRICS_AUTHENTICATED_SUCCESSFULLY, false);

        mUserId = getActivity().getIntent().getIntExtra(
                Intent.EXTRA_USER_ID, UserHandle.myUserId());
@@ -241,8 +235,6 @@ public class FaceSettings extends DashboardFragment {

        if (savedInstanceState != null) {
            mToken = savedInstanceState.getByteArray(KEY_TOKEN);
            mBiometricsSuccessfullyAuthenticated = savedInstanceState.getBoolean(
                    KEY_BIOMETRICS_SUCCESSFULLY_AUTHENTICATED);
        }
    }

@@ -288,12 +280,6 @@ public class FaceSettings extends DashboardFragment {
                Log.e(TAG, "Password not set");
                finish();
            }
        } else if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested,
                mUserId)) {
            mBiometricsAuthenticationRequested = true;
            Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST,
                    mUserId, true /* hideBackground */);
        } else {
            mAttentionController.setToken(mToken);
            mEnrollController.setToken(mToken);
@@ -330,6 +316,17 @@ public class FaceSettings extends DashboardFragment {
                final boolean hasEnrolled = mFaceManager.hasEnrolledTemplates(mUserId);
                mEnrollButton.setVisible(!hasEnrolled);
                mRemoveButton.setVisible(hasEnrolled);
                final Utils.BiometricStatus biometricAuthStatus =
                        Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                                mBiometricsAuthenticationRequested,
                                mUserId);
                if (biometricAuthStatus == Utils.BiometricStatus.OK) {
                    Utils.launchBiometricPromptForMandatoryBiometrics(this,
                            BIOMETRIC_AUTH_REQUEST,
                            mUserId, true /* hideBackground */);
                } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) {
                    finish();
                }
            }
        } else if (requestCode == ENROLL_REQUEST) {
            if (resultCode == RESULT_TIMEOUT) {
@@ -338,9 +335,7 @@ public class FaceSettings extends DashboardFragment {
            }
        } else if (requestCode == BIOMETRIC_AUTH_REQUEST) {
            mBiometricsAuthenticationRequested = false;
            if (resultCode == RESULT_OK) {
                mBiometricsSuccessfullyAuthenticated = true;
            } else {
            if (resultCode != RESULT_OK) {
                finish();
            }
        }
+13 −26
Original line number Diff line number Diff line
@@ -239,8 +239,6 @@ public class FingerprintSettings extends SubSettings {
                "security_settings_fingerprint_footer";
        private static final String KEY_BIOMETRICS_AUTHENTICATION_REQUESTED =
                "biometrics_authentication_requested";
        private static final String KEY_BIOMETRICS_SUCCESSFULLY_AUTHENTICATED =
                "biometrics_successfully_authenticated";

        private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000;
        private static final int MSG_FINGER_AUTH_SUCCESS = 1001;
@@ -276,7 +274,6 @@ public class FingerprintSettings extends SubSettings {
        private byte[] mToken;
        private boolean mLaunchedConfirm;
        private boolean mBiometricsAuthenticationRequested;
        private boolean mBiometricsSuccessfullyAuthenticated;
        private boolean mHasFirstEnrolled = true;
        private Drawable mHighlightDrawable;
        private int mUserId;
@@ -451,8 +448,6 @@ public class FingerprintSettings extends SubSettings {
                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
            mChallenge = activity.getIntent()
                    .getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, -1L);
            mBiometricsSuccessfullyAuthenticated = getIntent().getBooleanExtra(
                    BiometricEnrollBase.EXTRA_BIOMETRICS_AUTHENTICATED_SUCCESSFULLY, false);

            mAuthenticateSidecar = (FingerprintAuthenticateSidecar)
                    getFragmentManager().findFragmentByTag(TAG_AUTHENTICATE_SIDECAR);
@@ -494,8 +489,6 @@ public class FingerprintSettings extends SubSettings {
                mIsEnrolling = savedInstanceState.getBoolean(KEY_IS_ENROLLING, mIsEnrolling);
                mHasFirstEnrolled = savedInstanceState.getBoolean(KEY_HAS_FIRST_ENROLLED,
                        mHasFirstEnrolled);
                mBiometricsSuccessfullyAuthenticated = savedInstanceState.getBoolean(
                        KEY_BIOMETRICS_SUCCESSFULLY_AUTHENTICATED);
                mBiometricsAuthenticationRequested = savedInstanceState.getBoolean(
                        KEY_BIOMETRICS_AUTHENTICATION_REQUESTED);
            }
@@ -506,12 +499,6 @@ public class FingerprintSettings extends SubSettings {
                if (mToken == null) {
                    mLaunchedConfirm = true;
                    launchChooseOrConfirmLock();
                } else if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                        mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested,
                        mUserId)) {
                    mBiometricsAuthenticationRequested = true;
                    Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST,
                            mUserId, true /* hideBackground */);
                } else if (!mHasFirstEnrolled) {
                    mIsEnrolling = true;
                    addFirstFingerprint(null);
@@ -801,14 +788,6 @@ public class FingerprintSettings extends SubSettings {

            mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider()
                    .getUdfpsEnrollCalibrator(getActivity().getApplicationContext(), null, null);

            if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getActivity(),
                    mBiometricsSuccessfullyAuthenticated, mBiometricsAuthenticationRequested,
                    mUserId)) {
                mBiometricsAuthenticationRequested = true;
                Utils.launchBiometricPromptForMandatoryBiometrics(this,
                        BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */);
            }
        }

        private void updatePreferences() {
@@ -858,8 +837,6 @@ public class FingerprintSettings extends SubSettings {
            outState.putBoolean(KEY_HAS_FIRST_ENROLLED, mHasFirstEnrolled);
            outState.putBoolean(KEY_BIOMETRICS_AUTHENTICATION_REQUESTED,
                    mBiometricsAuthenticationRequested);
            outState.putBoolean(KEY_BIOMETRICS_SUCCESSFULLY_AUTHENTICATED,
                    mBiometricsSuccessfullyAuthenticated);
        }

        @Override
@@ -1023,6 +1000,18 @@ public class FingerprintSettings extends SubSettings {
                                        updateAddPreference();
                                    });
                        }
                        final Utils.BiometricStatus biometricAuthStatus =
                                Utils.requestBiometricAuthenticationForMandatoryBiometrics(
                                        getActivity(),
                                        mBiometricsAuthenticationRequested,
                                        mUserId);
                        if (biometricAuthStatus == Utils.BiometricStatus.OK) {
                            Utils.launchBiometricPromptForMandatoryBiometrics(this,
                                    BIOMETRIC_AUTH_REQUEST,
                                    mUserId, true /* hideBackground */);
                        } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) {
                            finish();
                        }
                    } else {
                        Log.d(TAG, "Data null or GK PW missing");
                        finish();
@@ -1075,9 +1064,7 @@ public class FingerprintSettings extends SubSettings {
                updateAddPreference();
            } else if (requestCode == BIOMETRIC_AUTH_REQUEST) {
                mBiometricsAuthenticationRequested = false;
                if (resultCode == RESULT_OK) {
                    mBiometricsSuccessfullyAuthenticated = true;
                } else {
                if (resultCode != RESULT_OK) {
                    finish();
                }
            }
Loading