Merge "Show confirmation dialog for removing enrollment"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c6ae67c..ea2a7f6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -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] -->
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index ea5a303..9651eec 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -31,6 +31,7 @@
 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 @@
     private int mUserId;
     private byte[] mToken;
     private FaceSettingsAttentionPreferenceController mAttentionController;
+    private FaceSettingsRemoveButtonPreferenceController mRemoveController;
 
     private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {
         if (getActivity() != null) {
@@ -166,8 +168,9 @@
             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());
             }
         }
 
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
index baab391..5174482 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
@@ -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 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 @@
     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 @@
     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 @@
         }
     };
 
+    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 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;
+    }
 }