diff --git a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java index e5e1385fa605b..3eb6f4ae48a2b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java @@ -206,7 +206,6 @@ public abstract class BaseClientMonitor extends LoggableMonitor } mToken = null; } - mListener = null; } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java index b20316e4c6df0..feb9e2a5b03f3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java @@ -295,6 +295,7 @@ public class BiometricScheduler { @Override public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) { mHandler.post(() -> { + clientMonitor.destroy(); if (mCurrentOperation == null) { Slog.e(getTag(), "[Finishing] " + clientMonitor + " but current operation is null, success: " + success diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java index f4d14995f7c72..a41f79e8f6821 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java @@ -348,6 +348,17 @@ public class BiometricSchedulerTest { verify((Interruptable) interruptableMonitor, never()).cancel(); } + @Test + public void testClientDestroyed_afterFinish() { + final HalClientMonitor.LazyDaemon nonNullDaemon = () -> mock(Object.class); + final TestClientMonitor client = + new TestClientMonitor(mContext, mToken, nonNullDaemon); + mScheduler.scheduleClientMonitor(client); + client.mCallback.onClientFinished(client, true /* success */); + waitForIdle(); + assertTrue(client.wasDestroyed()); + } + private BiometricSchedulerProto getDump(boolean clearSchedulerBuffer) throws Exception { return BiometricSchedulerProto.parseFrom(mScheduler.dumpProtoState(clearSchedulerBuffer)); } @@ -437,6 +448,7 @@ public class BiometricSchedulerTest { private static class TestClientMonitor extends HalClientMonitor { private boolean mUnableToStart; private boolean mStarted; + private boolean mDestroyed; public TestClientMonitor(@NonNull Context context, @NonNull IBinder token, @NonNull LazyDaemon lazyDaemon) { @@ -475,6 +487,11 @@ public class BiometricSchedulerTest { } + @Override + public void destroy() { + mDestroyed = true; + } + public boolean wasUnableToStart() { return mUnableToStart; } @@ -482,6 +499,11 @@ public class BiometricSchedulerTest { public boolean hasStarted() { return mStarted; } + + public boolean wasDestroyed() { + return mDestroyed; + } + } private static void waitForIdle() {