diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index d8e7b7db7b750..c4855c32fca0a 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -1045,10 +1045,15 @@ public abstract class BiometricServiceBase extends SystemService } } else { currentClient.stop(initiatedByClient); + + // Only post the reset runnable for non-cleanup clients. Cleanup clients should + // never be forcibly stopped since they ensure synchronization between HAL and + // framework. Thus, we should instead just start the pending client once cleanup + // finishes instead of using the reset runnable. + mHandler.removeCallbacks(mResetClientState); + mHandler.postDelayed(mResetClientState, CANCEL_TIMEOUT_LIMIT); } mPendingClient = newClient; - mHandler.removeCallbacks(mResetClientState); - mHandler.postDelayed(mResetClientState, CANCEL_TIMEOUT_LIMIT); } else if (newClient != null) { // For BiometricPrompt clients, do not start until // Service#startPreparedClient is called. BiometricService waits until all @@ -1225,6 +1230,7 @@ public abstract class BiometricServiceBase extends SystemService } else { clearEnumerateState(); if (mPendingClient != null) { + Slog.d(getTag(), "Enumerate finished, starting pending client"); startClient(mPendingClient, false /* initiatedByClient */); } }