Add RoleControllerManager.isApplicationVisibleForRole().

Settings doesn't actually need to know whether an application
qualifies for a role, but only whether the default app setting should
be visible for an application. Qualification and visibility differs in
cases such as FallbackHome inside Settings which is a qualifying home
activity but should never be shown in default apps UI.

Fixes: 138636320
Test: manual
Change-Id: I216195c64a7b106e2769b11c1a998741a77fdce2
This commit is contained in:
Hai Zhang
2019-08-26 14:18:55 -07:00
parent ce81d32525
commit aedc3ab3cf
4 changed files with 52 additions and 1 deletions

View File

@@ -1135,7 +1135,8 @@ package android.app.role {
method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent);
method @WorkerThread public abstract boolean onClearRoleHolders(@NonNull String, int);
method @WorkerThread public abstract boolean onGrantDefaultRoles();
method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String);
method @Deprecated public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String);
method public boolean onIsApplicationVisibleForRole(@NonNull String, @NonNull String);
method public abstract boolean onIsRoleVisible(@NonNull String);
method @WorkerThread public abstract boolean onRemoveRoleHolder(@NonNull String, @NonNull String, int);
field public static final String SERVICE_INTERFACE = "android.app.role.RoleControllerService";

View File

@@ -36,5 +36,8 @@ oneway interface IRoleController {
void isApplicationQualifiedForRole(in String roleName, in String packageName,
in RemoteCallback callback);
void isApplicationVisibleForRole(in String roleName, in String packageName,
in RemoteCallback callback);
void isRoleVisible(in String roleName, in RemoteCallback callback);
}

View File

@@ -183,6 +183,9 @@ public class RoleControllerManager {
/**
* @see RoleControllerService#onIsApplicationQualifiedForRole(String, String)
*
* @deprecated Use {@link #isApplicationVisibleForRole(String, String, Executor, Consumer)}
* instead.
*/
@RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS)
public void isApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName,
@@ -196,6 +199,21 @@ public class RoleControllerManager {
propagateCallback(operation, "isApplicationQualifiedForRole", executor, callback);
}
/**
* @see RoleControllerService#onIsApplicationVisibleForRole(String, String)
*/
@RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS)
public void isApplicationVisibleForRole(@NonNull String roleName, @NonNull String packageName,
@NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
AndroidFuture<Bundle> operation = mRemoteService.postAsync(service -> {
AndroidFuture<Bundle> future = new AndroidFuture<>();
service.isApplicationVisibleForRole(roleName, packageName,
new RemoteCallback(future::complete));
return future;
});
propagateCallback(operation, "isApplicationVisibleForRole", executor, callback);
}
/**
* @see RoleControllerService#onIsRoleVisible(String)
*/

View File

@@ -152,6 +152,20 @@ public abstract class RoleControllerService extends Service {
callback.sendResult(qualified ? Bundle.EMPTY : null);
}
@Override
public void isApplicationVisibleForRole(String roleName, String packageName,
RemoteCallback callback) {
enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null);
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");
boolean visible = onIsApplicationVisibleForRole(roleName, packageName);
callback.sendResult(visible ? Bundle.EMPTY : null);
}
@Override
public void isRoleVisible(String roleName, RemoteCallback callback) {
enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null);
@@ -256,10 +270,25 @@ public abstract class RoleControllerService extends Service {
* @param packageName package name of the application to check for
*
* @return whether the application is qualified for the role
*
* @deprecated Implement {@link #onIsApplicationVisibleForRole(String, String)} instead.
*/
public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName,
@NonNull String packageName);
/**
* Check whether an application is visible for a role.
*
* @param roleName name of the role to check for
* @param packageName package name of the application to check for
*
* @return whether the application is visible for the role
*/
public boolean onIsApplicationVisibleForRole(@NonNull String roleName,
@NonNull String packageName) {
return onIsApplicationQualifiedForRole(roleName, packageName);
}
/**
* Check whether a role should be visible to user.
*