Merge "Add destroy method to metric probes." into tm-dev

This commit is contained in:
Joe Bolinger
2022-04-01 21:54:33 +00:00
committed by Android (Google) Code Review
5 changed files with 54 additions and 6 deletions

View File

@@ -53,14 +53,26 @@ public class BiometricLogger {
private boolean mShouldLogMetrics = true; private boolean mShouldLogMetrics = true;
private class ALSProbe implements Probe { private class ALSProbe implements Probe {
private boolean mDestroyed = false;
@Override @Override
public void enable() { public synchronized void enable() {
setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager)); if (!mDestroyed) {
setLightSensorLoggingEnabled(getAmbientLightSensor(mSensorManager));
}
} }
@Override @Override
public void disable() { public synchronized void disable() {
setLightSensorLoggingEnabled(null); 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 @Override
public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) { public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {
mProbe.disable(); mProbe.destroy();
} }
@NonNull @NonNull

View File

@@ -27,4 +27,6 @@ public interface Probe {
void enable(); void enable();
/** Stop sampling data. */ /** Stop sampling data. */
void disable(); 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.anyLong;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -250,4 +251,18 @@ public class BiometricLoggerTest {
callback.onClientFinished(mClient, true /* success */); callback.onClientFinished(mClient, true /* success */);
verify(mSensorManager, never()).registerListener(any(), any(), anyInt()); 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.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.common.OperationContext; import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.fingerprint.ISession; import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.biometrics.fingerprint.PointerContext; import android.hardware.biometrics.fingerprint.PointerContext;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.ISidefpsController; import android.hardware.fingerprint.ISidefpsController;
import android.hardware.fingerprint.IUdfpsOverlayController; import android.hardware.fingerprint.IUdfpsOverlayController;
@@ -63,12 +65,14 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.function.Consumer; import java.util.function.Consumer;
@Presubmit @Presubmit
@SmallTest @SmallTest
public class FingerprintAuthenticationClientTest { public class FingerprintAuthenticationClientTest {
private static final int SENSOR_ID = 4;
private static final int USER_ID = 8; private static final int USER_ID = 8;
private static final long OP_ID = 7; private static final long OP_ID = 7;
private static final long REQUEST_ID = 88; private static final long REQUEST_ID = 88;
@@ -93,6 +97,8 @@ public class FingerprintAuthenticationClientTest {
@Mock @Mock
private BiometricContext mBiometricContext; private BiometricContext mBiometricContext;
@Mock @Mock
private BiometricManager mBiometricManager;
@Mock
private LockoutCache mLockoutCache; private LockoutCache mLockoutCache;
@Mock @Mock
private IUdfpsOverlayController mUdfpsOverlayController; private IUdfpsOverlayController mUdfpsOverlayController;
@@ -118,6 +124,7 @@ public class FingerprintAuthenticationClientTest {
@Before @Before
public void setup() { public void setup() {
mContext.addMockSystemService(BiometricManager.class, mBiometricManager);
when(mBiometricLogger.createALSCallback(anyBoolean())).thenAnswer(i -> when(mBiometricLogger.createALSCallback(anyBoolean())).thenAnswer(i ->
new CallbackWithProbe<>(mLuxProbe, i.getArgument(0))); new CallbackWithProbe<>(mLuxProbe, i.getArgument(0)));
when(mBiometricContext.updateContext(any(), anyBoolean())).thenAnswer( when(mBiometricContext.updateContext(any(), anyBoolean())).thenAnswer(
@@ -211,6 +218,18 @@ public class FingerprintAuthenticationClientTest {
verify(mLuxProbe, times(2)).enable(); 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 @Test
public void notifyHalWhenContextChanges() throws RemoteException { public void notifyHalWhenContextChanges() throws RemoteException {
final FingerprintAuthenticationClient client = createClient(); final FingerprintAuthenticationClient client = createClient();
@@ -284,6 +303,6 @@ public class FingerprintAuthenticationClientTest {
true /* isStrongBiometric */, true /* isStrongBiometric */,
null /* taskStackListener */, mLockoutCache, null /* taskStackListener */, mLockoutCache,
mUdfpsOverlayController, mSideFpsController, mUdfpsOverlayController, mSideFpsController,
false /* allowBackgroundAuthentication */, mSensorProps); true /* allowBackgroundAuthentication */, mSensorProps);
} }
} }