summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hao Dong <spdonghao@google.com> 2025-01-08 21:34:50 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-08 21:34:50 -0800
commit6b22d7cfb9aaa32a1934ff52f33559a370c4cb87 (patch)
tree5afb360c97aa1c4a20bf2234c7755543d73bdc1a
parent923ad094c29f3641474213ae316bb6009f984f88 (diff)
parent231bda45217f271753891c6256a08a8ea17e5993 (diff)
Merge "Fix settings activity showing background bp when createConfirmDeviceCredentialIntent() API is used." into tm-dev
-rw-r--r--core/java/android/hardware/biometrics/BiometricPrompt.java14
-rw-r--r--core/java/android/hardware/biometrics/PromptInfo.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java79
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java6
5 files changed, 101 insertions, 23 deletions
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index d235f124de32..1345507568e1 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -434,6 +434,20 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
}
/**
+ * Set the class name of ConfirmDeviceCredentialActivity.
+ *
+ * @return This builder.
+ * @hide
+ */
+ @NonNull
+ @RequiresPermission(anyOf = {TEST_BIOMETRIC, USE_BIOMETRIC_INTERNAL})
+ public Builder setClassNameIfItIsConfirmDeviceCredentialActivity() {
+ mPromptInfo.setClassNameIfItIsConfirmDeviceCredentialActivity(
+ mContext.getClass().getName());
+ return this;
+ }
+
+ /**
* Creates a {@link BiometricPrompt}.
*
* @return An instance of {@link BiometricPrompt}.
diff --git a/core/java/android/hardware/biometrics/PromptInfo.java b/core/java/android/hardware/biometrics/PromptInfo.java
index a6b8096e6d4f..9aaab2f98626 100644
--- a/core/java/android/hardware/biometrics/PromptInfo.java
+++ b/core/java/android/hardware/biometrics/PromptInfo.java
@@ -47,6 +47,7 @@ public class PromptInfo implements Parcelable {
private boolean mAllowBackgroundAuthentication;
private boolean mIgnoreEnrollmentState;
private boolean mIsForLegacyFingerprintManager = false;
+ private String mClassNameIfItIsConfirmDeviceCredentialActivity = null;
public PromptInfo() {
@@ -70,6 +71,7 @@ public class PromptInfo implements Parcelable {
mAllowBackgroundAuthentication = in.readBoolean();
mIgnoreEnrollmentState = in.readBoolean();
mIsForLegacyFingerprintManager = in.readBoolean();
+ mClassNameIfItIsConfirmDeviceCredentialActivity = in.readString();
}
public static final Creator<PromptInfo> CREATOR = new Creator<PromptInfo>() {
@@ -108,6 +110,7 @@ public class PromptInfo implements Parcelable {
dest.writeBoolean(mAllowBackgroundAuthentication);
dest.writeBoolean(mIgnoreEnrollmentState);
dest.writeBoolean(mIsForLegacyFingerprintManager);
+ dest.writeString(mClassNameIfItIsConfirmDeviceCredentialActivity);
}
public boolean containsTestConfigurations() {
@@ -119,6 +122,8 @@ public class PromptInfo implements Parcelable {
return true;
} else if (mAllowBackgroundAuthentication) {
return true;
+ } else if (mClassNameIfItIsConfirmDeviceCredentialActivity != null) {
+ return true;
}
return false;
}
@@ -213,6 +218,13 @@ public class PromptInfo implements Parcelable {
mAllowedSensorIds.add(sensorId);
}
+ /**
+ * Set the class name of ConfirmDeviceCredentialActivity.
+ */
+ void setClassNameIfItIsConfirmDeviceCredentialActivity(String className) {
+ mClassNameIfItIsConfirmDeviceCredentialActivity = className;
+ }
+
// Getters
public CharSequence getTitle() {
@@ -290,4 +302,12 @@ public class PromptInfo implements Parcelable {
public boolean isForLegacyFingerprintManager() {
return mIsForLegacyFingerprintManager;
}
+
+ /**
+ * Get the class name of ConfirmDeviceCredentialActivity. Returns null if the direct caller is
+ * not ConfirmDeviceCredentialActivity.
+ */
+ public String getClassNameIfItIsConfirmDeviceCredentialActivity() {
+ return mClassNameIfItIsConfirmDeviceCredentialActivity;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 6da2f50aac27..3f9b0e80ecb6 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -620,6 +620,11 @@ public class AuthContainerView extends LinearLayout
}
@Override
+ public String getClassNameIfItIsConfirmDeviceCredentialActivity() {
+ return mConfig.mPromptInfo.getClassNameIfItIsConfirmDeviceCredentialActivity();
+ }
+
+ @Override
public void animateToCredentialUI() {
mBiometricView.startTransitionToCredentialUI();
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 17396469c10a..6b4a855d719b 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -25,6 +25,7 @@ import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.TaskStackListener;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -204,29 +205,22 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
mExecution.assertIsMainThread();
if (mCurrentDialog != null) {
try {
- final String clientPackage = mCurrentDialog.getOpPackageName();
- Log.w(TAG, "Task stack changed, current client: " + clientPackage);
- final List<ActivityManager.RunningTaskInfo> runningTasks =
- mActivityTaskManager.getTasks(1);
- if (!runningTasks.isEmpty()) {
- final String topPackage = runningTasks.get(0).topActivity.getPackageName();
- if (!topPackage.contentEquals(clientPackage)
- && !Utils.isSystem(mContext, clientPackage)) {
- Log.e(TAG, "Evicting client due to: " + topPackage);
- mCurrentDialog.dismissWithoutCallback(true /* animate */);
- mCurrentDialog = null;
- mOrientationListener.disable();
-
- for (Callback cb : mCallbacks) {
- cb.onBiometricPromptDismissed();
- }
-
- if (mReceiver != null) {
- mReceiver.onDialogDismissed(
- BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
- null /* credentialAttestation */);
- mReceiver = null;
- }
+ if (isOwnerInBackground()) {
+ Log.w(TAG, "Evicting client due to top activity is not : "
+ + mCurrentDialog.getOpPackageName());
+ mCurrentDialog.dismissWithoutCallback(true /* animate */);
+ mCurrentDialog = null;
+ mOrientationListener.disable();
+
+ for (Callback cb : mCallbacks) {
+ cb.onBiometricPromptDismissed();
+ }
+
+ if (mReceiver != null) {
+ mReceiver.onDialogDismissed(
+ BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
+ null /* credentialAttestation */);
+ mReceiver = null;
}
}
} catch (RemoteException e) {
@@ -235,6 +229,45 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba
}
}
+ private boolean isOwnerInBackground() {
+ if (mCurrentDialog != null) {
+ final String clientPackage = mCurrentDialog.getOpPackageName();
+
+ final List<ActivityManager.RunningTaskInfo> runningTasks =
+ mActivityTaskManager.getTasks(1);
+ if (runningTasks == null || runningTasks.isEmpty()) {
+ Log.w(TAG, "No running tasks reported");
+ return false;
+ }
+
+ final boolean isSystemApp = Utils.isSystem(mContext, clientPackage);
+
+ final ComponentName topActivity = runningTasks.get(0).topActivity;
+ final String topPackage = topActivity.getPackageName();
+ final boolean topPackageEqualsToClient =
+ topPackage == null
+ || topActivity.getPackageName().contentEquals(clientPackage);
+
+ // b/339532378: If it's ConfirmDeviceCredentialActivity, we need to check further on
+ // class name.
+ final String clientClassNameForCDCA =
+ mCurrentDialog.getClassNameIfItIsConfirmDeviceCredentialActivity();
+ final boolean isClientCDCA = clientClassNameForCDCA != null;
+ final String topClassName = topActivity.getClassName();
+ final boolean isCDCAWithWrongTopClass =
+ isClientCDCA
+ && !(topClassName == null
+ || topClassName.contentEquals(clientClassNameForCDCA));
+
+ final boolean isInBackground =
+ !(isSystemApp || topPackageEqualsToClient) || isCDCAWithWrongTopClass;
+
+ Log.w(TAG, "isInBackground " + isInBackground);
+ return isInBackground;
+ }
+ return false;
+ }
+
/**
* Whether all fingerprint authentictors have been registered.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java
index 4ff19f6adc11..cab71b4b6306 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java
@@ -154,6 +154,12 @@ public interface AuthDialog {
long getRequestId();
/**
+ * Get the class name of ConfirmDeviceCredentialActivity. Returns null if the direct caller is
+ * not ConfirmDeviceCredentialActivity.
+ */
+ String getClassNameIfItIsConfirmDeviceCredentialActivity();
+
+ /**
* Animate to credential UI. Typically called after biometric is locked out.
*/
void animateToCredentialUI();