Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e5d120f authored by Diya Bera's avatar Diya Bera Committed by Automerger Merge Worker
Browse files

Merge "Don't show biometric prompt if owner is not in foreground" into...

Merge "Don't show biometric prompt if owner is not in foreground" into udc-qpr-dev am: 68587626 am: 4539a2f1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23479933



Change-Id: I7c7e41abe435926ff6a08e1a91fcda472be8612a
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 5ec73675 4539a2f1
Loading
Loading
Loading
Loading
+33 −26
Original line number Diff line number Diff line
@@ -201,8 +201,10 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
    final TaskStackListener mTaskStackListener = new TaskStackListener() {
        @Override
        public void onTaskStackChanged() {
            if (!isOwnerInForeground()) {
                mHandler.post(AuthController.this::cancelIfOwnerIsNotInForeground);
            }
        }
    };

    @VisibleForTesting
@@ -239,19 +241,25 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
        }
    }

    private void cancelIfOwnerIsNotInForeground() {
        mExecution.assertIsMainThread();
        if (mCurrentDialog != null) {
            try {
    private boolean isOwnerInForeground() {
        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);
                Log.w(TAG, "Evicting client due to: " + topPackage);
                return false;
            }
        }
        return true;
    }

    private void cancelIfOwnerIsNotInForeground() {
        mExecution.assertIsMainThread();
        if (mCurrentDialog != null) {
            try {
                mCurrentDialog.dismissWithoutCallback(true /* animate */);
                mCurrentDialog = null;

@@ -265,8 +273,6 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
                            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);
        }
    }

+19 −0
Original line number Diff line number Diff line
@@ -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 */,