Merge "Plumb remove functionality through"
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index d7dc9f8..8eabf00 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -59,6 +59,10 @@
     private byte[] mToken;
     private FaceSettingsAttentionPreferenceController mAttentionController;
 
+    private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {
+        getActivity().finish();
+    };
+
     public static boolean isAvailable(Context context) {
         FaceManager manager = Utils.getFaceManagerOrNull(context);
         return manager != null && manager.isHardwareDetected();
@@ -146,10 +150,13 @@
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
         final List<AbstractPreferenceController> controllers =
                 buildPreferenceControllers(context, getSettingsLifecycle());
+        // There's no great way of doing this right now :/
         for (AbstractPreferenceController controller : controllers) {
             if (controller instanceof FaceSettingsAttentionPreferenceController) {
                 mAttentionController = (FaceSettingsAttentionPreferenceController) controller;
-                break;
+            } else if (controller instanceof FaceSettingsRemoveButtonPreferenceController) {
+                ((FaceSettingsRemoveButtonPreferenceController) controller)
+                        .setListener(mRemovalListener);
             }
         }
 
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
index 8e41eff..baab391 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
@@ -17,8 +17,13 @@
 package com.android.settings.biometrics.face;
 
 import android.content.Context;
+import android.hardware.face.Face;
+import android.hardware.face.FaceManager;
+import android.os.UserHandle;
+import android.util.Log;
 import android.view.View;
 import android.widget.Button;
+import android.widget.Toast;
 
 import androidx.preference.Preference;
 
@@ -26,18 +31,61 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.widget.LayoutPreference;
 
+import java.util.List;
+
 /**
- * Controller for the remove button.
+ * Controller for the remove button. This assumes that there is only a single face enrolled. The UI
+ * will likely change if multiple enrollments are allowed/supported.
  */
 public class FaceSettingsRemoveButtonPreferenceController extends BasePreferenceController
         implements View.OnClickListener {
 
+    private static final String TAG = "FaceSettings/Remove";
     private static final String KEY = "security_settings_face_delete_faces_container";
 
+    interface Listener {
+        void onRemoved();
+    }
+
     private Button mButton;
+    private List<Face> mFaces;
+    private Listener mListener;
+
+    private final Context mContext;
+    private final int mUserId;
+    private final FaceManager mFaceManager;
+    private final FaceManager.RemovalCallback mRemovalCallback = new FaceManager.RemovalCallback() {
+        @Override
+        public void onRemovalError(Face face, int errMsgId, CharSequence errString) {
+            Log.e(TAG, "Unable to remove face: " + face.getBiometricId()
+                    + " error: " + errMsgId + " " + errString);
+            Toast.makeText(mContext, errString, Toast.LENGTH_SHORT).show();
+        }
+
+        @Override
+        public void onRemovalSucceeded(Face face, int remaining) {
+            if (remaining == 0) {
+                mFaces = mFaceManager.getEnrolledFaces(mUserId);
+                if (!mFaces.isEmpty()) {
+                    mButton.setEnabled(true);
+                } else {
+                    mListener.onRemoved();
+                }
+            } else {
+                Log.v(TAG, "Remaining: " + remaining);
+            }
+        }
+    };
 
     public FaceSettingsRemoveButtonPreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
+        mContext = context;
+        mFaceManager = context.getSystemService(FaceManager.class);
+        // TODO: Use the profile-specific userId instead
+        mUserId = UserHandle.myUserId();
+        if (mFaceManager != null) {
+            mFaces = mFaceManager.getEnrolledFaces(mUserId);
+        }
     }
 
     public FaceSettingsRemoveButtonPreferenceController(Context context) {
@@ -66,7 +114,21 @@
     @Override
     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);
         }
     }
+
+    public void setListener(Listener listener) {
+        mListener = listener;
+    }
 }