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

Commit 37979c9d authored by Jim Miller's avatar Jim Miller
Browse files

Fix bug where foreground activity fails to cancel auth/enrollment

This fixes a bug where the currently authenticating application
can't cancel itself in onPause(). The problem is that some applications
can set FLAG_RESUME_WHILE_PAUSING (like the home screen), which changes
the life cycle of IMPORTANCE_FOREGROUND to be removed before onPause()
completes.  The result is the currently authenticating activity
can't cancel fingerprint authentication or enrollment.

The fix is to allow apps to always cancel themselves.

Fixes bug 30380234

Change-Id: If65c2028014da8d5129506d0b45cc6c1e25f7860
parent 1b72661e
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -470,10 +470,10 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe

    /**
     * @param opPackageName name of package for caller
     * @param foregroundOnly only allow this call while app is in the foreground
     * @param requireForeground only allow this call while app is in the foreground
     * @return true if caller can use fingerprint API
     */
    private boolean canUseFingerprint(String opPackageName, boolean foregroundOnly, int uid,
    private boolean canUseFingerprint(String opPackageName, boolean requireForeground, int uid,
            int pid) {
        checkPermission(USE_FINGERPRINT);
        if (isKeyguard(opPackageName)) {
@@ -488,13 +488,21 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
            Slog.w(TAG, "Rejecting " + opPackageName + " ; permission denied");
            return false;
        }
        if (foregroundOnly && !isForegroundActivity(uid, pid)) {
        if (requireForeground && !(isForegroundActivity(uid, pid) || currentClient(opPackageName))){
            Slog.w(TAG, "Rejecting " + opPackageName + " ; not in foreground");
            return false;
        }
        return true;
    }

    /**
     * @param opPackageName package of the caller
     * @return true if this is the same client currently using fingerprint
     */
    private boolean currentClient(String opPackageName) {
        return mCurrentClient != null && mCurrentClient.getOwnerString().equals(opPackageName);
    }

    /**
     * @param clientPackage
     * @return true if this is keyguard package