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

Commit b85248c2 authored by Kshitij's avatar Kshitij Committed by Nishith Khanna
Browse files

Settings: Add Google's custom sfps resumeEnroll()

- Needed by tangorpro
parent f05ca958
Loading
Loading
Loading
Loading
+70 −0
Original line number Diff line number Diff line
package com.android.settings.biometrics.fingerprint.feature;

import android.os.Binder;
import android.os.IBinder;
import android.os.IInterface;
import android.os.Parcel;
import android.os.RemoteException;

/**
 * Interface for fingerprint extension functionalities.
 */
public interface IFingerprintExt extends IInterface {
    String DESCRIPTOR = "com.google.hardware.biometrics.sidefps.IFingerprintExt";

    void resumeEnroll() throws RemoteException;

    /**
     * Binder stub class for the IFingerprintExt interface.
     */
    abstract class Stub extends Binder implements IFingerprintExt {

        /**
         * Returns an instance of IFingerprintExt if available from the provided IBinder.
         *
         * @param binder the IBinder to convert
         * @return IFingerprintExt instance or null if not available
         */
        public static IFingerprintExt asInterface(IBinder binder) {
            if (binder == null) {
                return null;
            }
            IInterface query = binder.queryLocalInterface(IFingerprintExt.DESCRIPTOR);
            if (query instanceof IFingerprintExt) {
                return (IFingerprintExt) query;
            }
            return new Proxy(binder);
        }

        /**
         * Proxy implementation for IFingerprintExt.
         */
        private static class Proxy implements IFingerprintExt {
            private final IBinder remote;

            Proxy(IBinder binder) {
                this.remote = binder;
            }

            @Override
            public IBinder asBinder() {
                return remote;
            }

            @Override
            public void resumeEnroll() throws RemoteException {
                Parcel data = Parcel.obtain();
                try {
                    data.writeInterfaceToken(DESCRIPTOR);
                    if (!remote.transact(TRANSACTION_RESUME_ENROLL, data, null, IBinder.FLAG_ONEWAY)) {
                        throw new RemoteException("Method resumeEnroll is unimplemented.");
                    }
                } finally {
                    data.recycle();
                }
            }

            private static final int TRANSACTION_RESUME_ENROLL = IBinder.FIRST_CALL_TRANSACTION + 1;
        }
    }
}
+19 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.fingerprint.FingerprintManager;
import android.text.TextUtils;
import android.view.View;
import android.view.animation.AccelerateInterpolator;

@@ -35,9 +36,11 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.biometrics.fingerprint.feature.SfpsUtils;
import com.android.settings.R;

import java.util.function.Function;
import java.util.function.Supplier;

public class SfpsEnrollmentFeatureImpl implements SfpsEnrollmentFeature {
    @VisibleForTesting
@@ -46,6 +49,8 @@ public class SfpsEnrollmentFeatureImpl implements SfpsEnrollmentFeature {
    @Nullable
    private FingerprintManager mFingerprintManager = null;

    private static final int HELP_RESUME_ENROLL_MSG = 1000;

    @Override
    public int getCurrentSfpsEnrollStage(int progressSteps, Function<Integer, Integer> mapper) {
        if (mapper == null) {
@@ -97,6 +102,20 @@ public class SfpsEnrollmentFeatureImpl implements SfpsEnrollmentFeature {
        return mFingerprintManager.getEnrollStageThreshold(index);
    }

    @Override
    public void handleOnEnrollmentHelp(int helpMsgId, CharSequence helpString, Supplier supplier) {
        if (supplier == null || TextUtils.isEmpty(helpString)) {
            return;
        }
        resumeEnrollmentIfNecessary(helpMsgId, helpString.toString(), supplier);
    }

    private void resumeEnrollmentIfNecessary(int helpMsgId, String helpString, Supplier supplier) {
        if (helpMsgId == HELP_RESUME_ENROLL_MSG) {
            SfpsUtils.resumeEnroll();
        }
    }

    @Override
    public Animator getHelpAnimator(@NonNull View target) {
        final float translationX = 40;
+62 −0
Original line number Diff line number Diff line
package com.android.settings.biometrics.fingerprint.feature;

import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import com.android.settings.biometrics.fingerprint.feature.IFingerprintExt;

import java.util.function.Supplier;

public abstract class SfpsUtils {

    private static final String TAG = "BiometricUtil";
    private static final String FINGERPRINT_SERVICE = "android.hardware.biometrics.fingerprint.IFingerprint/default";

    /**
     * Resumes fingerprint enrollment using the IFingerprintExt interface.
     */
    public static void resumeEnroll() {
        IFingerprintExt fingerprintExt = getFingerprintExtSupplier().get();

        if (fingerprintExt == null) {
            Log.e(TAG, "Failed to connect to the fingerprint extension");
            return;
        }

        try {
            fingerprintExt.resumeEnroll();
        } catch (RemoteException e) {
            Log.e(TAG, "Failed to resume enrollment due to RemoteException", e);
        }
    }

    /**
     * Provides a supplier for the IFingerprintExt interface.
     *
     * @return Supplier of IFingerprintExt
     */
    private static Supplier<IFingerprintExt> getFingerprintExtSupplier() {
        return () -> getFingerprintExtInstance();
    }

    /**
     * Retrieves an instance of IFingerprintExt.
     *
     * @return IFingerprintExt instance or null if unavailable
     */
    private static IFingerprintExt getFingerprintExtInstance() {
        try {
            IBinder serviceBinder = ServiceManager.waitForDeclaredService(FINGERPRINT_SERVICE);
            if (serviceBinder == null) {
                Log.e(TAG, "Unable to get fingerprint service");
                return null;
            }

            return IFingerprintExt.Stub.asInterface(serviceBinder.getExtension());
        } catch (RemoteException e) {
            Log.e(TAG, "Error accessing fingerprint extension", e);
            return null;
        }
    }
}