Merge "Don't show biometric prompt if owner is not in foreground" into udc-qpr-dev am: 685876265b
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23479933 Change-Id: If6b3018ece88d50b7fdf93d03f95395047b6a3b5 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
Reference in New Issue
Block a user