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

Commit b7776685 authored by Hai Zhang's avatar Hai Zhang
Browse files

Add RoleManager into the system.

A role is a unique name within the system associated with certain
privileges. There can be multiple applications qualifying for a role,
but only a subset of them can become role holders. To qualify for a
role, an application must meet certain requirements, including
defining certain components in its manifest. Then the application will
need user consent to become the role holder.

Upon becoming a role holder, the application may be granted certain
privileges that are role specific. When an application loses its role,
these privileges will also be revoked.

Bug: 110557011
Test: build
Change-Id: Icd453a3b032857a8fd157048de8b9609f04e28b8
parent 2653e624
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -103,6 +103,8 @@ java_defaults {
        "core/java/android/app/backup/IRestoreObserver.aidl",
        "core/java/android/app/backup/IRestoreSession.aidl",
        "core/java/android/app/backup/ISelectBackupTransportCallback.aidl",
        "core/java/android/app/role/IRoleManager.aidl",
        "core/java/android/app/role/IRoleManagerCallback.aidl",
        "core/java/android/app/slice/ISliceManager.aidl",
        "core/java/android/app/slice/ISliceListener.aidl",
        "core/java/android/app/timedetector/ITimeDetectorService.aidl",
@@ -259,6 +261,7 @@ java_defaults {
        "core/java/android/os/storage/IStorageEventListener.aidl",
        "core/java/android/os/storage/IStorageShutdownObserver.aidl",
        "core/java/android/os/storage/IObbActionListener.aidl",
        "core/java/android/rolecontrollerservice/IRoleControllerService.aidl",
        ":keystore_aidl",
        "core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl",
        "core/java/android/service/autofill/IAutoFillService.aidl",
+13 −0
Original line number Diff line number Diff line
@@ -7268,6 +7268,18 @@ package android.app.job {
}
package android.app.role {
  public final class RoleManager {
    method public android.content.Intent createRequestRoleIntent(java.lang.String);
    method public boolean isRoleAvailable(java.lang.String);
    method public boolean isRoleHeld(java.lang.String);
    field public static final java.lang.String ROLE_DIALER = "android.app.role.DIALER";
    field public static final java.lang.String ROLE_SMS = "android.app.role.SMS";
  }
}
package android.app.slice {
  public final class Slice implements android.os.Parcelable {
@@ -9606,6 +9618,7 @@ package android.content {
    field public static final java.lang.String PRINT_SERVICE = "print";
    field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
    field public static final java.lang.String RESTRICTIONS_SERVICE = "restrictions";
    field public static final java.lang.String ROLE_SERVICE = "role";
    field public static final java.lang.String SEARCH_SERVICE = "search";
    field public static final java.lang.String SENSOR_SERVICE = "sensor";
    field public static final java.lang.String SHORTCUT_SERVICE = "shortcut";
+34 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ package android {
    field public static final java.lang.String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
    field public static final java.lang.String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
    field public static final java.lang.String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
    field public static final java.lang.String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
    field public static final java.lang.String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
    field public static final java.lang.String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
    field public static final java.lang.String MANAGE_USB = "android.permission.MANAGE_USB";
@@ -293,6 +294,8 @@ package android.app {
  public class AppOpsManager {
    method public static java.lang.String[] getOpStrs();
    method public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, java.lang.String, int[]);
    method public static java.lang.String opToPermission(java.lang.String);
    method public void resetUidMode(java.lang.String, int, boolean);
    method public void setMode(java.lang.String, int, java.lang.String, int);
    method public void setUidMode(java.lang.String, int, int);
    field public static final java.lang.String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
@@ -802,6 +805,23 @@ package android.app.job {

}

package android.app.role {

  public final class RoleManager {
    method public void addRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
    method public void clearRoleHoldersAsUser(java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
    method public java.util.Set<java.lang.String> getRoleHoldersAsUser(java.lang.String, android.os.UserHandle);
    method public void removeRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
    field public static final java.lang.String EXTRA_REQUEST_ROLE_NAME = "android.app.role.extra.REQUEST_ROLE_NAME";
  }

  public abstract interface RoleManagerCallback {
    method public abstract void onFailure();
    method public abstract void onSuccess();
  }

}

package android.app.usage {

  public final class CacheQuotaHint implements android.os.Parcelable {
@@ -1148,6 +1168,7 @@ package android.content.pm {
    method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
    method public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
    method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
    method public void replacePreferredActivity(android.content.IntentFilter, int, java.util.List<android.content.ComponentName>, android.content.ComponentName);
    method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
    method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
@@ -4474,6 +4495,19 @@ package android.provider {

}

package android.rolecontrollerservice {

  public abstract class RoleControllerService extends android.app.Service {
    ctor public RoleControllerService();
    method public abstract void onAddRoleHolder(java.lang.String, java.lang.String, android.app.role.RoleManagerCallback);
    method public final android.os.IBinder onBind(android.content.Intent);
    method public abstract void onClearRoleHolders(java.lang.String, android.app.role.RoleManagerCallback);
    method public abstract void onRemoveRoleHolder(java.lang.String, java.lang.String, android.app.role.RoleManagerCallback);
    field public static final java.lang.String SERVICE_INTERFACE = "android.rolecontrollerservice.RoleControllerService";
  }

}

package android.security.keystore {

  public abstract class AttestationUtils {
+34 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app;

import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -1521,6 +1522,19 @@ public class AppOpsManager {
        return sOpPerms[op];
    }

    /**
     * Retrieve the permission associated with an operation, or null if there is not one.
     *
     * @param op The operation name.
     *
     * @hide
     */
    @Nullable
    @SystemApi
    public static String opToPermission(@NonNull String op) {
        return opToPermission(strOpToOp(op));
    }

    /**
     * Retrieve the user restriction associated with an operation, or null if there is not one.
     * @hide
@@ -1967,6 +1981,26 @@ public class AppOpsManager {
        }
    }

    /**
     * Resets given app op in its default mode for app ops in the UID.
     * This applies to all apps currently in the UID or installed in this UID in the future.
     *
     * @param appOp The app op.
     * @param uid The UID for which to set the app.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES)
    @SystemApi
    public void resetUidMode(String appOp, int uid, boolean force) {
        int code = strOpToOp(appOp);
        if (!(opAllowsReset(code) || force)) {
            return;
        }
        int mode = opToDefaultMode(code);
        setUidMode(code, uid, mode);
    }

    /** @hide */
    public void setUserRestriction(int code, boolean restricted, IBinder token) {
        setUserRestriction(code, restricted, token, /*exceptionPackages*/null);
+39 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.role;

import android.app.role.IRoleManagerCallback;

/**
 * @hide
 */
interface IRoleManager {

    boolean isRoleAvailable(in String roleName);

    boolean isRoleHeld(in String roleName, in String packageName);

    List<String> getRoleHoldersAsUser(in String roleName, int userId);

    void addRoleHolderAsUser(in String roleName, in String packageName, int userId,
            in IRoleManagerCallback callback);

    void removeRoleHolderAsUser(in String roleName, in String packageName, int userId,
            in IRoleManagerCallback callback);

    void clearRoleHoldersAsUser(in String roleName, int userId, in IRoleManagerCallback callback);
}
Loading