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

Commit 0b8634d2 authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Send AoD context changed notification to HAL.

Bug: 204585936
Bug: 204584403
Test: atest FingerprintAuthenticationClientTest FingerprintDetectClientTest FingerprintEnrollClientTest
Change-Id: Idcccba362a151d0454d4070475073d07803e4e2a
parent 16f0d349
Loading
Loading
Loading
Loading
+14 −1
Original line number Original line Diff line number Diff line
@@ -82,10 +82,23 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor {
        super.destroy();
        super.destroy();


        // subclasses should do this earlier in most cases, but ensure it happens now
        // subclasses should do this earlier in most cases, but ensure it happens now
        getBiometricContext().unsubscribe(mOperationContext);
        unsubscribeBiometricContext();
    }
    }


    protected OperationContext getOperationContext() {
    protected OperationContext getOperationContext() {
        return getBiometricContext().updateContext(mOperationContext, isCryptoOperation());
        return getBiometricContext().updateContext(mOperationContext, isCryptoOperation());
    }
    }

    protected ClientMonitorCallback getBiometricContextUnsubscriber() {
        return new ClientMonitorCallback() {
            @Override
            public void onClientFinished(@NonNull BaseClientMonitor monitor, boolean success) {
                unsubscribeBiometricContext();
            }
        };
    }

    protected void unsubscribeBiometricContext() {
        getBiometricContext().unsubscribe(mOperationContext);
    }
}
}
+17 −4
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.fingerprint.PointerContext;
import android.hardware.biometrics.fingerprint.PointerContext;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.ISidefpsController;
@@ -107,7 +108,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
    @NonNull
    @NonNull
    @Override
    @Override
    protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
    protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
        return new ClientMonitorCompositeCallback(mALSProbeCallback, callback);
        return new ClientMonitorCompositeCallback(mALSProbeCallback,
                getBiometricContextUnsubscriber(), callback);
    }
    }


    @Override
    @Override
@@ -177,8 +179,17 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
        final AidlSession session = getFreshDaemon();
        final AidlSession session = getFreshDaemon();


        if (session.hasContextMethods()) {
        if (session.hasContextMethods()) {
            return session.getSession().authenticateWithContext(
            final OperationContext opContext = getOperationContext();
                    mOperationId, getOperationContext());
            final ICancellationSignal cancel =  session.getSession().authenticateWithContext(
                    mOperationId, opContext);
            getBiometricContext().subscribe(opContext, ctx -> {
                try {
                    session.getSession().onContextChanged(ctx);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Unable to notify context changed", e);
                }
            });
            return cancel;
        } else {
        } else {
            return session.getSession().authenticate(mOperationId);
            return session.getSession().authenticate(mOperationId);
        }
        }
