summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/permission/IPermissionController.aidl3
-rw-r--r--core/java/android/permission/PermissionControllerManager.java78
-rw-r--r--core/java/android/permission/PermissionControllerService.java32
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 {