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

Commit 5309214d authored by Kevin Chyn's avatar Kevin Chyn
Browse files

6/n: Update UserAwareBiometricScheduler

1) Add and expose "onUserStopped", and invoke it from scheduler owners.
   Originally we try to send the callback via
   scheduler.getCurrentClient().onUserStopped(), but since the user-aware
   scheduler does not keep this work in the queue (can revisit this
   later), it needs to receive the callback some other way.
2) Does not schedule another "stopUserClient" if one is already there.
   This avoid unnecessary stopUserClients from being added when one
   is already running but another operation is added to the queue.

Test: atest com.android.server.biometrics
Test: atest CtsBiometricsTestCases
Test: Enroll, add new user, switch user, enroll
Bug: 181984005
Change-Id: I86922b83fa993c3ceae81acc2c31999d268014c9
parent 8a5c4b51
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {
    @NonNull private final UserSwitchCallback mUserSwitchCallback;
    @NonNull @VisibleForTesting final ClientFinishedCallback mClientFinishedCallback;

    @Nullable private StopUserClient<?> mStopUserClient;

    @VisibleForTesting
    class ClientFinishedCallback implements BaseClientMonitor.Callback {
        @Override
@@ -113,11 +115,26 @@ public class UserAwareBiometricScheduler extends BiometricScheduler {
            Slog.d(getTag(), "[Starting User] " + startClient);
            startClient.start(mClientFinishedCallback);
        } else {
            final BaseClientMonitor stopClient = mUserSwitchCallback
            if (mStopUserClient != null) {
                Slog.d(getTag(), "[Waiting for StopUser] " + mStopUserClient);
            } else {
                mStopUserClient = mUserSwitchCallback
                        .getStopUserClient(currentUserId);
                Slog.d(getTag(), "[Stopping User] current: " + currentUserId
                    + ", next: " + nextUserId + ". " + stopClient);
            stopClient.start(mClientFinishedCallback);
                        + ", next: " + nextUserId + ". " + mStopUserClient);
                mStopUserClient.start(mClientFinishedCallback);
            }
        }
    }

    public void onUserStopped() {
        if (mStopUserClient == null) {
            Slog.e(getTag(), "Unexpected onUserStopped");
            return;
        }

        Slog.d(getTag(), "[OnUserStopped]: " + mStopUserClient);
        mStopUserClient.onUserStopped();
        mStopUserClient = null;
    }
}
+3 −13
Original line number Diff line number Diff line
@@ -119,14 +119,14 @@ public class Sensor {
        @NonNull
        private final String mTag;
        @NonNull
        private final BiometricScheduler mScheduler;
        private final UserAwareBiometricScheduler mScheduler;
        private final int mSensorId;
        private final int mUserId;
        @NonNull
        private final Callback mCallback;

        HalSessionCallback(@NonNull Context context, @NonNull Handler handler, @NonNull String tag,
                @NonNull BiometricScheduler scheduler, int sensorId, int userId,
                @NonNull UserAwareBiometricScheduler scheduler, int sensorId, int userId,
                @NonNull Callback callback) {
            mContext = context;
            mHandler = handler;
@@ -433,17 +433,7 @@ public class Sensor {

        @Override
        public void onSessionClosed() {
            mHandler.post(() -> {
                final BaseClientMonitor client = mScheduler.getCurrentClient();
                if (!(client instanceof FaceStopUserClient)) {
                    Slog.e(mTag, "onSessionClosed for wrong consumer: "
                            + Utils.getClientName(client));
                    return;
                }

                final FaceStopUserClient stopUserClient = (FaceStopUserClient) client;
                stopUserClient.onUserStopped();
            });
            mHandler.post(mScheduler::onUserStopped);
        }
    }

+3 −13
Original line number Diff line number Diff line
@@ -118,13 +118,13 @@ class Sensor {
        @NonNull private final Context mContext;
        @NonNull private final Handler mHandler;
        @NonNull private final String mTag;
        @NonNull private final BiometricScheduler mScheduler;
        @NonNull private final UserAwareBiometricScheduler mScheduler;
        private final int mSensorId;
        private final int mUserId;
        @NonNull private final Callback mCallback;

        HalSessionCallback(@NonNull Context context, @NonNull Handler handler, @NonNull String tag,
                @NonNull BiometricScheduler scheduler, int sensorId, int userId,
                @NonNull UserAwareBiometricScheduler scheduler, int sensorId, int userId,
                @NonNull Callback callback) {
            mContext = context;
            mHandler = handler;
@@ -412,17 +412,7 @@ class Sensor {

        @Override
        public void onSessionClosed() {
            mHandler.post(() -> {
                final BaseClientMonitor client = mScheduler.getCurrentClient();
                if (!(client instanceof FingerprintStopUserClient)) {
                    Slog.e(mTag, "onSessionClosed for wrong consumer: "
                            + Utils.getClientName(client));
                    return;
                }

                final FingerprintStopUserClient stopUserClient = (FingerprintStopUserClient) client;
                stopUserClient.onUserStopped();
            });
            mHandler.post(mScheduler::onUserStopped);
        }
    }