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

Commit 22c608be authored by Hao Dong's avatar Hao Dong Committed by Android (Google) Code Review
Browse files

Merge "Show a dialog preventing face enrollment in split mode." into udc-dev

parents c429ca3e 64277a23
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -871,12 +871,16 @@
    <string name="biometric_settings_use_face_or_fingerprint_preference_summary">Using face or fingerprint</string>
    <!-- Button text shown during enrollment to proceed after a child user has handed the device to a parent or guardian. [CHAR LIMIT=22] -->
    <string name="biometric_settings_hand_back_to_guardian_ok">OK</string>
    <!-- Dialog title for dialog which shows when trying to add face in split mode. [CHAR LIMIT=NONE] -->
    <string name="biometric_settings_add_face_in_split_mode_title">Can\u2019t set up Face Unlock</string>
    <!-- Dialog message for dialog which shows when trying to add face in split mode. [CHAR LIMIT=NONE] -->
    <string name="biometric_settings_add_face_in_split_mode_message">Exit split screen to set up Face Unlock</string>
    <!-- Dialog title for dialog which shows when trying to add fingerprint in split mode. [CHAR LIMIT=80] -->
    <string name="biometric_settings_add_fingerprint_in_split_mode_title">Can\u2019t set up fingerprint</string>
    <!-- Dialog message for dialog which shows when trying to add fingerprint in split mode. [CHAR LIMIT=NONE] -->
    <string name="biometric_settings_add_fingerprint_in_split_mode_message">Exit split screen to set up Fingerprint Unlock</string>
    <!-- Button text shown in adding fingerprint dialog that allows the user to go back to the settings page [CHAR LIMIT=22] -->
    <string name="biometric_settings_add_fingerprint_in_split_mode_ok">OK</string>
    <!-- Button text shown in adding biometrics dialog that allows the user to go back to the settings page [CHAR LIMIT=22] -->
    <string name="biometric_settings_add_biometrics_in_split_mode_ok">OK</string>
    <!-- Title of dialog shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so [CHAR LIMIT=30]-->
    <string name="lock_screen_intro_skip_title">Skip screen lock?</string>
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.biometrics;

import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;

import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
import android.hardware.biometrics.BiometricAuthenticator;
import android.os.Bundle;

import androidx.appcompat.app.AlertDialog;

import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;

/**
 * This alert dialog shows when fingerprint is being added in multi window mode.
 */
public class BiometricsSplitScreenDialog extends InstrumentedDialogFragment {
    private static final String KEY_BIOMETRICS_MODALITY = "biometrics_modality";

    @BiometricAuthenticator.Modality
    private int mBiometricsModality;

    /** Returns the new instance of the class */
    public static BiometricsSplitScreenDialog newInstance(
            @BiometricAuthenticator.Modality int biometricsModality) {
        final BiometricsSplitScreenDialog dialog = new BiometricsSplitScreenDialog();
        final Bundle args = new Bundle();
        args.putInt(KEY_BIOMETRICS_MODALITY, biometricsModality);
        dialog.setArguments(args);
        return dialog;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mBiometricsModality = getArguments().getInt(KEY_BIOMETRICS_MODALITY);
        int titleId;
        int messageId;
        switch (mBiometricsModality) {
            case TYPE_FACE:
                titleId = R.string.biometric_settings_add_face_in_split_mode_title;
                messageId = R.string.biometric_settings_add_face_in_split_mode_message;
                break;
            default:
                titleId = R.string.biometric_settings_add_fingerprint_in_split_mode_title;
                messageId = R.string.biometric_settings_add_fingerprint_in_split_mode_message;
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(titleId)
                .setMessage(messageId)
                .setPositiveButton(
                        R.string.biometric_settings_add_biometrics_in_split_mode_ok,
                        (DialogInterface.OnClickListener) (dialog, which) -> dialog.dismiss());
        return builder.create();
    }

    @Override
    public int getMetricsCategory() {
        switch (mBiometricsModality) {
            case TYPE_FACE:
                return SettingsEnums.DIALOG_ADD_FACE_ERROR_IN_SPLIT_MODE;
            default:
                return SettingsEnums.DIALOG_ADD_FINGERPRINT_ERROR_IN_SPLIT_MODE;
        }
    }
}
+22 −27
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
package com.android.settings.biometrics.combination;

import static android.app.Activity.RESULT_OK;
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;

import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED;

@@ -41,7 +43,7 @@ import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment;
import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.password.ChooseLockGeneric;
@@ -143,6 +145,18 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
        // since FingerprintSettings and FaceSettings revoke the challenge when finishing.
        if (getFacePreferenceKey().equals(key)) {
            mDoNotFinishActivity = true;

            //  If it's split mode and there is no enrolled face, show the dialog. (if there is
            //  enrolled face, FaceSettingsEnrollButtonPreferenceController#onClick will handle
            //  the dialog)
            if (getActivity().isInMultiWindowMode() && !mFaceManager.hasEnrolledTemplates(
                    mUserId)) {
                BiometricsSplitScreenDialog.newInstance(TYPE_FACE).show(
                        getActivity().getSupportFragmentManager(),
                        BiometricsSplitScreenDialog.class.getName());
                return true;
            }

            mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
                try {
                    final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId,
@@ -168,10 +182,14 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
        } else if (getFingerprintPreferenceKey().equals(key)) {
            mDoNotFinishActivity = true;

            if (shouldSkipForUdfpsInMultiWindowMode()) {
                new FingerprintSettingsFragment.FingerprintSplitScreenDialog().show(
            //  If it's split mode and there is no enrolled fingerprint, show the dialog. (if
            //  there is enrolled fingerprint, FingerprintSettingsFragment#onPreferenceTreeClick
            //  will handle the dialog)
            if (getActivity().isInMultiWindowMode() && !mFingerprintManager.hasEnrolledFingerprints(
                    mUserId)) {
                BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT).show(
                        getActivity().getSupportFragmentManager(),
                        FingerprintSettingsFragment.FingerprintSplitScreenDialog.class.getName());
                        BiometricsSplitScreenDialog.class.getName());
                return true;
            }

@@ -386,27 +404,4 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
            return 0;
        }
    }

