diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java index 8a72a6d215ba6..bdbb0a40d7973 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java @@ -232,6 +232,7 @@ public abstract class AuthenticationClient extends ClientMonitor { public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier, boolean authenticated, ArrayList token) { if (authenticated) { + mAlreadyDone = true; if (mRequireConfirmation) { // Store the token so it can be sent to keystore after the user presses confirm mEscrow = new TokenEscrow(identifier, token); diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 6a2219366c8af..71bf560854528 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -408,7 +408,8 @@ public abstract class BiometricServiceBase extends SystemService mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); - if (!topPackage.contentEquals(currentClient)) { + if (!topPackage.contentEquals(currentClient) + && !mCurrentClient.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + currentClient); mCurrentClient.stop(false /* initiatedByClient */); diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index d1daad583fff1..22b7418b53b7b 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -63,6 +63,7 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { protected final Metrics mMetrics; protected boolean mAlreadyCancelled; + protected boolean mAlreadyDone; /** * @param context context of BiometricService @@ -136,6 +137,11 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { public abstract boolean onEnumerationResult( BiometricAuthenticator.Identifier identifier, int remaining); + + public boolean isAlreadyDone() { + return mAlreadyDone; + } + /** * Called when we get notification from the biometric's HAL that an image has been acquired. * Common to authenticate and enroll.