Add flags parameter for managing role holders.

This change allows passing a flag parameter when managing role
holders, including a DONT_KILL_APP flag that can be used by the
request role dialog.

Bug: 123429697
Test: manual
Change-Id: I57b690dcdfbf6fd13940cf45d392a48adeccdfaa
This commit is contained in:
Hai Zhang
2019-02-04 16:17:38 -08:00
parent 027b668bea
commit 71d70360b2
11 changed files with 115 additions and 70 deletions

View File

@@ -1071,16 +1071,17 @@ package android.app.role {
public final class RoleManager {
method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void addRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean addRoleHolderFromController(@NonNull String, @NonNull String);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void clearRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void clearRoleHoldersAsUser(@NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @NonNull @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public java.util.List<java.lang.String> getHeldRolesFromController(@NonNull String);
method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHolders(@NonNull String);
method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.OBSERVE_ROLE_HOLDERS) public void removeOnRoleHoldersChangedListenerAsUser(@NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void removeRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String);
method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>);
field public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; // 0x1
field public static final String ROLE_ASSISTANT = "android.app.role.ASSISTANT";
}
@@ -6029,11 +6030,11 @@ package android.rolecontrollerservice {
public abstract class RoleControllerService extends android.app.Service {
ctor public RoleControllerService();
method public abstract void onAddRoleHolder(@NonNull String, @NonNull String, @NonNull android.app.role.RoleManagerCallback);
method public abstract void onAddRoleHolder(@NonNull String, @NonNull String, int, @NonNull android.app.role.RoleManagerCallback);
method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent);
method public abstract void onClearRoleHolders(@NonNull String, @NonNull android.app.role.RoleManagerCallback);
method public abstract void onClearRoleHolders(@NonNull String, int, @NonNull android.app.role.RoleManagerCallback);
method public abstract void onGrantDefaultRoles(@NonNull android.app.role.RoleManagerCallback);
method public abstract void onRemoveRoleHolder(@NonNull String, @NonNull String, @NonNull android.app.role.RoleManagerCallback);
method public abstract void onRemoveRoleHolder(@NonNull String, @NonNull String, int, @NonNull android.app.role.RoleManagerCallback);
method public abstract void onSmsKillSwitchToggled(boolean);
field public static final String SERVICE_INTERFACE = "android.rolecontrollerservice.RoleControllerService";
}

View File

