diff --git a/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java index c22db78041909..f015a80d338d4 100644 --- a/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java +++ b/services/core/java/com/android/server/biometrics/sensors/UserAwareBiometricScheduler.java @@ -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 - .getStopUserClient(currentUserId); - Slog.d(getTag(), "[Stopping User] current: " + currentUserId - + ", next: " + nextUserId + ". " + stopClient); - stopClient.start(mClientFinishedCallback); + if (mStopUserClient != null) { + Slog.d(getTag(), "[Waiting for StopUser] " + mStopUserClient); + } else { + mStopUserClient = mUserSwitchCallback + .getStopUserClient(currentUserId); + Slog.d(getTag(), "[Stopping User] current: " + currentUserId + + ", 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; + } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java index 4baf952063742..768f464517b97 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java @@ -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); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index 40ddfe91fbd07..cd12d02ceef29 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -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); } }