diff options
| author | 2025-01-08 21:34:50 -0800 | |
|---|---|---|
| committer | 2025-01-08 21:34:50 -0800 | |
| commit | 6b22d7cfb9aaa32a1934ff52f33559a370c4cb87 (patch) | |
| tree | 5afb360c97aa1c4a20bf2234c7755543d73bdc1a | |
| parent | 923ad094c29f3641474213ae316bb6009f984f88 (diff) | |
| parent | 231bda45217f271753891c6256a08a8ea17e5993 (diff) | |
Merge "Fix settings activity showing background bp when createConfirmDeviceCredentialIntent() API is used." into tm-dev
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(); |