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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user