Merge "Don't show biometric prompt if owner is not in foreground" into udc-qpr-dev

This commit is contained in:
Diya Bera
2023-06-01 23:38:51 +00:00
committed by Android (Google) Code Review
2 changed files with 51 additions and 25 deletions

View File

@@ -201,7 +201,9 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
final TaskStackListener mTaskStackListener = new TaskStackListener() {
@Override
public void onTaskStackChanged() {
mHandler.post(AuthController.this::cancelIfOwnerIsNotInForeground);
if (!isOwnerInForeground()) {
mHandler.post(AuthController.this::cancelIfOwnerIsNotInForeground);
}
}
};
@@ -239,33 +241,37 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
}
}
private boolean isOwnerInForeground() {
final String clientPackage = mCurrentDialog.getOpPackageName();
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.w(TAG, "Evicting client due to: " + topPackage);
return false;
}
}
return true;
}
private void cancelIfOwnerIsNotInForeground() {
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;
mCurrentDialog.dismissWithoutCallback(true /* animate */);
mCurrentDialog = null;
for (Callback cb : mCallbacks) {
cb.onBiometricPromptDismissed();
}
for (Callback cb : mCallbacks) {
cb.onBiometricPromptDismissed();
}
if (mReceiver != null) {
mReceiver.onDialogDismissed(
BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
null /* credentialAttestation */);
mReceiver = null;
}
}
if (mReceiver != null) {
mReceiver.onDialogDismissed(
BiometricPrompt.DISMISSED_REASON_USER_CANCEL,
null /* credentialAttestation */);
mReceiver = null;
}
} catch (RemoteException e) {
Log.e(TAG, "Remote exception", e);
@@ -1253,10 +1259,11 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
cb.onBiometricPromptShown();
}
mCurrentDialog = newDialog;
mCurrentDialog.show(mWindowManager, savedState);
if (!promptInfo.isAllowBackgroundAuthentication()) {
mHandler.post(this::cancelIfOwnerIsNotInForeground);
if (!promptInfo.isAllowBackgroundAuthentication() && !isOwnerInForeground()) {
cancelIfOwnerIsNotInForeground();
} else {
mCurrentDialog.show(mWindowManager, savedState);
}
}

View File

@@ -954,6 +954,25 @@ public class AuthControllerTest extends SysuiTestCase {
eq(null) /* credentialAttestation */);
}
@Test
public void testShowDialog_whenOwnerNotInForeground() {
PromptInfo promptInfo = createTestPromptInfo();
promptInfo.setAllowBackgroundAuthentication(false);
switchTask("other_package");
mAuthController.showAuthenticationDialog(promptInfo,
mReceiver /* receiver */,
new int[]{1} /* sensorIds */,
false /* credentialAllowed */,
true /* requireConfirmation */,
0 /* userId */,
0 /* operationId */,
"testPackage",
REQUEST_ID);
assertNull(mAuthController.mCurrentDialog);
verify(mDialog1, never()).show(any(), any());
}
private void showDialog(int[] sensorIds, boolean credentialAllowed) {
mAuthController.showAuthenticationDialog(createTestPromptInfo(),
mReceiver /* receiver */,