From aedc3ab3cf62dc05379ef855ffc42bec646fb5ec Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Mon, 26 Aug 2019 14:18:55 -0700 Subject: [PATCH] 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 --- api/system-current.txt | 3 +- .../android/app/role/IRoleController.aidl | 3 ++ .../app/role/RoleControllerManager.java | 18 ++++++++++++ .../app/role/RoleControllerService.java | 29 +++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/api/system-current.txt b/api/system-current.txt index 76d017c448228..8d71b769ae28a 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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"; diff --git a/core/java/android/app/role/IRoleController.aidl b/core/java/android/app/role/IRoleController.aidl index 19762e0841b1f..8a43d7fa90364 100644 --- a/core/java/android/app/role/IRoleController.aidl +++ b/core/java/android/app/role/IRoleController.aidl @@ -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); } diff --git a/core/java/android/app/role/RoleControllerManager.java b/core/java/android/app/role/RoleControllerManager.java index 98b11a7b1a9b8..16ddbc147d823 100644 --- a/core/java/android/app/role/RoleControllerManager.java +++ b/core/java/android/app/role/RoleControllerManager.java @@ -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 callback) { + AndroidFuture operation = mRemoteService.postAsync(service -> { + AndroidFuture future = new AndroidFuture<>(); + service.isApplicationVisibleForRole(roleName, packageName, + new RemoteCallback(future::complete)); + return future; + }); + propagateCallback(operation, "isApplicationVisibleForRole", executor, callback); + } + /** * @see RoleControllerService#onIsRoleVisible(String) */ diff --git a/core/java/android/app/role/RoleControllerService.java b/core/java/android/app/role/RoleControllerService.java index 2bc94560edd77..85db6a45a1bd3 100644 --- a/core/java/android/app/role/RoleControllerService.java +++ b/core/java/android/app/role/RoleControllerService.java @@ -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. *