diff options
| author | 2022-02-28 20:43:56 +0000 | |
|---|---|---|
| committer | 2022-02-28 20:47:47 +0000 | |
| commit | 9d999938df75d07253dfb901dbaeac0dda99becc (patch) | |
| tree | 0961d3fc3f89b2af968566f723ec0c0a80fb9c7d | |
| parent | 9c7fdd7efa2680a1192b03eaa4600eac1e5624a2 (diff) | |
Let settings query an app's minimum bucket.
Bug: 156509848
Test: manual
Change-Id: Ife3869524f93b3341fa6eb1379619142ede5ca73
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( |