Loading src/com/android/packageinstaller/permission/utils/Utils.java +1 −1 Original line number Diff line number Diff line Loading @@ -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<>(); Loading src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java +70 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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()); } Loading Loading @@ -248,8 +314,10 @@ public class RoleControllerServiceImpl extends RoleControllerService { } } if (callback != null) { callback.onSuccess(); } } @WorkerThread private void addRoleHolder(@NonNull String roleName, @NonNull String packageName, Loading Loading
src/com/android/packageinstaller/permission/utils/Utils.java +1 −1 Original line number Diff line number Diff line Loading @@ -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<>(); Loading
src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java +70 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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()); } Loading Loading @@ -248,8 +314,10 @@ public class RoleControllerServiceImpl extends RoleControllerService { } } if (callback != null) { callback.onSuccess(); } } @WorkerThread private void addRoleHolder(@NonNull String roleName, @NonNull String packageName, Loading