    /**
     * Returns whether the click should be skipped.
     * True if the following conditions are all met:
     * 1. It's split mode.
     * 2. It's udfps.
     * 3. There is no enrolled fingerprint. (If there is enrolled fingerprint, FingerprintSettings
     * will handle the adding fingerprint.
     */
    private boolean shouldSkipForUdfpsInMultiWindowMode() {
        if (!getActivity().isInMultiWindowMode() || mFingerprintManager.hasEnrolledFingerprints(
                mUserId)) {
            return false;
        }

        for (FingerprintSensorPropertiesInternal prop :
                mFingerprintManager.getSensorPropertiesInternal()) {
            if (prop.isAnyUdfpsType()) {
                return true;
            }
        }
        return false;
    }
}
+21 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.biometrics.face;

import static android.app.Activity.RESULT_OK;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;

import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
@@ -42,6 +43,7 @@ import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -101,8 +103,25 @@ public class FaceSettings extends DashboardFragment {
        mEnrollButton.setVisible(true);
    };

    private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener = intent ->
            startActivityForResult(intent, ENROLL_REQUEST);
    private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener =
            new FaceSettingsEnrollButtonPreferenceController.Listener() {
                @Override
                public boolean checkInMultiWindowMode() {
                    if (!getActivity().isInMultiWindowMode()) {
                        return false;
                    }
                    // If it's in split mode, show the error dialog.
                    BiometricsSplitScreenDialog.newInstance(TYPE_FACE).show(
                            getActivity().getSupportFragmentManager(),
                            BiometricsSplitScreenDialog.class.getName());
                    return true;
                }

                @Override
                public void onStartEnrolling(Intent intent) {
                    FaceSettings.this.startActivityForResult(intent, ENROLL_REQUEST);
                }
            };

    /**
     * @param context
@@ -332,7 +351,6 @@ public class FaceSettings extends DashboardFragment {
            } else if (controller instanceof FaceSettingsEnrollButtonPreferenceController) {
                mEnrollController = (FaceSettingsEnrollButtonPreferenceController) controller;
                mEnrollController.setListener(mEnrollListener);
                mEnrollController.setActivity((SettingsActivity) getActivity());
            }
        }

+11 −6
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.widget.Button;
import androidx.preference.Preference;

import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settingslib.widget.LayoutPreference;
@@ -47,7 +46,6 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference

    private int mUserId;
    private byte[] mToken;
    private SettingsActivity mActivity;
    private Button mButton;
    private boolean mIsClicked;
    private Listener mListener;
@@ -77,6 +75,11 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference

    @Override
    public void onClick(View v) {
        // If it's in multi window mode, do not start the introduction intent.
        if (mListener != null && mListener.checkInMultiWindowMode()) {
            return;
        }

        mIsClicked = true;
        final Intent intent = new Intent();
        intent.setClassName(SETTINGS_PACKAGE_NAME, FaceEnrollIntroduction.class.getName());
@@ -109,10 +112,6 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference
        return wasClicked;
    }

    public void setActivity(SettingsActivity activity) {
        mActivity = activity;
    }

    public void setListener(Listener listener) {
        mListener = listener;
    }
@@ -121,6 +120,12 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference
     * Interface for registering callbacks related to the face enroll preference button.
     */
    public interface Listener {
        /**
         * Called to check whether it's in multi window mode
         * @return Whether it's in multi window mode.
         */
        boolean checkInMultiWindowMode();

        /**
         * Called when the user has indicated an intent to begin enrolling a new face.
         * @param intent The Intent that should be used to launch face enrollment.
Loading