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

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

Merge "Plumb remove functionality through"

parents f6d147fd 950f6383
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -59,6 +59,10 @@ public class FaceSettings extends DashboardFragment {
    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 @@ public class FaceSettings extends DashboardFragment {
    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);
            }
        }

+63 −1
Original line number Diff line number Diff line
@@ -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.R;
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 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
    @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;
    }
}