summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2022-02-28 20:43:56 +0000
committer Kweku Adams <kwekua@google.com> 2022-02-28 20:47:47 +0000
commit9d999938df75d07253dfb901dbaeac0dda99becc (patch)
tree0961d3fc3f89b2af968566f723ec0c0a80fb9c7d
parent9c7fdd7efa2680a1192b03eaa4600eac1e5624a2 (diff)
Let settings query an app's minimum bucket.
Bug: 156509848 Test: manual Change-Id: Ife3869524f93b3341fa6eb1379619142ede5ca73
-rw-r--r--apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java5
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java12
-rw-r--r--core/java/android/app/usage/IUsageStatsManager.aidl1
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java17
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java34
5 files changed, 69 insertions, 0 deletions
diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java
index 13ecd25d429a..e2426c2f1758 100644
--- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java
+++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java
@@ -143,6 +143,11 @@ public interface AppStandbyInternal {
void setAppStandbyBuckets(@NonNull List<AppStandbyInfo> appBuckets, int userId, int callingUid,
int callingPid);
+ /** Return the lowest bucket this app can enter. */
+ @StandbyBuckets
+ int getAppMinStandbyBucket(String packageName, int appId, int userId,
+ boolean shouldObfuscateInstantApps);
+
/**
* Put the specified app in the
* {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED}
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index 54c3db48231d..849354bd1d97 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -1437,6 +1437,18 @@ public class AppStandbyController
}
@Override
+ @StandbyBuckets
+ public int getAppMinStandbyBucket(String packageName, int appId, int userId,
+ boolean shouldObfuscateInstantApps) {
+ if (shouldObfuscateInstantApps && mInjector.isPackageEphemeral(userId, packageName)) {
+ return STANDBY_BUCKET_NEVER;
+ }
+ synchronized (mAppIdleLock) {
+ return getAppMinBucket(packageName, appId, userId);
+ }
+ }
+
+ @Override
public void restrictApp(@NonNull String packageName, int userId,
@ForcedReasons int restrictReason) {
restrictApp(packageName, userId, REASON_MAIN_FORCED_BY_SYSTEM, restrictReason);
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index a43071418b2f..2a2a9c6e703e 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -53,6 +53,7 @@ interface IUsageStatsManager {
void setAppStandbyBucket(String packageName, int bucket, int userId);
ParceledListSlice getAppStandbyBuckets(String callingPackage, int userId);
void setAppStandbyBuckets(in ParceledListSlice appBuckets, int userId);
+ int getAppMinStandbyBucket(String packageName, String callingPackage, int userId);
void setEstimatedLaunchTime(String packageName, long estimatedLaunchTime, int userId);
void setEstimatedLaunchTimes(in ParceledListSlice appLaunchTimes, int userId);
void registerAppUsageObserver(int observerId, in String[] packages, long timeLimitMs,
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index d7152b3676df..3a335f9d151b 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -787,6 +787,23 @@ public final class UsageStatsManager {
}
/**
+ * Return the lowest bucket this app can ever enter.
+ *
+ * @param packageName the package for which to fetch the minimum allowed standby bucket.
+ * {@hide}
+ */
+ @StandbyBuckets
+ @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
+ public int getAppMinStandbyBucket(String packageName) {
+ try {
+ return mService.getAppMinStandbyBucket(packageName, mContext.getOpPackageName(),
+ mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Changes an app's estimated launch time. An app is considered "launched" when a user opens
* one of its {@link android.app.Activity Activities}. The provided time is persisted across
* reboots and is used unless 1) the time is more than a week in the future and the platform
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 06aa8f05179c..b9abbf09e74d 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -2379,6 +2379,40 @@ public class UsageStatsService extends SystemService implements
}
@Override
+ public int getAppMinStandbyBucket(String packageName, String callingPackage, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ try {
+ userId = ActivityManager.getService().handleIncomingUser(
+ Binder.getCallingPid(), callingUid, userId, false, false,
+ "getAppStandbyBucket", null);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ final int packageUid = mPackageManagerInternal.getPackageUid(packageName, 0, userId);
+ // If the calling app is asking about itself, continue, else check for permission.
+ if (packageUid != callingUid) {
+ if (!hasPermission(callingPackage)) {
+ throw new SecurityException(
+ "Don't have permission to query min app standby bucket");
+ }
+ }
+ if (packageUid < 0) {
+ throw new IllegalArgumentException(
+ "Cannot get min standby bucket for non existent package ("
+ + packageName + ")");
+ }
+ final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(callingUid,
+ userId);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ return mAppStandby.getAppMinStandbyBucket(
+ packageName, UserHandle.getAppId(packageUid), userId, obfuscateInstantApps);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
public void setEstimatedLaunchTime(String packageName, long estimatedLaunchTime,
int userId) {
getContext().enforceCallingPermission(