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

Commit c3d223c7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Properly set permission flags in review mode for modern apps"

parents 233a20e2 33d9d03c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -464,12 +464,14 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
                                mUserHandle);
                    }
                } else {
                    if (!permission.isUserSet()) {
                    if (!permission.isUserSet() || permission.isUserFixed()) {
                        permission.setUserSet(true);
                        permission.setUserFixed(false);
                        // Take a note that the user already chose once.
                        mPackageManager.updatePermissionFlags(permission.getName(),
                                mPackageInfo.packageName,
                                PackageManager.FLAG_PERMISSION_USER_SET,
                                PackageManager.FLAG_PERMISSION_USER_SET
                                        | PackageManager.FLAG_PERMISSION_USER_FIXED,
                                PackageManager.FLAG_PERMISSION_USER_SET,
                                mUserHandle);
                    }
+66 −5
Original line number Diff line number Diff line
@@ -37,13 +37,17 @@ import android.provider.Settings;
import android.util.Log;
import android.view.MenuItem;
import android.widget.Switch;

import com.android.packageinstaller.R;
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;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public final class AllAppPermissionsFragment extends SettingsWithHeader {

@@ -54,6 +58,8 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
    private static final String EXTRA_FILTER_GROUP =
            "com.android.packageinstaller.extra.FILTER_GROUP";

    private List<AppPermissionGroup> mGroups;

    public static AllAppPermissionsFragment newInstance(String packageName) {
        return newInstance(packageName, null);
    }
@@ -229,7 +235,8 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
        // We allow individual permission control for some permissions if review enabled
        final boolean mutable = Utils.isPermissionIndividuallyControlled(getContext(), perm.name);
        if (mutable) {
            pref = new MyMultiTargetSwitchPreference(getContext(), packageInfo, perm.name);
            pref = new MyMultiTargetSwitchPreference(getContext(), perm.name,
                    getPermissionGroup(packageInfo, perm.name));
        } else {
            pref = new Preference(getContext());
        }
@@ -257,13 +264,35 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
        return pref;
    }

    private static final class MyMultiTargetSwitchPreference extends MultiTargetSwitchPreference {
        public MyMultiTargetSwitchPreference(Context context, PackageInfo packageInfo,
    private AppPermissionGroup getPermissionGroup(PackageInfo packageInfo,
            String permission) {
        AppPermissionGroup appPermissionGroup = null;
        if (mGroups != null) {
            final int groupCount = mGroups.size();
            for (int i = 0; i < groupCount; i++) {
                AppPermissionGroup currentPermissionGroup = mGroups.get(i);
                if (currentPermissionGroup.hasPermission(permission)) {
                    appPermissionGroup = currentPermissionGroup;
                    break;
                }
            }
        }
        if (appPermissionGroup == null) {
            appPermissionGroup = AppPermissionGroup.create(
                    getContext(), packageInfo, permission);
            if (mGroups == null) {
                mGroups = new ArrayList<>();
            }
            mGroups.add(appPermissionGroup);
        }
        return appPermissionGroup;
    }

    private static final class MyMultiTargetSwitchPreference extends MultiTargetSwitchPreference {
        MyMultiTargetSwitchPreference(Context context, String permission,
                AppPermissionGroup appPermissionGroup) {
            super(context);

            AppPermissionGroup appPermissionGroup = AppPermissionGroup.create(
                    getContext(), packageInfo, permission);
            setChecked(appPermissionGroup.areRuntimePermissionsGranted(
                    new String[] {permission}));

@@ -272,9 +301,41 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
                if (switchView.isChecked()) {
                    appPermissionGroup.grantRuntimePermissions(false,
                            new String[]{permission});
                    // We are granting a permission from a group but since this is an
                    // individual permission control other permissions in the group may
                    // be revoked, hence we need to mark them user fixed to prevent the
                    // app from requesting a non-granted permission and it being granted
                    // because another permission in the group is granted. This applies
                    // only to apps that support runtime permissions.
                    if (appPermissionGroup.doesSupportRuntimePermissions()) {
                        String[] revokedPermissionsToFix = null;
                        final int permissionCount = appPermissionGroup.getPermissions().size();
                        for (int i = 0; i < permissionCount; i++) {
                            Permission current = appPermissionGroup.getPermissions().get(i);
                            if (!current.isGranted() && !current.isUserFixed()) {
                                revokedPermissionsToFix = ArrayUtils.appendString(
                                        revokedPermissionsToFix, current.getName());
                            }
                        }
                        if (revokedPermissionsToFix != null) {
                            // If some permissions were not granted then they should be fixed.
                            appPermissionGroup.revokeRuntimePermissions(true,
                                    revokedPermissionsToFix);
                        } else {
                            // If all permissions are granted then they should not be fixed.
                            appPermissionGroup.grantRuntimePermissions(false);
                        }
                    }
                } else {
                    appPermissionGroup.revokeRuntimePermissions(true,
                            new String[]{permission});
                    // If we just revoked the last permission we need to clear
                    // the user fixed state as now the app should be able to
                    // request them at runtime if supported.
                    if (appPermissionGroup.doesSupportRuntimePermissions()
                            && !appPermissionGroup.areRuntimePermissionsGranted()) {
                        appPermissionGroup.revokeRuntimePermissions(false);
                    }
                }
            });
        }
+0 −1
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v14.preference.SwitchPreference;