Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0da0eaff authored by Joshua Mccloskey's avatar Joshua Mccloskey
Browse files

Destroy() client after onClientFinished.

Destroy() must be called from BaseClientMonitor in order for it to
properly unlink to death from the binder token.

For ex.

1. AuthenticationClient created.
2. AuthenticationClient linksToDeath on binder token.
3. client dies(settings or another application), long after the
onClientFinished() method has been called.
4. AuthenticationClient.onBinderDied() is invoked.
5. Cancel() being invoked on a stale cancellation signal.

Test: Verified that the destroy() signal is being sent after fp/face
authentication clients.
Test: atest FrameworksServicesTests
Bug: 193883067

Change-Id: I780e8c3a42359df3c57b469a40c25a3113ee6fd7
parent edb6d7f8
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -206,7 +206,6 @@ public abstract class BaseClientMonitor extends LoggableMonitor
            }
            mToken = null;
        }
        mListener = null;
    }

    @Override
+1 −0
Original line number Diff line number Diff line
@@ -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
+22 −0
Original line number Diff line number Diff line
@@ -348,6 +348,17 @@ public class BiometricSchedulerTest {
        verify((Interruptable) interruptableMonitor, never()).cancel();
    }

    @Test
    public void testClientDestroyed_afterFinish() {
        final HalClientMonitor.LazyDaemon<Object> 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));
    }
@@ -427,6 +438,7 @@ public class BiometricSchedulerTest {
    private static class TestClientMonitor extends HalClientMonitor<Object> {
        private boolean mUnableToStart;
        private boolean mStarted;
        private boolean mDestroyed;

        public TestClientMonitor(@NonNull Context context, @NonNull IBinder token,
                @NonNull LazyDaemon<Object> lazyDaemon) {
@@ -465,6 +477,11 @@ public class BiometricSchedulerTest {

        }

        @Override
        public void destroy() {
            mDestroyed = true;
        }

        public boolean wasUnableToStart() {
            return mUnableToStart;
        }
@@ -472,6 +489,11 @@ public class BiometricSchedulerTest {
        public boolean hasStarted() {
            return mStarted;
        }

        public boolean wasDestroyed() {
            return mDestroyed;
        }

    }

    private static void waitForIdle() {