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

Commit 95d073df authored by Hai Zhang's avatar Hai Zhang
Browse files

Add RoleControllerManager for role controller service.

This allows us to expose both system-only and app available APIs for
role in RoleControllerService.

Bug: 127691087
Test: manual
Change-Id: Id2b48c8626c93cab0465295d5775b373ea77a83f
parent dee9bc28
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -223,10 +223,9 @@
            </intent-filter>
        </service>

        <service android:name="com.android.packageinstaller.role.service.RoleControllerServiceImpl"
                 android:permission="android.permission.BIND_ROLE_CONTROLLER_SERVICE">
        <service android:name="com.android.packageinstaller.role.service.RoleControllerServiceImpl">
            <intent-filter android:priority="1">
                <action android:name="android.rolecontrollerservice.RoleControllerService"/>
                <action android:name="android.app.role.RoleControllerService"/>
            </intent-filter>
        </service>

+20 −11
Original line number Diff line number Diff line
@@ -17,18 +17,19 @@
package com.android.packageinstaller.role.service;

import android.app.AppOpsManager;
import android.app.role.RoleControllerService;
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.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import android.os.UserHandle;
import android.rolecontrollerservice.RoleControllerService;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -85,6 +86,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {

    @Override
    public void onGrantDefaultRoles(@NonNull RoleManagerCallback callback) {
        enforceCallerSystemUid("onGrantDefaultRoles");
        if (callback == null) {
            Log.e(LOG_TAG, "callback cannot be null");
            return;
@@ -95,6 +97,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
    @Override
    public void onAddRoleHolder(@NonNull String roleName, @NonNull String packageName, int flags,
            @NonNull RoleManagerCallback callback) {
        enforceCallerSystemUid("onAddRoleHolder");
        if (callback == null) {
            Log.e(LOG_TAG, "callback cannot be null");
            return;
@@ -119,6 +122,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
    @Override
    public void onRemoveRoleHolder(@NonNull String roleName, @NonNull String packageName, int flags,
            @NonNull RoleManagerCallback callback) {
        enforceCallerSystemUid("onRemoveRoleHolder");
        if (callback == null) {
            Log.e(LOG_TAG, "callback cannot be null");
            return;
@@ -143,6 +147,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
    @Override
    public void onClearRoleHolders(@NonNull String roleName, int flags,
            @NonNull RoleManagerCallback callback) {
        enforceCallerSystemUid("onClearRoleHolders");
        if (callback == null) {
            Log.e(LOG_TAG, "callback cannot be null");
            return;
@@ -160,25 +165,29 @@ public class RoleControllerServiceImpl extends RoleControllerService {
    }

    @Override
    public void onSmsKillSwitchToggled(boolean smsRestrictionEnabled) {
    public void onSmsKillSwitchToggled(boolean enabled) {
        enforceCallerSystemUid("onSmsKillSwitchToggled");
        mWorkerHandler.post(() -> {
            PackageManager pm = getPackageManager();
            ArrayMap<String, Role> roles = Roles.get(this);
            PackageManager packageManager = getPackageManager();
            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));
                onSmsKillSwitchToggled(enabled, pkg, Utils.getPlatformPermissionsOfGroup(
                        packageManager, android.Manifest.permission_group.SMS));
                onSmsKillSwitchToggled(enabled, pkg, Utils.getPlatformPermissionsOfGroup(
                        packageManager, android.Manifest.permission_group.CALL_LOG));
            }

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

    private void enforceCallerSystemUid(@NonNull String methodName) {
        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
            throw new SecurityException("Only the system process call " + methodName + "()");
        }
    }

    void onSmsKillSwitchToggled(boolean smsRestrictionEnabled, PackageInfo pkg,
            List<PermissionInfo> permissions) {
        PackageManager pm = getPackageManager();