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

Commit 0573d628 authored by Philip P. Moltmann's avatar Philip P. Moltmann
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
parent 36f401de
Loading
Loading
Loading
Loading
+42 −2
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import androidx.annotation.NonNull;
import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.Utils;
import com.android.packageinstaller.permission.utils.Utils;


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


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


    private RuntimePermissionsUpgradeController() {
    private RuntimePermissionsUpgradeController() {
        /* do nothing - hide constructor */
        /* do nothing - hide constructor */
@@ -280,16 +281,55 @@ class RuntimePermissionsUpgradeController {
            currentVersion = 7;
            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.
        // XXX: Add new upgrade steps above this point.


        return currentVersion;
        return currentVersion;
    }
    }


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

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