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

Commit 584e2a4c authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Cache start callback for watchdog in case the HAL operation does not complete...

Cache start callback for watchdog in case the HAL operation does not complete its expected lifecycle.

Bug: 218592144
Test: atest BiometricSchedulerOperationTest
Test: manual (with BP test app)
Change-Id: I4d45a415fc92384dcc3c4bdd1bdd5dacfe86f08d
parent d20c9f62
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -84,6 +84,8 @@ public class BiometricSchedulerOperation {
    private final BaseClientMonitor mClientMonitor;
    @Nullable
    private final ClientMonitorCallback mClientCallback;
    @Nullable
    private ClientMonitorCallback mOnStartCallback;
    @OperationState
    private int mState;
    @VisibleForTesting
@@ -108,7 +110,8 @@ public class BiometricSchedulerOperation {
        mCancelWatchdog = () -> {
            if (!isFinished()) {
                Slog.e(TAG, "[Watchdog Triggered]: " + this);
                getWrappedCallback().onClientFinished(mClientMonitor, false /* success */);
                getWrappedCallback(mOnStartCallback)
                        .onClientFinished(mClientMonitor, false /* success */);
            }
        };
    }
@@ -174,6 +177,7 @@ public class BiometricSchedulerOperation {
    }

    private boolean doStart(@NonNull ClientMonitorCallback callback) {
        mOnStartCallback = callback;
        final ClientMonitorCallback cb = getWrappedCallback(callback);

        if (mState == STATE_WAITING_IN_QUEUE_CANCELING) {
+10 −3
Original line number Diff line number Diff line
@@ -40,12 +40,14 @@ import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

@Presubmit
@RunWith(AndroidTestingRunner.class)
@@ -62,6 +64,9 @@ public class BiometricSchedulerOperationTest {
        }
    }

    @Rule
    public final MockitoRule mockito = MockitoJUnit.rule();

    @Mock
    private InterruptableMonitor<FakeHal> mClientMonitor;
    @Mock
@@ -76,7 +81,6 @@ public class BiometricSchedulerOperationTest {

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mHandler = new Handler(TestableLooper.get(this).getLooper());
        mOperation = new BiometricSchedulerOperation(mClientMonitor, mClientCallback);
    }
@@ -311,10 +315,12 @@ public class BiometricSchedulerOperationTest {
    private void cancelWatchdog(boolean start) {
        when(mClientMonitor.getFreshDaemon()).thenReturn(mHal);

        mOperation.start(mock(ClientMonitorCallback.class));
        final ClientMonitorCallback opStartCallback = mock(ClientMonitorCallback.class);
        mOperation.start(opStartCallback);
        if (start) {
            verify(mClientMonitor).start(mStartCallback.capture());
            mStartCallback.getValue().onClientStarted(mClientMonitor);
            verify(opStartCallback).onClientStarted(eq(mClientMonitor));
        }
        mOperation.cancel(mHandler, mock(ClientMonitorCallback.class));

@@ -325,6 +331,7 @@ public class BiometricSchedulerOperationTest {

        assertThat(mOperation.isFinished()).isTrue();
        assertThat(mOperation.isCanceling()).isFalse();
        verify(opStartCallback).onClientFinished(eq(mClientMonitor), eq(false));
        verify(mClientMonitor).destroy();
    }
}