@@ -429,11 +429,11 @@ package android.app.prediction {
package android.app.role {
public final class RoleManager {
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void addRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void clearRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void clearRoleHoldersAsUser(@NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHolders(@NonNull String);
method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void removeRoleHolderAsUser(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
field public static final String ROLE_ASSISTANT = "android.app.role.ASSISTANT";
}

View File

@@ -32,13 +32,14 @@ interface IRoleManager {
List<String> getRoleHoldersAsUser(in String roleName, int userId);
void addRoleHolderAsUser(in String roleName, in String packageName, int userId,
void addRoleHolderAsUser(in String roleName, in String packageName, int flags, int userId,
in IRoleManagerCallback callback);
void removeRoleHolderAsUser(in String roleName, in String packageName, int userId,
void removeRoleHolderAsUser(in String roleName, in String packageName, int flags, int userId,
in IRoleManagerCallback callback);
void clearRoleHoldersAsUser(in String roleName, int userId, in IRoleManagerCallback callback);
void clearRoleHoldersAsUser(in String roleName, int flags, int userId,
in IRoleManagerCallback callback);
void addOnRoleHoldersChangedListenerAsUser(IOnRoleHoldersChangedListener listener, int userId);

View File

@@ -18,6 +18,7 @@ package android.app.role;
import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -180,6 +181,22 @@ public final class RoleManager {
@TestApi
public static final String ROLE_ASSISTANT = "android.app.role.ASSISTANT";
/**
* @hide
*/
@IntDef(flag = true, value = { MANAGE_HOLDERS_FLAG_DONT_KILL_APP })
public @interface ManageHoldersFlags {}
/**
* Flag parameter for {@link #addRoleHolderAsUser}, {@link #removeRoleHolderAsUser} and
* {@link #clearRoleHoldersAsUser} to indicate that apps should not be killed when changing
* their role holder status.
*
* @hide
*/
@SystemApi
public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1;
/**
* The action used to request user approval of a role for an application.
*
@@ -305,9 +322,9 @@ public final class RoleManager {
*
* @return a list of package names of the role holders, or an empty list if none.
*
* @see #addRoleHolderAsUser(String, String, UserHandle, Executor, RoleManagerCallback)
* @see #removeRoleHolderAsUser(String, String, UserHandle, Executor, RoleManagerCallback)
* @see #clearRoleHoldersAsUser(String, UserHandle, Executor, RoleManagerCallback)
* @see #addRoleHolderAsUser(String, String, int, UserHandle, Executor, RoleManagerCallback)
* @see #removeRoleHolderAsUser(String, String, int, UserHandle, Executor, RoleManagerCallback)
* @see #clearRoleHoldersAsUser(String, int, UserHandle, Executor, RoleManagerCallback)
*
* @hide
*/
@@ -335,13 +352,14 @@ public final class RoleManager {
*
* @param roleName the name of the role to add the role holder for
* @param packageName the package name of the application to add to the role holders
* @param flags optional behavior flags
* @param user the user to add the role holder for
* @param executor the {@code Executor} to run the callback on.
* @param callback the callback for whether this call is successful
*
* @see #getRoleHoldersAsUser(String, UserHandle)
* @see #removeRoleHolderAsUser(String, String, UserHandle, Executor, RoleManagerCallback)
* @see #clearRoleHoldersAsUser(String, UserHandle, Executor, RoleManagerCallback)
* @see #removeRoleHolderAsUser(String, String, int, UserHandle, Executor, RoleManagerCallback)
* @see #clearRoleHoldersAsUser(String, int, UserHandle, Executor, RoleManagerCallback)
*
* @hide
*/
@@ -349,15 +367,15 @@ public final class RoleManager {
@SystemApi
@TestApi
public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName,
@NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor,
@NonNull RoleManagerCallback callback) {
@ManageHoldersFlags int flags, @NonNull UserHandle user,
@CallbackExecutor @NonNull Executor executor, @NonNull RoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
Preconditions.checkNotNull(user, "user cannot be null");
Preconditions.checkNotNull(executor, "executor cannot be null");
Preconditions.checkNotNull(callback, "callback cannot be null");
try {
mService.addRoleHolderAsUser(roleName, packageName, user.getIdentifier(),
mService.addRoleHolderAsUser(roleName, packageName, flags, user.getIdentifier(),
new RoleManagerCallbackDelegate(executor, callback));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -373,13 +391,14 @@ public final class RoleManager {
*
* @param roleName the name of the role to remove the role holder for
* @param packageName the package name of the application to remove from the role holders
* @param flags optional behavior flags
* @param user the user to remove the role holder for
* @param executor the {@code Executor} to run the callback on.
* @param callback the callback for whether this call is successful
*
* @see #getRoleHoldersAsUser(String, UserHandle)
* @see #addRoleHolderAsUser(String, String, UserHandle, Executor, RoleManagerCallback)
* @see #clearRoleHoldersAsUser(String, UserHandle, Executor, RoleManagerCallback)
* @see #addRoleHolderAsUser(String, String, int, UserHandle, Executor, RoleManagerCallback)
* @see #clearRoleHoldersAsUser(String, int, UserHandle, Executor, RoleManagerCallback)
*
* @hide
*/
@@ -387,15 +406,15 @@ public final class RoleManager {
@SystemApi
@TestApi
public void removeRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName,
@NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor,
@NonNull RoleManagerCallback callback) {
@ManageHoldersFlags int flags, @NonNull UserHandle user,
@CallbackExecutor @NonNull Executor executor, @NonNull RoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
Preconditions.checkNotNull(user, "user cannot be null");
Preconditions.checkNotNull(executor, "executor cannot be null");
Preconditions.checkNotNull(callback, "callback cannot be null");
try {
mService.removeRoleHolderAsUser(roleName, packageName, user.getIdentifier(),
mService.removeRoleHolderAsUser(roleName, packageName, flags, user.getIdentifier(),
new RoleManagerCallbackDelegate(executor, callback));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -410,27 +429,29 @@ public final class RoleManager {
* {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
*
* @param roleName the name of the role to remove role holders for
* @param flags optional behavior flags
* @param user the user to remove role holders for
* @param executor the {@code Executor} to run the callback on.
* @param callback the callback for whether this call is successful
*
* @see #getRoleHoldersAsUser(String, UserHandle)
* @see #addRoleHolderAsUser(String, String, UserHandle, Executor, RoleManagerCallback)
* @see #removeRoleHolderAsUser(String, String, UserHandle, Executor, RoleManagerCallback)
* @see #addRoleHolderAsUser(String, String, int, UserHandle, Executor, RoleManagerCallback)
* @see #removeRoleHolderAsUser(String, String, int, UserHandle, Executor, RoleManagerCallback)
*
* @hide
*/
@RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS)
@SystemApi
@TestApi
public void clearRoleHoldersAsUser(@NonNull String roleName, @NonNull UserHandle user,
@CallbackExecutor @NonNull Executor executor, @NonNull RoleManagerCallback callback) {
public void clearRoleHoldersAsUser(@NonNull String roleName, @ManageHoldersFlags int flags,
@NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor,
@NonNull RoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkNotNull(user, "user cannot be null");
Preconditions.checkNotNull(executor, "executor cannot be null");
Preconditions.checkNotNull(callback, "callback cannot be null");
try {
mService.clearRoleHoldersAsUser(roleName, user.getIdentifier(),
mService.clearRoleHoldersAsUser(roleName, flags, user.getIdentifier(),
new RoleManagerCallbackDelegate(executor, callback));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();

View File

@@ -23,13 +23,13 @@ import android.app.role.IRoleManagerCallback;
*/
oneway interface IRoleControllerService {
void onAddRoleHolder(in String roleName, in String packageName,
void onAddRoleHolder(in String roleName, in String packageName, int flags,
in IRoleManagerCallback callback);
void onRemoveRoleHolder(in String roleName, in String packageName,
void onRemoveRoleHolder(in String roleName, in String packageName, int flags,
in IRoleManagerCallback callback);
void onClearRoleHolders(in String roleName, in IRoleManagerCallback callback);
void onClearRoleHolders(in String roleName, int flags, in IRoleManagerCallback callback);
void onGrantDefaultRoles(in IRoleManagerCallback callback);

View File

@@ -61,32 +61,33 @@ public abstract class RoleControllerService extends Service {
return new IRoleControllerService.Stub() {
@Override
public void onAddRoleHolder(String roleName, String packageName,
public void onAddRoleHolder(String roleName, String packageName, int flags,
IRoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkStringNotEmpty(packageName,
"packageName cannot be null or empty");
Preconditions.checkNotNull(callback, "callback cannot be null");
RoleControllerService.this.onAddRoleHolder(roleName, packageName,
RoleControllerService.this.onAddRoleHolder(roleName, packageName, flags,
new RoleManagerCallbackDelegate(callback));
}
@Override
public void onRemoveRoleHolder(String roleName, String packageName,
public void onRemoveRoleHolder(String roleName, String packageName, int flags,
IRoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkStringNotEmpty(packageName,
"packageName cannot be null or empty");
Preconditions.checkNotNull(callback, "callback cannot be null");
RoleControllerService.this.onRemoveRoleHolder(roleName, packageName,
RoleControllerService.this.onRemoveRoleHolder(roleName, packageName, flags,
new RoleManagerCallbackDelegate(callback));
}
@Override
public void onClearRoleHolders(String roleName, IRoleManagerCallback callback) {
public void onClearRoleHolders(String roleName, int flags,
IRoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkNotNull(callback, "callback cannot be null");
RoleControllerService.this.onClearRoleHolders(roleName,
RoleControllerService.this.onClearRoleHolders(roleName, flags,
new RoleManagerCallbackDelegate(callback));
}
@@ -113,37 +114,41 @@ public abstract class RoleControllerService extends Service {
*
* @param roleName the name of the role to add the role holder for
* @param packageName the package name of the application to add to the role holders
* @param flags optional behavior flags
* @param callback the callback for whether this call is successful
*
* @see RoleManager#addRoleHolderAsUser(String, String, UserHandle, Executor,
* @see RoleManager#addRoleHolderAsUser(String, String, int, UserHandle, Executor,
* RoleManagerCallback)
*/
public abstract void onAddRoleHolder(@NonNull String roleName, @NonNull String packageName,
@NonNull RoleManagerCallback callback);
@RoleManager.ManageHoldersFlags int flags, @NonNull RoleManagerCallback callback);
/**
* Remove a specific application from the holders of a role.
*
* @param roleName the name of the role to remove the role holder for
* @param packageName the package name of the application to remove from the role holders
* @param flags optional behavior flags
* @param callback the callback for whether this call is successful
*
* @see RoleManager#removeRoleHolderAsUser(String, String, UserHandle, Executor,
* @see RoleManager#removeRoleHolderAsUser(String, String, int, UserHandle, Executor,
* RoleManagerCallback)
*/
public abstract void onRemoveRoleHolder(@NonNull String roleName, @NonNull String packageName,
@NonNull RoleManagerCallback callback);
@RoleManager.ManageHoldersFlags int flags, @NonNull RoleManagerCallback callback);
/**
* Remove all holders of a role.
*
* @param roleName the name of the role to remove role holders for
* @param flags optional behavior flags
* @param callback the callback for whether this call is successful
*
* @see RoleManager#clearRoleHoldersAsUser(String, UserHandle, Executor, RoleManagerCallback)
* @see RoleManager#clearRoleHoldersAsUser(String, int, UserHandle, Executor,
* RoleManagerCallback)
*/
public abstract void onClearRoleHolders(@NonNull String roleName,
@NonNull RoleManagerCallback callback);
@RoleManager.ManageHoldersFlags int flags, @NonNull RoleManagerCallback callback);
/**
* Cleanup appop/permissions state in response to sms kill switch toggle

View File

@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.annotation.WorkerThread;
import android.app.role.IRoleManagerCallback;
import android.app.role.RoleManager;
import android.app.role.RoleManagerCallback;
import android.content.ComponentName;
import android.content.Context;
@@ -61,34 +62,35 @@ public class RemoteRoleControllerService {
* Add a specific application to the holders of a role. If the role is exclusive, the previous
* holder will be replaced.
*
* @see RoleControllerService#onAddRoleHolder(String, String, RoleManagerCallback)
* @see RoleControllerService#onAddRoleHolder(String, String, int, RoleManagerCallback)
*/
public void onAddRoleHolder(@NonNull String roleName, @NonNull String packageName,
@NonNull IRoleManagerCallback callback) {
@RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) {
mConnection.enqueueCall(new Connection.Call((service, callbackDelegate) ->
service.onAddRoleHolder(roleName, packageName, callbackDelegate), callback));
service.onAddRoleHolder(roleName, packageName, flags, callbackDelegate), callback));
}
/**
* Remove a specific application from the holders of a role.
*
* @see RoleControllerService#onRemoveRoleHolder(String, String, RoleManagerCallback)
* @see RoleControllerService#onRemoveRoleHolder(String, String, int, RoleManagerCallback)
*/
public void onRemoveRoleHolder(@NonNull String roleName, @NonNull String packageName,
@NonNull IRoleManagerCallback callback) {
@RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) {
mConnection.enqueueCall(new Connection.Call((service, callbackDelegate) ->
service.onRemoveRoleHolder(roleName, packageName, callbackDelegate), callback));
service.onRemoveRoleHolder(roleName, packageName, flags, callbackDelegate),
callback));
}
/**
* Remove all holders of a role.
*
* @see RoleControllerService#onClearRoleHolders(String, RoleManagerCallback)
* @see RoleControllerService#onClearRoleHolders(String, int, RoleManagerCallback)
*/
public void onClearRoleHolders(@NonNull String roleName,
@NonNull IRoleManagerCallback callback) {
@RoleManager.ManageHoldersFlags int flags, @NonNull IRoleManagerCallback callback) {
mConnection.enqueueCall(new Connection.Call((service, callbackDelegate) ->
service.onClearRoleHolders(roleName, callbackDelegate), callback));
service.onClearRoleHolders(roleName, flags, callbackDelegate), callback));
}
/**

View File

@@ -450,7 +450,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
@Override
public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName,
@UserIdInt int userId, @NonNull IRoleManagerCallback callback) {
@RoleManager.ManageHoldersFlags int flags, @UserIdInt int userId,
@NonNull IRoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
Preconditions.checkNotNull(callback, "callback cannot be null");
@@ -462,12 +463,14 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
"addRoleHolderAsUser");
getOrCreateControllerService(userId).onAddRoleHolder(roleName, packageName, callback);
getOrCreateControllerService(userId).onAddRoleHolder(roleName, packageName, flags,
callback);
}
@Override
public void removeRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName,
@UserIdInt int userId, @NonNull IRoleManagerCallback callback) {
@RoleManager.ManageHoldersFlags int flags, @UserIdInt int userId,
@NonNull IRoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
Preconditions.checkNotNull(callback, "callback cannot be null");
@@ -479,12 +482,13 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
"removeRoleHolderAsUser");
getOrCreateControllerService(userId).onRemoveRoleHolder(roleName, packageName,
getOrCreateControllerService(userId).onRemoveRoleHolder(roleName, packageName, flags,
callback);
}
@Override
public void clearRoleHoldersAsUser(@NonNull String roleName, @UserIdInt int userId,
public void clearRoleHoldersAsUser(@NonNull String roleName,
@RoleManager.ManageHoldersFlags int flags, @UserIdInt int userId,
@NonNull IRoleManagerCallback callback) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkNotNull(callback, "callback cannot be null");
@@ -496,7 +500,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
"clearRoleHoldersAsUser");
getOrCreateControllerService(userId).onClearRoleHolders(roleName, callback);
getOrCreateControllerService(userId).onClearRoleHolders(roleName, flags, callback);
}
@Override
@@ -718,9 +722,9 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
};
if (packageName != null) {
getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_BROWSER,
packageName, callback);
packageName, 0, callback);
} else {
getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER,
getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER, 0,
callback);
}
try {

View File

@@ -98,13 +98,22 @@ class RoleManagerShellCommand extends ShellCommand {
return userId;
}
private int getFlagsMaybe() {
String flags = getNextArg();
if (flags == null) {
return 0;
}
return Integer.parseInt(flags);
}
private int runAddRoleHolder() throws RemoteException {
int userId = getUserIdMaybe();
String roleName = getNextArgRequired();
String packageName = getNextArgRequired();
int flags = getFlagsMaybe();
Callback callback = new Callback();
mRoleManager.addRoleHolderAsUser(roleName, packageName, userId, callback);
mRoleManager.addRoleHolderAsUser(roleName, packageName, flags, userId, callback);
return callback.waitForResult();
}
@@ -112,18 +121,20 @@ class RoleManagerShellCommand extends ShellCommand {
int userId = getUserIdMaybe();
String roleName = getNextArgRequired();
String packageName = getNextArgRequired();
int flags = getFlagsMaybe();
Callback callback = new Callback();
mRoleManager.removeRoleHolderAsUser(roleName, packageName, userId, callback);
mRoleManager.removeRoleHolderAsUser(roleName, packageName, flags, userId, callback);
return callback.waitForResult();
}
private int runClearRoleHolders() throws RemoteException {
int userId = getUserIdMaybe();
String roleName = getNextArgRequired();
int flags = getFlagsMaybe();
Callback callback = new Callback();
mRoleManager.clearRoleHoldersAsUser(roleName, userId, callback);
mRoleManager.clearRoleHoldersAsUser(roleName, flags, userId, callback);
return callback.waitForResult();
}
@@ -134,9 +145,9 @@ class RoleManagerShellCommand extends ShellCommand {
pw.println(" help");
pw.println(" Print this help text.");
pw.println();
pw.println(" add-role-holder [--user USER_ID] ROLE PACKAGE");
pw.println(" remove-role-holder [--user USER_ID] ROLE PACKAGE");
pw.println(" clear-role-holders [--user USER_ID] ROLE");
pw.println(" add-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]");
pw.println(" remove-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]");
pw.println(" clear-role-holders [--user USER_ID] ROLE [FLAGS]");
pw.println();
}
}

View File

@@ -78,7 +78,7 @@ public class DefaultDialerManager {
try {
RoleManagerCallback.Future cb = new RoleManagerCallback.Future();
context.getSystemService(RoleManager.class).addRoleHolderAsUser(
RoleManager.ROLE_DIALER, packageName, UserHandle.of(user),
RoleManager.ROLE_DIALER, packageName, 0, UserHandle.of(user),
AsyncTask.THREAD_POOL_EXECUTOR, cb);
cb.get(5, TimeUnit.SECONDS);
return true;

View File

@@ -636,7 +636,7 @@ public final class SmsApplication {
// Update the setting.
RoleManagerCallback.Future res = new RoleManagerCallback.Future();
context.getSystemService(RoleManager.class).addRoleHolderAsUser(
RoleManager.ROLE_SMS, applicationData.mPackageName, UserHandle.of(userId),
RoleManager.ROLE_SMS, applicationData.mPackageName, 0, UserHandle.of(userId),
AsyncTask.THREAD_POOL_EXECUTOR, res);
try {
res.get(5, TimeUnit.SECONDS);