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

Commit 8c04657b authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Add destroy method to metric probes.

I was not able to reproduce the bug, but this adds some additional checks to captures do not happen after the operation completes.

Fix: 223912075
Test: atest BiometricLoggerTest FingerprintAuthenticationClientTest
Change-Id: Ia67a51b9cc0e88973d188a231fe84388e04b1cff
parent 7320750e
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -53,17 +53,29 @@ public class BiometricLogger {
    private boolean mShouldLogMetrics = true;

    private class ALSProbe implements Probe {
        private boolean mDestroyed = false;

        @Override
        public void enable() {
        public synchronized void enable() {
            if (!mDestroyed) {
                setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager));
            }
        }

        @Override
        public void disable() {
        public synchronized void disable() {
            if (!mDestroyed) {
                setLightSensorLoggingEnabled(null);
            }
        }

        @Override
        public synchronized void destroy() {
            disable();
            mDestroyed = true;
        }
    }

    // report only the most recent value
    // consider com.android.server.display.utils.AmbientFilter or similar if need arises
    private volatile float mLastAmbientLux = 0;
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ public class CallbackWithProbe<T extends Probe> implements ClientMonitorCallback

    @Override
    public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {
        mProbe.disable();
        mProbe.destroy();
    }

    @NonNull
+2 −0
Original line number Diff line number Diff line
@@ -27,4 +27,6 @@ public interface Probe {
    void enable();
    /** Stop sampling data. */
    void disable();
    /** Same as {@link #disable()} and ignores all future calls to this probe. */
    void destroy();
}
+15 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -250,4 +251,18 @@ public class BiometricLoggerTest {
        callback.onClientFinished(mClient, true /* success */);
        verify(mSensorManager, never()).registerListener(any(), any(), anyInt());
    }

    @Test
    public void testALSCallbackDestroyed() {
        mLogger = createLogger();
        final CallbackWithProbe<Probe> callback =
                mLogger.createALSCallback(true /* startWithClient */);

        callback.onClientStarted(mClient);
        callback.onClientFinished(mClient, false /* success */);

        reset(mSensorManager);
        callback.getProbe().enable();
        verify(mSensorManager, never()).registerListener(any(), any(), anyInt());
    }
}
+20 −1
Original line number Diff line number Diff line
@@ -31,9 +31,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.biometrics.fingerprint.PointerContext;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController;
@@ -63,12 +65,14 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import java.util.ArrayList;
import java.util.function.Consumer;

@Presubmit
@SmallTest
public class FingerprintAuthenticationClientTest {

    private static final int SENSOR_ID = 4;
    private static final int USER_ID = 8;
    private static final long OP_ID = 7;
    private static final long REQUEST_ID = 88;
@@ -93,6 +97,8 @@ public class FingerprintAuthenticationClientTest {
    @Mock
    private BiometricContext mBiometricContext;
    @Mock
    private BiometricManager mBiometricManager;
    @Mock
    private LockoutCache mLockoutCache;
    @Mock
    private IUdfpsOverlayController mUdfpsOverlayController;
@@ -118,6 +124,7 @@ public class FingerprintAuthenticationClientTest {

    @Before
    public void setup() {
        mContext.addMockSystemService(BiometricManager.class, mBiometricManager);
        when(mBiometricLogger.createALSCallback(anyBoolean())).thenAnswer(i ->
                new CallbackWithProbe<>(mLuxProbe, i.getArgument(0)));
        when(mBiometricContext.updateContext(any(), anyBoolean())).thenAnswer(
@@ -211,6 +218,18 @@ public class FingerprintAuthenticationClientTest {
        verify(mLuxProbe, times(2)).enable();
    }

    @Test
    public void luxProbeWhenFingerDown_unlessDestroyed() throws RemoteException {
        final FingerprintAuthenticationClient client = createClient();
        client.start(mCallback);
        client.onAuthenticated(new Fingerprint("name", 2 /* enrollmentId */, SENSOR_ID),
                true /* authenticated */, new ArrayList<>());
        verify(mLuxProbe).destroy();

        client.onAcquired(2, 0);
        verify(mLuxProbe, never()).enable();
    }

    @Test
    public void notifyHalWhenContextChanges() throws RemoteException {
        final FingerprintAuthenticationClient client = createClient();
@@ -284,6 +303,6 @@ public class FingerprintAuthenticationClientTest {
        true /* isStrongBiometric */,
        null /* taskStackListener */, mLockoutCache,
        mUdfpsOverlayController, mSideFpsController,
        false /* allowBackgroundAuthentication */, mSensorProps);
        true /* allowBackgroundAuthentication */, mSensorProps);
    }
}