Loading services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java +4 −0 Original line number Diff line number Diff line Loading @@ -210,4 +210,8 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement public boolean isInterruptable() { return true; } public boolean isAlreadyCancelled() { return mAlreadyCancelled; } } services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +8 −0 Original line number Diff line number Diff line Loading @@ -268,6 +268,14 @@ public class BiometricScheduler { return; } if (mCurrentOperation.isAcquisitionOperation()) { AcquisitionClient client = (AcquisitionClient) mCurrentOperation.getClientMonitor(); if (client.isAlreadyCancelled()) { mCurrentOperation.cancel(mHandler, mInternalCallback); return; } } if (mGestureAvailabilityDispatcher != null && mCurrentOperation.isAcquisitionOperation()) { mGestureAvailabilityDispatcher.markSensorActive( mCurrentOperation.getSensorId(), true /* active */); Loading services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java +55 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.biometrics.sensors; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_ERROR_CANCELED; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_SUCCESS; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; Loading Loading @@ -405,6 +407,59 @@ public class BiometricSchedulerTest { testCancelsEnrollWhenRequestId(10L, 20, false /* started */); } @Test public void testCancelAuthenticationClientWithoutStarting() { final Supplier<Object> lazyDaemon = () -> mock(Object.class); final TestHalClientMonitor client1 = new TestHalClientMonitor(mContext, mToken, lazyDaemon); final ClientMonitorCallbackConverter callback = mock(ClientMonitorCallbackConverter.class); final TestAuthenticationClient client2 = new TestAuthenticationClient(mContext, lazyDaemon, mToken, callback, mBiometricContext); //Schedule authentication client to the pending queue mScheduler.scheduleClientMonitor(client1); mScheduler.scheduleClientMonitor(client2); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isEqualTo(client1); client2.cancel(); waitForIdle(); assertThat(client2.isAlreadyCancelled()).isTrue(); client1.getCallback().onClientFinished(client1, false); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isNull(); } @Test public void testCancelAuthenticationClientWithoutStarting_whenAppCrashes() { final Supplier<Object> lazyDaemon = () -> mock(Object.class); final TestHalClientMonitor client1 = new TestHalClientMonitor(mContext, mToken, lazyDaemon); final ClientMonitorCallbackConverter callback = mock(ClientMonitorCallbackConverter.class); final TestAuthenticationClient client2 = new TestAuthenticationClient(mContext, lazyDaemon, mToken, callback, mBiometricContext); //Schedule authentication client to the pending queue mScheduler.scheduleClientMonitor(client1); mScheduler.scheduleClientMonitor(client2); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isEqualTo(client1); //App crashes client2.binderDied(); waitForIdle(); assertThat(client2.isAlreadyCancelled()).isTrue(); client1.getCallback().onClientFinished(client1, false); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isNull(); } private void testCancelsEnrollWhenRequestId(@Nullable Long requestId, long cancelRequestId, boolean started) { final Supplier<Object> lazyDaemon = () -> mock(Object.class); Loading Loading
services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java +4 −0 Original line number Diff line number Diff line Loading @@ -210,4 +210,8 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement public boolean isInterruptable() { return true; } public boolean isAlreadyCancelled() { return mAlreadyCancelled; } }
services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +8 −0 Original line number Diff line number Diff line Loading @@ -268,6 +268,14 @@ public class BiometricScheduler { return; } if (mCurrentOperation.isAcquisitionOperation()) { AcquisitionClient client = (AcquisitionClient) mCurrentOperation.getClientMonitor(); if (client.isAlreadyCancelled()) { mCurrentOperation.cancel(mHandler, mInternalCallback); return; } } if (mGestureAvailabilityDispatcher != null && mCurrentOperation.isAcquisitionOperation()) { mGestureAvailabilityDispatcher.markSensorActive( mCurrentOperation.getSensorId(), true /* active */); Loading
services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java +55 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.biometrics.sensors; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_ERROR_CANCELED; import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_SUCCESS; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; Loading Loading @@ -405,6 +407,59 @@ public class BiometricSchedulerTest { testCancelsEnrollWhenRequestId(10L, 20, false /* started */); } @Test public void testCancelAuthenticationClientWithoutStarting() { final Supplier<Object> lazyDaemon = () -> mock(Object.class); final TestHalClientMonitor client1 = new TestHalClientMonitor(mContext, mToken, lazyDaemon); final ClientMonitorCallbackConverter callback = mock(ClientMonitorCallbackConverter.class); final TestAuthenticationClient client2 = new TestAuthenticationClient(mContext, lazyDaemon, mToken, callback, mBiometricContext); //Schedule authentication client to the pending queue mScheduler.scheduleClientMonitor(client1); mScheduler.scheduleClientMonitor(client2); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isEqualTo(client1); client2.cancel(); waitForIdle(); assertThat(client2.isAlreadyCancelled()).isTrue(); client1.getCallback().onClientFinished(client1, false); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isNull(); } @Test public void testCancelAuthenticationClientWithoutStarting_whenAppCrashes() { final Supplier<Object> lazyDaemon = () -> mock(Object.class); final TestHalClientMonitor client1 = new TestHalClientMonitor(mContext, mToken, lazyDaemon); final ClientMonitorCallbackConverter callback = mock(ClientMonitorCallbackConverter.class); final TestAuthenticationClient client2 = new TestAuthenticationClient(mContext, lazyDaemon, mToken, callback, mBiometricContext); //Schedule authentication client to the pending queue mScheduler.scheduleClientMonitor(client1); mScheduler.scheduleClientMonitor(client2); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isEqualTo(client1); //App crashes client2.binderDied(); waitForIdle(); assertThat(client2.isAlreadyCancelled()).isTrue(); client1.getCallback().onClientFinished(client1, false); waitForIdle(); assertThat(mScheduler.getCurrentClient()).isNull(); } private void testCancelsEnrollWhenRequestId(@Nullable Long requestId, long cancelRequestId, boolean started) { final Supplier<Object> lazyDaemon = () -> mock(Object.class); Loading