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

Commit 92ce6e95 authored by Joe Bolinger's avatar Joe Bolinger Committed by Android (Google) Code Review
Browse files

Merge "Ensure current operation has not changed on start/stop user operations." into sc-dev

parents 0d6266ee 587ffaa9
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -62,16 +62,22 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {
        @Override
        public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, boolean success) {
            mHandler.post(() -> {
                if (mOwner == clientMonitor && mOwner == mCurrentOperation.mClientMonitor) {
                if (mOwner != clientMonitor) {
                    Slog.e(getTag(), "[Wrong client finished], actual: "
                            + clientMonitor + ", expected: " + mOwner);
                    return;
                }

                Slog.d(getTag(), "[Client finished] "
                        + clientMonitor + ", success: " + success);
                if (mCurrentOperation != null && mCurrentOperation.mClientMonitor == mOwner) {
                    mCurrentOperation = null;
                    startNextOperationIfIdle();
                } else {
                    Slog.e(getTag(), "[Client finished, but not current operation], actual: "
                            + mCurrentOperation + ", expected: " + mOwner);
                    // can usually be ignored (hal died, etc.)
                    Slog.d(getTag(), "operation is already null or different (reset?): "
                            + mCurrentOperation);
                }

                startNextOperationIfIdle();
            });
        }
    }
@@ -125,9 +131,9 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {
                    new ClientFinishedCallback(startClient);

            Slog.d(getTag(), "[Starting User] " + startClient);
            startClient.start(finishedCallback);
            mCurrentOperation = new Operation(
                    startClient, finishedCallback, Operation.STATE_STARTED);
            startClient.start(finishedCallback);
        } else {
            if (mStopUserClient != null) {
                Slog.d(getTag(), "[Waiting for StopUser] " + mStopUserClient);
@@ -139,9 +145,9 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {

                Slog.d(getTag(), "[Stopping User] current: " + currentUserId
                        + ", next: " + nextUserId + ". " + mStopUserClient);
                mStopUserClient.start(finishedCallback);
                mCurrentOperation = new Operation(
                        mStopUserClient, finishedCallback, Operation.STATE_STARTED);
                mStopUserClient.start(finishedCallback);
            }
        }
    }
+28 −2
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.biometrics.sensors;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -132,6 +134,28 @@ public class UserAwareBiometricSchedulerTest {
        }
    }

    @Test
    public void testScheduleOperation_whenNoUser_notStarted_andReset() {
        mCurrentUserId = UserHandle.USER_NULL;
        mStartOperationsFinish = false;

        final BaseClientMonitor client = mock(BaseClientMonitor.class);
        when(client.getTargetUserId()).thenReturn(5);
        mScheduler.scheduleClientMonitor(client);
        waitForIdle();

        final TestStartUserClient startUserClient =
                (TestStartUserClient) mScheduler.mCurrentOperation.mClientMonitor;
        mScheduler.reset();
        assertNull(mScheduler.mCurrentOperation);

        final BiometricScheduler.Operation fakeOperation = new BiometricScheduler.Operation(
                mock(BaseClientMonitor.class), new BaseClientMonitor.Callback() {});
        mScheduler.mCurrentOperation = fakeOperation;
        startUserClient.mCallback.onClientFinished(startUserClient, true);
        assertSame(fakeOperation, mScheduler.mCurrentOperation);
    }

    @Test
    public void testScheduleOperation_whenSameUser() {
        mCurrentUserId = 10;
@@ -173,7 +197,6 @@ public class UserAwareBiometricSchedulerTest {
    }

    private class TestUserStoppedCallback implements StopUserClient.UserStoppedCallback {

        int numInvocations;

        @Override
@@ -184,7 +207,6 @@ public class UserAwareBiometricSchedulerTest {
    }

    private class TestUserStartedCallback implements StartUserClient.UserStartedCallback<Object> {

        int numInvocations;

        @Override
@@ -221,6 +243,8 @@ public class UserAwareBiometricSchedulerTest {
    private static class TestStartUserClient extends StartUserClient<Object, Object> {
        private final boolean mShouldFinish;

        Callback mCallback;

        public TestStartUserClient(@NonNull Context context,
                @NonNull LazyDaemon<Object> lazyDaemon, @Nullable IBinder token, int userId,
                int sensorId, @NonNull UserStartedCallback<Object> callback, boolean shouldFinish) {
@@ -236,6 +260,8 @@ public class UserAwareBiometricSchedulerTest {
        @Override
        public void start(@NonNull Callback callback) {
            super.start(callback);

            mCallback = callback;
            if (mShouldFinish) {
                mUserStartedCallback.onUserStarted(getTargetUserId(), new Object());
                callback.onClientFinished(this, true /* success */);