Loading src/com/android/settings/biometrics/fingerprint/feature/IFingerprintExt.java 0 → 100644 +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; } } } src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImpl.java +19 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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; Loading src/com/android/settings/biometrics/fingerprint/feature/SfpsUtils.java 0 → 100644 +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; } } } Loading
src/com/android/settings/biometrics/fingerprint/feature/IFingerprintExt.java 0 → 100644 +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; } } }
src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImpl.java +19 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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; Loading
src/com/android/settings/biometrics/fingerprint/feature/SfpsUtils.java 0 → 100644 +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; } } }