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

Commit 627e12ca authored by Diya Bera's avatar Diya Bera
Browse files

Don't show biometric prompt if owner is not in foreground

Bug: 282739203
Test: Open Capital One, swipe up, biometric prompt should not flicker when app not in focus
Change-Id: Ie0a0d23b604259bb7f06d062ef6fb1e7171c5c50
parent a8d81ff3
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 */,