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
This commit is contained in:
Joe Bolinger
2022-03-23 18:29:31 -07:00
parent 7320750e8d
commit 8c04657bd0
5 changed files with 54 additions and 6 deletions

View File

@@ -53,14 +53,26 @@ public class BiometricLogger {
private boolean mShouldLogMetrics = true;
private class ALSProbe implements Probe {
private boolean mDestroyed = false;
@Override
public void enable() {
setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager));
public synchronized void enable() {
if (!mDestroyed) {
setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager));
}
}
@Override
public void disable() {
setLightSensorLoggingEnabled(null);
public synchronized void disable() {
if (!mDestroyed) {
setLightSensorLoggingEnabled(null);
}
}
@Override
public synchronized void destroy() {
disable();
mDestroyed = true;
}
}

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}