@@ -187,6 +198,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
    @Override
    @Override
    protected void stopHalOperation() {
    protected void stopHalOperation() {
        mSensorOverlays.hide(getSensorId());
        mSensorOverlays.hide(getSensorId());
        unsubscribeBiometricContext();

        if (mCancellationSignal != null) {
        if (mCancellationSignal != null) {
            try {
            try {
                mCancellationSignal.cancel();
                mCancellationSignal.cancel();
@@ -216,7 +229,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
                context.y = y;
                context.y = y;
                context.minor = minor;
                context.minor = minor;
                context.major = major;
                context.major = major;
                context.isAoD = false; // TODO; get value
                context.isAoD = getBiometricContext().isAoD();
                session.getSession().onPointerDownWithContext(context);
                session.getSession().onPointerDownWithContext(context);
            } else {
            } else {
                session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major);
                session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major);
+39 −20
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
import android.hardware.biometrics.BiometricFingerprintConstants.FingerprintAcquired;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.fingerprint.PointerContext;
import android.hardware.biometrics.fingerprint.PointerContext;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintManager;
@@ -37,6 +38,8 @@ import android.util.Slog;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.log.CallbackWithProbe;
import com.android.server.biometrics.log.Probe;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricNotificationUtils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
@@ -56,6 +59,7 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps


    @NonNull private final FingerprintSensorPropertiesInternal mSensorProps;
    @NonNull private final FingerprintSensorPropertiesInternal mSensorProps;
    @NonNull private final SensorOverlays mSensorOverlays;
    @NonNull private final SensorOverlays mSensorOverlays;
    @NonNull private final CallbackWithProbe<Probe> mALSProbeCallback;


    private final @FingerprintManager.EnrollReason int mEnrollReason;
    private final @FingerprintManager.EnrollReason int mEnrollReason;
    @Nullable private ICancellationSignal mCancellationSignal;
    @Nullable private ICancellationSignal mCancellationSignal;
@@ -81,6 +85,8 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
        mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
        mSensorOverlays = new SensorOverlays(udfpsOverlayController, sidefpsController);
        mMaxTemplatesPerUser = maxTemplatesPerUser;
        mMaxTemplatesPerUser = maxTemplatesPerUser;


        mALSProbeCallback = getLogger().createALSCallback(false /* startWithClient */);

        mEnrollReason = enrollReason;
        mEnrollReason = enrollReason;
        if (enrollReason == FingerprintManager.ENROLL_FIND_SENSOR) {
        if (enrollReason == FingerprintManager.ENROLL_FIND_SENSOR) {
            getLogger().disableMetrics();
            getLogger().disableMetrics();
@@ -90,8 +96,8 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
    @NonNull
    @NonNull
    @Override
    @Override
    protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
    protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) {
        return new ClientMonitorCompositeCallback(
        return new ClientMonitorCompositeCallback(mALSProbeCallback,
                getLogger().createALSCallback(true /* startWithClient */), callback);
                getBiometricContextUnsubscriber(), callback);
    }
    }


    @Override
    @Override
@@ -139,22 +145,6 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
                >= mMaxTemplatesPerUser;
                >= mMaxTemplatesPerUser;
    }
    }


    @Override
    protected void stopHalOperation() {
        mSensorOverlays.hide(getSensorId());

        if (mCancellationSignal != null) {
            try {
                mCancellationSignal.cancel();
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote exception when requesting cancel", e);
                onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE,
                        0 /* vendorCode */);
                mCallback.onClientFinished(this, false /* success */);
            }
        }
    }

    @Override
    @Override
    protected void startHalOperation() {
    protected void startHalOperation() {
        mSensorOverlays.show(getSensorId(), getOverlayReasonFromEnrollReason(mEnrollReason), this);
        mSensorOverlays.show(getSensorId(), getOverlayReasonFromEnrollReason(mEnrollReason), this);
@@ -176,16 +166,44 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
                HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken);
                HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken);


        if (session.hasContextMethods()) {
        if (session.hasContextMethods()) {
            return session.getSession().enrollWithContext(hat, getOperationContext());
            final OperationContext opContext = getOperationContext();
            final ICancellationSignal cancel = session.getSession().enrollWithContext(
                    hat, opContext);
            getBiometricContext().subscribe(opContext, ctx -> {
                try {
                    session.getSession().onContextChanged(ctx);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Unable to notify context changed", e);
                }
            });
            return cancel;
        } else {
        } else {
            return session.getSession().enroll(hat);
            return session.getSession().enroll(hat);
        }
        }
    }
    }


    @Override
    protected void stopHalOperation() {
        mSensorOverlays.hide(getSensorId());
        unsubscribeBiometricContext();

        if (mCancellationSignal != null) {
            try {
                mCancellationSignal.cancel();
            } catch (RemoteException e) {
                Slog.e(TAG, "Remote exception when requesting cancel", e);
                onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE,
                        0 /* vendorCode */);
                mCallback.onClientFinished(this, false /* success */);
            }
        }
    }

    @Override
    @Override
    public void onPointerDown(int x, int y, float minor, float major) {
    public void onPointerDown(int x, int y, float minor, float major) {
        try {
        try {
            mIsPointerDown = true;
            mIsPointerDown = true;
            mALSProbeCallback.getProbe().enable();


            final AidlSession session = getFreshDaemon();
            final AidlSession session = getFreshDaemon();
            if (session.hasContextMethods()) {
            if (session.hasContextMethods()) {
@@ -195,7 +213,7 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
                context.y = y;
                context.y = y;
                context.minor = minor;
                context.minor = minor;
                context.major = major;
                context.major = major;
                context.isAoD = false;
                context.isAoD = getBiometricContext().isAoD();
                session.getSession().onPointerDownWithContext(context);
                session.getSession().onPointerDownWithContext(context);
            } else {
            } else {
                session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major);
                session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major);
@@ -209,6 +227,7 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
    public void onPointerUp() {
    public void onPointerUp() {
        try {
        try {
            mIsPointerDown = false;
            mIsPointerDown = false;
            mALSProbeCallback.getProbe().disable();


            final AidlSession session = getFreshDaemon();
            final AidlSession session = getFreshDaemon();
            if (session.hasContextMethods()) {
            if (session.hasContextMethods()) {
+6 −0
Original line number Original line Diff line number Diff line
@@ -158,6 +158,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
    private final SparseArray<UiState> mDisplayUiState = new SparseArray<>();
    private final SparseArray<UiState> mDisplayUiState = new SparseArray<>();
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private IUdfpsHbmListener mUdfpsHbmListener;
    private IUdfpsHbmListener mUdfpsHbmListener;
    @GuardedBy("mLock")
    private IBiometricContextListener mBiometricContextListener;


    @GuardedBy("mCurrentRequestAddTilePackages")
    @GuardedBy("mCurrentRequestAddTilePackages")
    private final ArrayMap<String, Long> mCurrentRequestAddTilePackages = new ArrayMap<>();
    private final ArrayMap<String, Long> mCurrentRequestAddTilePackages = new ArrayMap<>();
@@ -897,6 +899,9 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
    @Override
    @Override
    public void setBiometicContextListener(IBiometricContextListener listener) {
    public void setBiometicContextListener(IBiometricContextListener listener) {
        enforceStatusBarService();
        enforceStatusBarService();
        synchronized (mLock) {
            mBiometricContextListener = listener;
        }
        if (mBar != null) {
        if (mBar != null) {
            try {
            try {
                mBar.setBiometicContextListener(listener);
                mBar.setBiometicContextListener(listener);
@@ -1327,6 +1332,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
        mHandler.post(() -> {
        mHandler.post(() -> {
            synchronized (mLock) {
            synchronized (mLock) {
                setUdfpsHbmListener(mUdfpsHbmListener);
                setUdfpsHbmListener(mUdfpsHbmListener);
                setBiometicContextListener(mBiometricContextListener);
            }
            }
        });
        });
    }
    }
+19 −0
Original line number Original line Diff line number Diff line
@@ -109,6 +109,8 @@ public class FingerprintAuthenticationClientTest {
    private ArgumentCaptor<OperationContext> mOperationContextCaptor;
    private ArgumentCaptor<OperationContext> mOperationContextCaptor;
    @Captor
    @Captor
    private ArgumentCaptor<PointerContext> mPointerContextCaptor;
    private ArgumentCaptor<PointerContext> mPointerContextCaptor;
    @Captor
    private ArgumentCaptor<Consumer<OperationContext>> mContextInjector;


    @Rule
    @Rule
    public final MockitoRule mockito = MockitoJUnit.rule();
    public final MockitoRule mockito = MockitoJUnit.rule();
@@ -208,6 +210,23 @@ public class FingerprintAuthenticationClientTest {
        verify(mLuxProbe, times(2)).enable();
        verify(mLuxProbe, times(2)).enable();
    }
    }


    @Test
    public void notifyHalWhenContextChanges() throws RemoteException {
        final FingerprintAuthenticationClient client = createClient();
        client.start(mCallback);

        verify(mHal).authenticateWithContext(eq(OP_ID), mOperationContextCaptor.capture());
        OperationContext opContext = mOperationContextCaptor.getValue();

        // fake an update to the context
        verify(mBiometricContext).subscribe(eq(opContext), mContextInjector.capture());
        mContextInjector.getValue().accept(opContext);
        verify(mHal).onContextChanged(eq(opContext));

        client.stopHalOperation();
        verify(mBiometricContext).unsubscribe(same(opContext));
    }

    @Test
    @Test
    public void showHideOverlay_cancel() throws RemoteException {
    public void showHideOverlay_cancel() throws RemoteException {
        showHideOverlay(c -> c.cancel());
        showHideOverlay(c -> c.cancel());
Loading