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

Commit 3ab45a80 authored by Eugene Susla's avatar Eugene Susla Committed by Android (Google) Code Review
Browse files

Merge "Cleanup appop/permissions state on sms kill switch toggle"

parents 83f38482 dbb4ee65
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ public final class Utils {
     * @return The infos for platform permissions belonging to the group or an empty list if the
     *         group is not does not have platform runtime permissions
     */
    private static @NonNull List<PermissionInfo> getPlatformPermissionsOfGroup(
    public static @NonNull List<PermissionInfo> getPlatformPermissionsOfGroup(
            @NonNull PackageManager pm, @NonNull String group) {
        ArrayList<PermissionInfo> permInfos = new ArrayList<>();

+70 −2
Original line number Diff line number Diff line
@@ -16,9 +16,14 @@

package com.android.packageinstaller.role.service;

import android.app.AppOpsManager;
import android.app.role.RoleManager;
import android.app.role.RoleManagerCallback;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
@@ -30,9 +35,11 @@ import android.util.ArraySet;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;

import com.android.packageinstaller.permission.utils.CollectionUtils;
import com.android.packageinstaller.permission.utils.Utils;
import com.android.packageinstaller.role.model.Role;
import com.android.packageinstaller.role.model.Roles;
import com.android.packageinstaller.role.utils.PackageUtils;
@@ -52,6 +59,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
    private static final boolean DEBUG = true;

    private RoleManager mRoleManager;
    private AppOpsManager mAppOpsManager;

    private HandlerThread mWorkerThread;
    private Handler mWorkerHandler;
@@ -61,6 +69,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
        super.onCreate();

        mRoleManager = getSystemService(RoleManager.class);
        mAppOpsManager = getSystemService(AppOpsManager.class);

        mWorkerThread = new HandlerThread(RoleControllerServiceImpl.class.getSimpleName());
        mWorkerThread.start();
@@ -138,8 +147,65 @@ public class RoleControllerServiceImpl extends RoleControllerService {
        mWorkerHandler.post(() -> clearRoleHolders(roleName, callback));
    }

    @Override
    public void onSmsKillSwitchToggled(boolean smsRestrictionEnabled) {
        mWorkerHandler.post(() -> {
            PackageManager pm = getPackageManager();
            ArrayMap<String, Role> roles = Roles.get(this);
            List<PackageInfo> installedPackages = getPackageManager().getInstalledPackages(0);
            for (int i = 0, size = installedPackages.size(); i < size; i++) {
                PackageInfo pkg = installedPackages.get(i);
                onSmsKillSwitchToggled(smsRestrictionEnabled, pkg,
                        Utils.getPlatformPermissionsOfGroup(
                                pm, android.Manifest.permission_group.SMS));
                onSmsKillSwitchToggled(smsRestrictionEnabled, pkg,
                        Utils.getPlatformPermissionsOfGroup(
                                pm, android.Manifest.permission_group.CALL_LOG));
            }

            grantDefaultRoles(null /* callback */);
        });
    }

    void onSmsKillSwitchToggled(boolean smsRestrictionEnabled, PackageInfo pkg,
            List<PermissionInfo> permissions) {
        PackageManager pm = getPackageManager();
        int uid = pkg.applicationInfo.uid; //TODO multiuser support?

        for (int i = 0, permissionsSize = permissions.size(); i < permissionsSize; i++) {
            PermissionInfo permission = permissions.get(i);
            int permFlags =
                    pm.getPermissionFlags(permission.name, pkg.packageName, Process.myUserHandle());

            if ((permFlags
                    & (PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT
                            | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED)) != 0) {
                continue;
            }

            if ((permFlags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
                pm.updatePermissionFlags(permission.name, pkg.packageName,
                        PackageManager.FLAG_PERMISSION_POLICY_FIXED, 0, Process.myUserHandle());
            }

            String appOp = AppOpsManager.permissionToOp(permission.name);
            if (appOp != null) {
                mAppOpsManager.setUidMode(appOp, uid,
                        smsRestrictionEnabled
                                ? AppOpsManager.MODE_DEFAULT
                                : AppOpsManager.MODE_ALLOWED);
            }

            if (!smsRestrictionEnabled
                    && pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
                pm.revokeRuntimePermission(
                        pkg.packageName, permission.name, Process.myUserHandle());
            }
        }
    }

    @WorkerThread
    private void grantDefaultRoles(@NonNull RoleManagerCallback callback) {
    private void grantDefaultRoles(@Nullable RoleManagerCallback callback) {
        if (DEBUG) {
            Log.i(LOG_TAG, "Granting default roles, user: " + UserHandle.myUserId());
        }
@@ -248,8 +314,10 @@ public class RoleControllerServiceImpl extends RoleControllerService {
            }
        }

        if (callback != null) {
            callback.onSuccess();
        }
    }

    @WorkerThread
    private void addRoleHolder(@NonNull String roleName, @NonNull String packageName,