diff options
Diffstat (limited to 'core/java')
3 files changed, 113 insertions, 0 deletions
diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl index 0894e372efc2..c9dd06cfaa43 100644 --- a/core/java/android/permission/IPermissionController.aidl +++ b/core/java/android/permission/IPermissionController.aidl @@ -56,6 +56,9 @@ oneway interface IPermissionController { in AndroidFuture<String> callback); void getUnusedAppCount( in AndroidFuture callback); + void getHibernationEligibility( + in String packageName, + in AndroidFuture callback); void revokeOwnPermissionsOnKill(in String packageName, in List<String> permissions, in AndroidFuture callback); } diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index a0115a94e7fe..0cf06aa364ec 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -128,6 +128,51 @@ public final class PermissionControllerManager { /** Count and app even if it is a system app. */ public static final int COUNT_WHEN_SYSTEM = 2; + /** @hide */ + @IntDef(prefix = { "HIBERNATION_ELIGIBILITY_"}, value = { + HIBERNATION_ELIGIBILITY_UNKNOWN, + HIBERNATION_ELIGIBILITY_ELIGIBLE, + HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM, + HIBERNATION_ELIGIBILITY_EXEMPT_BY_USER, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface HibernationEligibilityFlag {} + + /** + * Unknown whether package is eligible for hibernation. + * + * @hide + */ + @SystemApi + public static final int HIBERNATION_ELIGIBILITY_UNKNOWN = -1; + + /** + * Package is eligible for app hibernation and may be hibernated when the job runs. + * + * @hide + */ + @SystemApi + public static final int HIBERNATION_ELIGIBILITY_ELIGIBLE = 0; + + /** + * Package is not eligible for app hibernation because it is categorically exempt via the + * system. + * + * @hide + */ + @SystemApi + public static final int HIBERNATION_ELIGIBILITY_EXEMPT_BY_SYSTEM = 1; + + /** + * Package is not eligible for app hibernation because it has been exempt by the user's + * preferences. Note that this should not be set if the package is exempt from hibernation by + * the system as the user preference would have no effect. + * + * @hide + */ + @SystemApi + public static final int HIBERNATION_ELIGIBILITY_EXEMPT_BY_USER = 2; + /** * Callback for delivering the result of {@link #revokeRuntimePermissions}. */ @@ -819,6 +864,39 @@ public final class PermissionControllerManager { } /** + * Get the hibernation eligibility of a package. See {@link HibernationEligibilityFlag}. + * + * @param packageName package name to check eligibility + * @param executor executor to run callback on + * @param callback callback for when result is generated + */ + @RequiresPermission(Manifest.permission.MANAGE_APP_HIBERNATION) + public void getHibernationEligibility(@NonNull String packageName, + @NonNull @CallbackExecutor Executor executor, + @NonNull IntConsumer callback) { + checkNotNull(executor); + checkNotNull(callback); + + mRemoteService.postAsync(service -> { + AndroidFuture<Integer> eligibilityResult = new AndroidFuture<>(); + service.getHibernationEligibility(packageName, eligibilityResult); + return eligibilityResult; + }).whenCompleteAsync((eligibility, err) -> { + if (err != null) { + Log.e(TAG, "Error getting hibernation eligibility", err); + callback.accept(HIBERNATION_ELIGIBILITY_UNKNOWN); + } else { + final long token = Binder.clearCallingIdentity(); + try { + callback.accept(eligibility); + } finally { + Binder.restoreCallingIdentity(token); + } + } + }, executor); + } + + /** * Triggers the revocation of one or more permissions for a package, under the following * conditions: * <ul> diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java index b1e3cfc161de..8d9f82b04b54 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -375,6 +375,22 @@ public abstract class PermissionControllerService extends Service { throw new AbstractMethodError("Must be overridden in implementing class"); } + /** + * Get the hibernation eligibility of the app. See + * {@link android.permission.PermissionControllerManager.HibernationEligibilityFlag}. + * + * @param packageName package to check eligibility + * @param callback callback after eligibility is returned + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.MANAGE_APP_HIBERNATION) + public void onGetHibernationEligibility(@NonNull String packageName, + @NonNull IntConsumer callback) { + throw new AbstractMethodError("Must be overridden in implementing class"); + } + @Override public final @NonNull IBinder onBind(Intent intent) { return new IPermissionController.Stub() { @@ -669,6 +685,22 @@ public abstract class PermissionControllerService extends Service { } @Override + public void getHibernationEligibility(@NonNull String packageName, + @NonNull AndroidFuture callback) { + try { + Objects.requireNonNull(callback); + + enforceSomePermissionsGrantedToCaller( + Manifest.permission.MANAGE_APP_HIBERNATION); + + PermissionControllerService.this.onGetHibernationEligibility(packageName, + callback::complete); + } catch (Throwable t) { + callback.completeExceptionally(t); + } + } + + @Override public void revokeOwnPermissionsOnKill(@NonNull String packageName, @NonNull List<String> permissions, @NonNull AndroidFuture callback) { try { |
