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

Commit 9154c12c authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android (Google) Code Review
Browse files

Merge "Grant only the requested permissions" into nyc-dev

parents c9cf85cb 294b6406
Loading
Loading
Loading
Loading
+41 −9
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Icon;
import android.hardware.camera2.utils.ArrayUtils;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
@@ -47,6 +46,7 @@ import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.ui.handheld.GrantPermissionsViewHandlerImpl;
import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;

import java.util.ArrayList;
@@ -147,24 +147,36 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
                switch (permissionPolicy) {
                    case DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT: {
                        if (!group.areRuntimePermissionsGranted()) {
                            group.grantRuntimePermissions(false);
                            group.grantRuntimePermissions(false, computeAffectedPermissions(
                                    callingPackageInfo, requestedPermission));
                        }
                        group.setPolicyFixed();
                    } break;

                    case DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY: {
                        if (group.areRuntimePermissionsGranted()) {
                            group.revokeRuntimePermissions(false);
                            group.revokeRuntimePermissions(false, computeAffectedPermissions(
                                    callingPackageInfo, requestedPermission));
                        }
                        group.setPolicyFixed();
                    } break;

                    default: {
                        if (!group.areRuntimePermissionsGranted()) {
                            mRequestGrantPermissionGroups.put(group.getName(),
                                    new GroupState(group));
                            GroupState state = mRequestGrantPermissionGroups.get(group.getName());
                            if (state == null) {
                                state = new GroupState(group);
                                mRequestGrantPermissionGroups.put(group.getName(), state);
                            }
                            String affectedPermission = computeAffectedPermission(
                                    callingPackageInfo, requestedPermission);
                            if (affectedPermission != null) {
                                state.affectedPermissions = ArrayUtils.appendString(
                                        state.affectedPermissions, affectedPermission);
                            }
                        } else {
                            group.grantRuntimePermissions(false);
                            group.grantRuntimePermissions(false, computeAffectedPermissions(
                                    callingPackageInfo, requestedPermission));
                            updateGrantResults(group);
                        }
                    } break;
@@ -271,10 +283,12 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
        GroupState groupState = mRequestGrantPermissionGroups.get(name);
        if (groupState.mGroup != null) {
            if (granted) {
                groupState.mGroup.grantRuntimePermissions(doNotAskAgain);
                groupState.mGroup.grantRuntimePermissions(doNotAskAgain,
                        groupState.affectedPermissions);
                groupState.mState = GroupState.STATE_ALLOWED;
            } else {
                groupState.mGroup.revokeRuntimePermissions(doNotAskAgain);
                groupState.mGroup.revokeRuntimePermissions(doNotAskAgain,
                        groupState.affectedPermissions);
                groupState.mState = GroupState.STATE_DENIED;
            }
            updateGrantResults(groupState.mGroup);
@@ -286,7 +300,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity

    private void updateGrantResults(AppPermissionGroup group) {
        for (Permission permission : group.getPermissions()) {
            final int index = ArrayUtils.getArrayIndex(
            final int index = ArrayUtils.indexOf(
                    mRequestedPermissions, permission.getName());
            if (index >= 0) {
                mGrantResults[index] = permission.isGranted() ? PackageManager.PERMISSION_GRANTED
@@ -402,6 +416,23 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
        SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups);
    }

    private static String[] computeAffectedPermissions(PackageInfo callingPackageInfo,
            String permission) {
        String affectedPermission = computeAffectedPermission(callingPackageInfo, permission);
        if (affectedPermission != null) {
            return new String[] {permission};
        }
        return null;
    }

    private static String computeAffectedPermission(PackageInfo callingPackageInfo,
            String permission) {
        if (callingPackageInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) {
            return permission;
        }
        return null;
    }

    private static final class GroupState {
        static final int STATE_UNKNOWN = 0;
        static final int STATE_ALLOWED = 1;
@@ -409,6 +440,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity

        final AppPermissionGroup mGroup;
        int mState = STATE_UNKNOWN;
        String[] affectedPermissions;

        GroupState(AppPermissionGroup group) {
            mGroup = group;
+18 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.packageinstaller.permission.utils;

import android.text.TextUtils;

import java.util.Objects;

public final class ArrayUtils {
@@ -42,4 +44,20 @@ public final class ArrayUtils {
        }
        return -1;
    }

    public static String[] appendString(String[] cur, String val) {
        if (cur == null) {
            return new String[] { val };
        }
        final int N = cur.length;
        for (int i = 0; i < N; i++) {
            if (TextUtils.equals(cur[i], val)) {
                return cur;
            }
        }
        String[] ret = new String[N + 1];
        System.arraycopy(cur, 0, ret, 0, N);
        ret[N] = val;
        return ret;
    }
}