Loading api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -613,7 +613,9 @@ package android.app.usage { public final class UsageStatsManager { method public int getAppStandbyBucket(java.lang.String); method public java.util.Map<java.lang.String, java.lang.Integer> getAppStandbyBuckets(); method public void setAppStandbyBucket(java.lang.String, int); method public void setAppStandbyBuckets(java.util.Map<java.lang.String, java.lang.Integer>); method public void whitelistAppTemporarily(java.lang.String, long, android.os.UserHandle); field public static final int STANDBY_BUCKET_EXEMPTED = 5; // 0x5 field public static final int STANDBY_BUCKET_NEVER = 50; // 0x32 Loading core/java/android/app/usage/IUsageStatsManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.app.usage; import android.app.usage.UsageEvents; import android.content.pm.ParceledListSlice; import java.util.Map; /** * System private API for talking with the UsageStatsManagerService. * Loading @@ -38,4 +40,6 @@ interface IUsageStatsManager { in String[] annotations, String action); int getAppStandbyBucket(String packageName, String callingPackage, int userId); void setAppStandbyBucket(String packageName, int bucket, int userId); Map getAppStandbyBuckets(String callingPackage, int userId); void setAppStandbyBuckets(in Map appBuckets, int userId); } core/java/android/app/usage/UsageStatsManager.java +42 −3 Original line number Diff line number Diff line Loading @@ -324,11 +324,11 @@ public final class UsageStatsManager { * state of the app based on app usage patterns. Standby buckets determine how much an app will * be restricted from running background tasks such as jobs, alarms and certain PendingIntent * callbacks. * Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to * <p>Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to * {@link #STANDBY_BUCKET_RARE}, with {@link #STANDBY_BUCKET_ACTIVE} being the least * restrictive. The battery level of the device might also affect the restrictions. * * @return the current standby bucket of the calling app. * @return the current standby bucket of the calling app. One of STANDBY_BUCKET_* constants. */ public @StandbyBuckets int getAppStandbyBucket() { try { Loading Loading @@ -359,7 +359,13 @@ public final class UsageStatsManager { /** * {@hide} * Changes the app standby state to the provided bucket. * Changes an app's standby bucket to the provided value. The caller can only set the standby * bucket for a different app than itself. * @param packageName the package name of the app to set the bucket for. A SecurityException * will be thrown if the package name is that of the caller. * @param bucket the standby bucket to set it to, which should be one of STANDBY_BUCKET_*. * Setting a standby bucket outside of the range of STANDBY_BUCKET_ACTIVE to * STANDBY_BUCKET_NEVER will result in a SecurityException. */ @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) Loading @@ -371,6 +377,39 @@ public final class UsageStatsManager { } } /** * {@hide} * Returns the current standby bucket of every app that has a bucket assigned to it. * The caller must hold the permission android.permission.PACKAGE_USAGE_STATS. The key of the * returned Map is the package name and the value is the bucket assigned to the package. * @see #getAppStandbyBucket() */ @SystemApi @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public Map<String, Integer> getAppStandbyBuckets() { try { return (Map<String, Integer>) mService.getAppStandbyBuckets( mContext.getOpPackageName(), mContext.getUserId()); } catch (RemoteException e) { } return Collections.EMPTY_MAP; } /** * {@hide} * Changes the app standby bucket for multiple apps at once. The Map is keyed by the package * name and the value is one of STANDBY_BUCKET_*. * @param appBuckets a map of package name to bucket value. */ @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(Map<String, Integer> appBuckets) { try { mService.setAppStandbyBuckets(appBuckets, mContext.getUserId()); } catch (RemoteException e) { } } /** * {@hide} * Temporarily whitelist the specified app for a short duration. This is to allow an app Loading services/core/java/com/android/server/am/ActivityManagerShellCommand.java +29 −4 Original line number Diff line number Diff line Loading @@ -69,7 +69,9 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import static android.app.ActivityManager.RESIZE_MODE_SYSTEM; import static android.app.ActivityManager.RESIZE_MODE_USER; Loading Loading @@ -1867,10 +1869,24 @@ final class ActivityManagerShellCommand extends ShellCommand { String value = getNextArgRequired(); int bucket = bucketNameToBucketValue(value); if (bucket < 0) return -1; boolean multiple = peekNextArg() != null; IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); if (!multiple) { usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); } else { HashMap<String, Integer> buckets = new HashMap<>(); buckets.put(packageName, bucket); while ((packageName = getNextArg()) != null) { value = getNextArgRequired(); bucket = bucketNameToBucketValue(value); if (bucket < 0) continue; buckets.put(packageName, bucket); } usm.setAppStandbyBuckets(buckets, userId); } return 0; } Loading @@ -1886,12 +1902,21 @@ final class ActivityManagerShellCommand extends ShellCommand { return -1; } } String packageName = getNextArgRequired(); String packageName = getNextArg(); IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); if (packageName != null) { int bucket = usm.getAppStandbyBucket(packageName, null, userId); pw.println(bucket); } else { Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets( SHELL_PACKAGE_NAME, userId); for (Map.Entry<String, Integer> entry: buckets.entrySet()) { pw.print(entry.getKey()); pw.print(": "); pw.println(entry.getValue()); } } return 0; } Loading services/usage/java/com/android/server/usage/AppIdleHistory.java +12 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; /** * Keeps track of recent active state changes in apps. Loading Loading @@ -334,6 +336,16 @@ public class AppIdleHistory { return appUsageHistory.currentBucket; } public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); int size = userHistory.size(); HashMap<String, Integer> buckets = new HashMap<>(size); for (int i = 0; i < size; i++) { buckets.put(userHistory.keyAt(i), userHistory.valueAt(i).currentBucket); } return buckets; } public String getAppStandbyReason(String packageName, int userId, long elapsedRealtime) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); AppUsageHistory appUsageHistory = Loading Loading
api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -613,7 +613,9 @@ package android.app.usage { public final class UsageStatsManager { method public int getAppStandbyBucket(java.lang.String); method public java.util.Map<java.lang.String, java.lang.Integer> getAppStandbyBuckets(); method public void setAppStandbyBucket(java.lang.String, int); method public void setAppStandbyBuckets(java.util.Map<java.lang.String, java.lang.Integer>); method public void whitelistAppTemporarily(java.lang.String, long, android.os.UserHandle); field public static final int STANDBY_BUCKET_EXEMPTED = 5; // 0x5 field public static final int STANDBY_BUCKET_NEVER = 50; // 0x32 Loading
core/java/android/app/usage/IUsageStatsManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.app.usage; import android.app.usage.UsageEvents; import android.content.pm.ParceledListSlice; import java.util.Map; /** * System private API for talking with the UsageStatsManagerService. * Loading @@ -38,4 +40,6 @@ interface IUsageStatsManager { in String[] annotations, String action); int getAppStandbyBucket(String packageName, String callingPackage, int userId); void setAppStandbyBucket(String packageName, int bucket, int userId); Map getAppStandbyBuckets(String callingPackage, int userId); void setAppStandbyBuckets(in Map appBuckets, int userId); }
core/java/android/app/usage/UsageStatsManager.java +42 −3 Original line number Diff line number Diff line Loading @@ -324,11 +324,11 @@ public final class UsageStatsManager { * state of the app based on app usage patterns. Standby buckets determine how much an app will * be restricted from running background tasks such as jobs, alarms and certain PendingIntent * callbacks. * Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to * <p>Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to * {@link #STANDBY_BUCKET_RARE}, with {@link #STANDBY_BUCKET_ACTIVE} being the least * restrictive. The battery level of the device might also affect the restrictions. * * @return the current standby bucket of the calling app. * @return the current standby bucket of the calling app. One of STANDBY_BUCKET_* constants. */ public @StandbyBuckets int getAppStandbyBucket() { try { Loading Loading @@ -359,7 +359,13 @@ public final class UsageStatsManager { /** * {@hide} * Changes the app standby state to the provided bucket. * Changes an app's standby bucket to the provided value. The caller can only set the standby * bucket for a different app than itself. * @param packageName the package name of the app to set the bucket for. A SecurityException * will be thrown if the package name is that of the caller. * @param bucket the standby bucket to set it to, which should be one of STANDBY_BUCKET_*. * Setting a standby bucket outside of the range of STANDBY_BUCKET_ACTIVE to * STANDBY_BUCKET_NEVER will result in a SecurityException. */ @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) Loading @@ -371,6 +377,39 @@ public final class UsageStatsManager { } } /** * {@hide} * Returns the current standby bucket of every app that has a bucket assigned to it. * The caller must hold the permission android.permission.PACKAGE_USAGE_STATS. The key of the * returned Map is the package name and the value is the bucket assigned to the package. * @see #getAppStandbyBucket() */ @SystemApi @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public Map<String, Integer> getAppStandbyBuckets() { try { return (Map<String, Integer>) mService.getAppStandbyBuckets( mContext.getOpPackageName(), mContext.getUserId()); } catch (RemoteException e) { } return Collections.EMPTY_MAP; } /** * {@hide} * Changes the app standby bucket for multiple apps at once. The Map is keyed by the package * name and the value is one of STANDBY_BUCKET_*. * @param appBuckets a map of package name to bucket value. */ @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(Map<String, Integer> appBuckets) { try { mService.setAppStandbyBuckets(appBuckets, mContext.getUserId()); } catch (RemoteException e) { } } /** * {@hide} * Temporarily whitelist the specified app for a short duration. This is to allow an app Loading
services/core/java/com/android/server/am/ActivityManagerShellCommand.java +29 −4 Original line number Diff line number Diff line Loading @@ -69,7 +69,9 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import static android.app.ActivityManager.RESIZE_MODE_SYSTEM; import static android.app.ActivityManager.RESIZE_MODE_USER; Loading Loading @@ -1867,10 +1869,24 @@ final class ActivityManagerShellCommand extends ShellCommand { String value = getNextArgRequired(); int bucket = bucketNameToBucketValue(value); if (bucket < 0) return -1; boolean multiple = peekNextArg() != null; IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); if (!multiple) { usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); } else { HashMap<String, Integer> buckets = new HashMap<>(); buckets.put(packageName, bucket); while ((packageName = getNextArg()) != null) { value = getNextArgRequired(); bucket = bucketNameToBucketValue(value); if (bucket < 0) continue; buckets.put(packageName, bucket); } usm.setAppStandbyBuckets(buckets, userId); } return 0; } Loading @@ -1886,12 +1902,21 @@ final class ActivityManagerShellCommand extends ShellCommand { return -1; } } String packageName = getNextArgRequired(); String packageName = getNextArg(); IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); if (packageName != null) { int bucket = usm.getAppStandbyBucket(packageName, null, userId); pw.println(bucket); } else { Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets( SHELL_PACKAGE_NAME, userId); for (Map.Entry<String, Integer> entry: buckets.entrySet()) { pw.print(entry.getKey()); pw.print(": "); pw.println(entry.getValue()); } } return 0; } Loading
services/usage/java/com/android/server/usage/AppIdleHistory.java +12 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; /** * Keeps track of recent active state changes in apps. Loading Loading @@ -334,6 +336,16 @@ public class AppIdleHistory { return appUsageHistory.currentBucket; } public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); int size = userHistory.size(); HashMap<String, Integer> buckets = new HashMap<>(size); for (int i = 0; i < size; i++) { buckets.put(userHistory.keyAt(i), userHistory.valueAt(i).currentBucket); } return buckets; } public String getAppStandbyReason(String packageName, int userId, long elapsedRealtime) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); AppUsageHistory appUsageHistory = Loading