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

Commit 1a633927 authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by Harrison Lingren
Browse files

[DO NOT MERGE] Grant all access_media_location permission

Test: Manual testing:
         All combinations of
           - App targetSdk = 28 and 29 (and 22 for extra credit)
           - App having the <uses-permission> tag for
             ACCESS_MEDIA_LOCATION or not
           - Upgrade from P->Q-QPR and from vanilla Q->Q-QPR
         Further upgrade of targetSdk from 28->29 while on Q-QPR
         ==> All permission behavior should make sense. Sometimes there
             are weird, but expected behaviors. Hence we need to
             collect the results and then look at the unexpected ones.
             See SplitPermissionTest for some tests I added for the
             location-background permission which was split from
             the fine/coarse-location permissions
Bug: 140961754
Change-Id: I11f0b77d86d0c07b9bcd41eee337f36bacf0dabd
(cherry picked from commit 0573d628)
parent 22e3396d
Loading
Loading
Loading
Loading
+42 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import androidx.annotation.NonNull;
import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.Utils;

import java.util.ArrayList;
@@ -44,7 +45,7 @@ class RuntimePermissionsUpgradeController {
    private static final String LOG_TAG = RuntimePermissionsUpgradeController.class.getSimpleName();

    // The latest version of the runtime permissions database
    private static final int LATEST_VERSION = 7;
    private static final int LATEST_VERSION = 8;

    private RuntimePermissionsUpgradeController() {
        /* do nothing - hide constructor */
@@ -272,16 +273,55 @@ class RuntimePermissionsUpgradeController {
            currentVersion = 7;
        }

        if (currentVersion == 7) {
            Log.i(LOG_TAG, "Expanding read storage to access media location");

            for (int i = 0; i < appCount; i++) {
                final PackageInfo pkgInfo = apps.get(i);

                if (!ArrayUtils.contains(pkgInfo.requestedPermissions,
                        Manifest.permission.ACCESS_MEDIA_LOCATION)) {
                    continue;
                }

                if (context.checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, 0,
                        pkgInfo.applicationInfo.uid) != PackageManager.PERMISSION_GRANTED) {
                    continue;
                }

                final AppPermissionGroup group = AppPermissionGroup.create(context, pkgInfo,
                        Manifest.permission.ACCESS_MEDIA_LOCATION, false);
                final Permission perm = group.getPermission(
                        Manifest.permission.ACCESS_MEDIA_LOCATION);

                if (!perm.isUserSet() && !perm.isSystemFixed() && !perm.isPolicyFixed()
                        && !perm.isGrantedIncludingAppOp()) {
                    group.grantRuntimePermissions(false,
                            new String[]{Manifest.permission.ACCESS_MEDIA_LOCATION});

                    logRuntimePermissionUpgradeResult(group,
                            pkgInfo.applicationInfo.uid, pkgInfo.packageName,
                            Manifest.permission.ACCESS_MEDIA_LOCATION);
                }
            }

            currentVersion = 8;
        }

        // XXX: Add new upgrade steps above this point.

        return currentVersion;
    }

    private static void logRuntimePermissionUpgradeResult(AppPermissionGroup permissionGroup,
            int uid, String packageName) {
            int uid, String packageName, String... filterPermissions) {
        ArrayList<Permission> permissions = permissionGroup.getPermissions();
        int numPermissions = permissions.size();
        for (int i = 0; i < numPermissions; i++) {
            if (filterPermissions != null && !ArrayUtils.contains(filterPermissions, permissions)) {
                continue;
            }

            Permission permission = permissions.get(i);
            PermissionControllerStatsLog.write(RUNTIME_PERMISSIONS_UPGRADE_RESULT,
                    permission.getName(), uid, packageName);