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

Commit 4990af74 authored by Jing Ji's avatar Jing Ji
Browse files

Allow the FGS with soft denied permission to start

..if it's allowed to have while-in-use capability.

Permissions like mic/camera/location would have a soft-denied mode,
where it basically means "MODE_IGNORED", we shouldn't throw exceptions
in this case but silently fail. But if they have the while-in-use
capability, it should be safe to allow them to start the FGS.

Bug: 280936347
Test: atest CtsAppFgsTestCases
Change-Id: I2e690f9dd9574f9ce0d3e7cb702eb53dced99a37
parent 188d9963
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app;

import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_FOREGROUND;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA;
@@ -1078,9 +1079,9 @@ public abstract class ForegroundServiceTypePolicy {
        int checkPermission(@NonNull Context context, @NonNull String name, int callerUid,
                int callerPid, String packageName, boolean allowWhileInUse) {
            // Simple case, check if it's already granted.
            @PackageManager.PermissionResult int result;
            if ((result = PermissionChecker.checkPermissionForPreflight(context, name,
                    callerPid, callerUid, packageName)) == PERMISSION_GRANTED) {
            @PermissionCheckerManager.PermissionResult int result;
            if ((result = PermissionChecker.checkPermissionForPreflight(context, name, callerPid,
                    callerUid, packageName)) == PermissionCheckerManager.PERMISSION_GRANTED) {
                return PERMISSION_GRANTED;
            }
            if (allowWhileInUse && result == PermissionCheckerManager.PERMISSION_SOFT_DENIED) {
@@ -1093,6 +1094,13 @@ public abstract class ForegroundServiceTypePolicy {
                    if (currentMode == MODE_FOREGROUND) {
                        // It's in foreground only mode and we're allowing while-in-use.
                        return PERMISSION_GRANTED;
                    } else if (currentMode == MODE_IGNORED) {
                       // If it's soft denied with the mode "ignore", semantically it's a silent
                       // failure and no exception should be thrown, we might not want to allow
                       // the FGS. However, since the user has agreed with this permission
                       // (otherwise it's going to be a hard denial), and we're allowing
                       // while-in-use here, it's safe to allow the FGS run here.
                        return PERMISSION_GRANTED;
                    }
                }
            }