diff --git a/services/core/java/com/android/server/biometrics/log/BiometricLogger.java b/services/core/java/com/android/server/biometrics/log/BiometricLogger.java index 2a8d9f1967eb8..ad24cf0591ca2 100644 --- a/services/core/java/com/android/server/biometrics/log/BiometricLogger.java +++ b/services/core/java/com/android/server/biometrics/log/BiometricLogger.java @@ -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; } } diff --git a/services/core/java/com/android/server/biometrics/log/CallbackWithProbe.java b/services/core/java/com/android/server/biometrics/log/CallbackWithProbe.java index f7b736885f716..93ff2a8cff974 100644 --- a/services/core/java/com/android/server/biometrics/log/CallbackWithProbe.java +++ b/services/core/java/com/android/server/biometrics/log/CallbackWithProbe.java @@ -46,7 +46,7 @@ public class CallbackWithProbe implements ClientMonitorCallback @Override public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) { - mProbe.disable(); + mProbe.destroy(); } @NonNull diff --git a/services/core/java/com/android/server/biometrics/log/Probe.java b/services/core/java/com/android/server/biometrics/log/Probe.java index 9e6fc6b8b8b2e..d1056a42b2573 100644 --- a/services/core/java/com/android/server/biometrics/log/Probe.java +++ b/services/core/java/com/android/server/biometrics/log/Probe.java @@ -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(); } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java index fe023374ba884..0b8e8adc5cc4b 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java @@ -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 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()); + } } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java index 6c50ca35be790..746302224d21f 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java @@ -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); } }