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

Commit cd829ace authored by Kevin Chyn's avatar Kevin Chyn Committed by Android (Google) Code Review
Browse files

Merge "Show confirmation dialog for removing enrollment"

parents 08d9835b e00f7e02
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -943,6 +943,11 @@
    <!-- Text shown in face settings explaining what your face can be used for. [CHAR LIMIT=NONE] -->
    <string name="security_settings_face_settings_footer">Your face can be used to unlock your device and access apps.
        <annotation id="url">Learn more</annotation></string>
    <!-- Dialog title shown when the user removes an enrollment [CHAR LIMIT=35] -->
    <string name="security_settings_face_settings_remove_dialog_title">Delete face data?</string>
    <!-- Dialog contents shown when the user removes an enrollment [CHAR LIMIT=NONE] -->
    <string name="security_settings_face_settings_remove_dialog_details">Data recorded by face unlock will be permanently and securely deleted. After removal, you will need your PIN, pattern, or password to unlock your phone, sign in to apps, and confirm payments.</string>
    <!-- Fingerprint enrollment and settings --><skip />
    <!-- Title shown for menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] -->
+5 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.provider.SearchIndexableResource;
import android.util.Log;

import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -56,6 +57,7 @@ public class FaceSettings extends DashboardFragment {
    private int mUserId;
    private byte[] mToken;
    private FaceSettingsAttentionPreferenceController mAttentionController;
    private FaceSettingsRemoveButtonPreferenceController mRemoveController;

    private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {
        if (getActivity() != null) {
@@ -166,8 +168,9 @@ public class FaceSettings extends DashboardFragment {
            if (controller instanceof FaceSettingsAttentionPreferenceController) {
                mAttentionController = (FaceSettingsAttentionPreferenceController) controller;
            } else if (controller instanceof FaceSettingsRemoveButtonPreferenceController) {
                ((FaceSettingsRemoveButtonPreferenceController) controller)
                        .setListener(mRemovalListener);
                mRemoveController = (FaceSettingsRemoveButtonPreferenceController) controller;
                mRemoveController.setListener(mRemovalListener);
                mRemoveController.setActivity((SettingsActivity) getActivity());
            }
        }

+63 −10
Original line number Diff line number Diff line
@@ -16,9 +16,14 @@

package com.android.settings.biometrics.face;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.Log;
import android.view.View;
@@ -28,7 +33,9 @@ import android.widget.Toast;
import androidx.preference.Preference;

import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.widget.LayoutPreference;

import java.util.List;
@@ -43,6 +50,33 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
    private static final String TAG = "FaceSettings/Remove";
    private static final String KEY = "security_settings_face_delete_faces_container";

    public static class ConfirmRemoveDialog extends InstrumentedDialogFragment {

        private DialogInterface.OnClickListener mOnClickListener;

        @Override
        public int getMetricsCategory() {
            return SettingsEnums.DIALOG_FACE_REMOVE;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            builder.setTitle(R.string.security_settings_face_settings_remove_dialog_title)
                    .setMessage(R.string.security_settings_face_settings_remove_dialog_details)
                    .setPositiveButton(R.string.okay, mOnClickListener)
                    .setNegativeButton(R.string.cancel, mOnClickListener);
            AlertDialog dialog = builder.create();
            dialog.setCanceledOnTouchOutside(false);
            return dialog;
        }

        public void setOnClickListener(DialogInterface.OnClickListener listener) {
            mOnClickListener = listener;
        }
    }

    interface Listener {
        void onRemoved();
    }
@@ -50,6 +84,7 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
    private Button mButton;
    private List<Face> mFaces;
    private Listener mListener;
    private SettingsActivity mActivity;

    private final Context mContext;
    private final int mUserId;
@@ -77,6 +112,27 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
        }
    };

    private final DialogInterface.OnClickListener mOnClickListener
            = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (which == DialogInterface.BUTTON_POSITIVE) {
                if (mFaces.isEmpty()) {
                    Log.e(TAG, "No faces");
                    return;
                }
                if (mFaces.size() > 1) {
                    Log.e(TAG, "Multiple enrollments: " + mFaces.size());
                }

                // Remove the first/only face
                mFaceManager.remove(mFaces.get(0), mUserId, mRemovalCallback);
            } else {
                mButton.setEnabled(true);
            }
        }
    };

    public FaceSettingsRemoveButtonPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mContext = context;
@@ -115,20 +171,17 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
    public void onClick(View v) {
        if (v == mButton) {
            mButton.setEnabled(false);
            if (mFaces.isEmpty()) {
                Log.e(TAG, "No faces");
                return;
            }
            if (mFaces.size() > 1) {
                Log.e(TAG, "Multiple enrollments: " + mFaces.size());
            }

            // Remove the first/only face
            mFaceManager.remove(mFaces.get(0), mUserId, mRemovalCallback);
            ConfirmRemoveDialog dialog = new ConfirmRemoveDialog();
            dialog.setOnClickListener(mOnClickListener);
            dialog.show(mActivity.getSupportFragmentManager(), ConfirmRemoveDialog.class.getName());
        }
    }

    public void setListener(Listener listener) {
        mListener = listener;
    }

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