Loading apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java +2 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ package com.android.server.usage; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER; import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK; import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; Loading Loading @@ -441,7 +441,7 @@ public class AppIdleHistory { elapsedRealtime, true); if (idle) { appUsageHistory.currentBucket = STANDBY_BUCKET_RARE; appUsageHistory.bucketingReason = REASON_MAIN_FORCED; appUsageHistory.bucketingReason = REASON_MAIN_FORCED_BY_USER; } else { appUsageHistory.currentBucket = STANDBY_BUCKET_ACTIVE; // This is to pretend that the app was just used, don't freeze the state anymore. Loading apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +20 −6 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ package com.android.server.usage; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_SYSTEM; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER; import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK; import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; Loading Loading @@ -565,7 +566,7 @@ public class AppStandbyController implements AppStandbyInternal { // If the bucket was forced by the user/developer, leave it alone. // A usage event will be the only way to bring it out of this forced state if (oldMainReason == REASON_MAIN_FORCED) { if (oldMainReason == REASON_MAIN_FORCED_BY_USER) { return; } final int oldBucket = app.currentBucket; Loading Loading @@ -783,7 +784,7 @@ public class AppStandbyController implements AppStandbyInternal { // Inform listeners if necessary if (previouslyIdle != stillIdle) { maybeInformListeners(packageName, userId, elapsedRealtime, standbyBucket, REASON_MAIN_FORCED, false); REASON_MAIN_FORCED_BY_USER, false); if (!stillIdle) { notifyBatteryStats(packageName, userId, idle); } Loading Loading @@ -1030,8 +1031,17 @@ public class AppStandbyController implements AppStandbyInternal { callingPid, callingUid, userId, false, true, "setAppStandbyBucket", null); final boolean shellCaller = callingUid == Process.ROOT_UID || callingUid == Process.SHELL_UID; final boolean systemCaller = UserHandle.isCore(callingUid); final int reason = systemCaller ? REASON_MAIN_FORCED : REASON_MAIN_PREDICTED; final int reason; // The Settings app runs in the system UID but in a separate process. Assume // things coming from other processes are due to the user. if ((UserHandle.isSameApp(callingUid, Process.SYSTEM_UID) && callingPid != Process.myPid()) || shellCaller) { reason = REASON_MAIN_FORCED_BY_USER; } else if (UserHandle.isCore(callingUid)) { reason = REASON_MAIN_FORCED_BY_SYSTEM; } else { reason = REASON_MAIN_PREDICTED; } final int packageFlags = PackageManager.MATCH_ANY_USER | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_DIRECT_BOOT_AWARE; Loading Loading @@ -1087,7 +1097,11 @@ public class AppStandbyController implements AppStandbyInternal { } // If the bucket was forced, don't allow prediction to override if ((app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED && predicted) return; if (predicted && ((app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED_BY_USER || (app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED_BY_SYSTEM)) { return; } // If the bucket is required to stay in a higher state for a specified duration, don't // override unless the duration has passed Loading core/java/android/app/usage/UsageStatsManager.java +17 −5 Original line number Diff line number Diff line Loading @@ -163,7 +163,6 @@ public final class UsageStatsManager { /** * The app spent sufficient time in the old bucket without any substantial event so it reached * the timeout threshold to have its bucket lowered. * * @hide */ public static final int REASON_MAIN_TIMEOUT = 0x0200; Loading @@ -173,15 +172,25 @@ public final class UsageStatsManager { */ public static final int REASON_MAIN_USAGE = 0x0300; /** * Forced by a core UID. * Forced by the user/developer, either explicitly or implicitly through some action. If user * action was not involved and this is purely due to the system, * {@link #REASON_MAIN_FORCED_BY_SYSTEM} should be used instead. * @hide */ public static final int REASON_MAIN_FORCED = 0x0400; public static final int REASON_MAIN_FORCED_BY_USER = 0x0400; /** * Set by a privileged system app. * Set by a privileged system app. This may be overridden by * {@link #REASON_MAIN_FORCED_BY_SYSTEM} or user action. * @hide */ public static final int REASON_MAIN_PREDICTED = 0x0500; /** * Forced by the system, independent of user action. If user action is involved, * {@link #REASON_MAIN_FORCED_BY_USER} should be used instead. When this is used, only * {@link #REASON_MAIN_FORCED_BY_SYSTEM} or user action can change the bucket. * @hide */ public static final int REASON_MAIN_FORCED_BY_SYSTEM = 0x0600; /** @hide */ public static final int REASON_SUB_MASK = 0x00FF; Loading Loading @@ -1016,7 +1025,10 @@ public final class UsageStatsManager { case REASON_MAIN_DEFAULT: sb.append("d"); break; case REASON_MAIN_FORCED: case REASON_MAIN_FORCED_BY_SYSTEM: sb.append("s"); break; case REASON_MAIN_FORCED_BY_USER: sb.append("f"); break; case REASON_MAIN_PREDICTED: Loading services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +12 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,8 @@ import static android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV; import static android.app.usage.UsageEvents.Event.SYSTEM_INTERACTION; import static android.app.usage.UsageEvents.Event.USER_INTERACTION; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_SYSTEM; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER; import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; Loading Loading @@ -501,12 +502,18 @@ public class AppStandbyControllerTests { // Can force to NEVER mInjector.mElapsedRealtime = HOUR_MS; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, REASON_MAIN_FORCED); REASON_MAIN_FORCED_BY_USER); assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController, PACKAGE_1)); // Prediction can't override FORCED reason // Prediction can't override FORCED reasons mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET, REASON_MAIN_PREDICTED); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1)); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, REASON_MAIN_FORCED); REASON_MAIN_FORCED_BY_USER); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET, REASON_MAIN_PREDICTED); assertEquals(STANDBY_BUCKET_FREQUENT, getStandbyBucket(mController, PACKAGE_1)); Loading Loading @@ -631,7 +638,7 @@ public class AppStandbyControllerTests { mInjector.mElapsedRealtime = 1 * RARE_THRESHOLD + 100; // Make sure app is in NEVER bucket mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, REASON_MAIN_FORCED); REASON_MAIN_FORCED_BY_USER); mController.checkIdleStates(USER_ID); assertBucket(STANDBY_BUCKET_NEVER); Loading Loading
apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java +2 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ package com.android.server.usage; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER; import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK; import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; Loading Loading @@ -441,7 +441,7 @@ public class AppIdleHistory { elapsedRealtime, true); if (idle) { appUsageHistory.currentBucket = STANDBY_BUCKET_RARE; appUsageHistory.bucketingReason = REASON_MAIN_FORCED; appUsageHistory.bucketingReason = REASON_MAIN_FORCED_BY_USER; } else { appUsageHistory.currentBucket = STANDBY_BUCKET_ACTIVE; // This is to pretend that the app was just used, don't freeze the state anymore. Loading
apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +20 −6 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ package com.android.server.usage; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_SYSTEM; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER; import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK; import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; Loading Loading @@ -565,7 +566,7 @@ public class AppStandbyController implements AppStandbyInternal { // If the bucket was forced by the user/developer, leave it alone. // A usage event will be the only way to bring it out of this forced state if (oldMainReason == REASON_MAIN_FORCED) { if (oldMainReason == REASON_MAIN_FORCED_BY_USER) { return; } final int oldBucket = app.currentBucket; Loading Loading @@ -783,7 +784,7 @@ public class AppStandbyController implements AppStandbyInternal { // Inform listeners if necessary if (previouslyIdle != stillIdle) { maybeInformListeners(packageName, userId, elapsedRealtime, standbyBucket, REASON_MAIN_FORCED, false); REASON_MAIN_FORCED_BY_USER, false); if (!stillIdle) { notifyBatteryStats(packageName, userId, idle); } Loading Loading @@ -1030,8 +1031,17 @@ public class AppStandbyController implements AppStandbyInternal { callingPid, callingUid, userId, false, true, "setAppStandbyBucket", null); final boolean shellCaller = callingUid == Process.ROOT_UID || callingUid == Process.SHELL_UID; final boolean systemCaller = UserHandle.isCore(callingUid); final int reason = systemCaller ? REASON_MAIN_FORCED : REASON_MAIN_PREDICTED; final int reason; // The Settings app runs in the system UID but in a separate process. Assume // things coming from other processes are due to the user. if ((UserHandle.isSameApp(callingUid, Process.SYSTEM_UID) && callingPid != Process.myPid()) || shellCaller) { reason = REASON_MAIN_FORCED_BY_USER; } else if (UserHandle.isCore(callingUid)) { reason = REASON_MAIN_FORCED_BY_SYSTEM; } else { reason = REASON_MAIN_PREDICTED; } final int packageFlags = PackageManager.MATCH_ANY_USER | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_DIRECT_BOOT_AWARE; Loading Loading @@ -1087,7 +1097,11 @@ public class AppStandbyController implements AppStandbyInternal { } // If the bucket was forced, don't allow prediction to override if ((app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED && predicted) return; if (predicted && ((app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED_BY_USER || (app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED_BY_SYSTEM)) { return; } // If the bucket is required to stay in a higher state for a specified duration, don't // override unless the duration has passed Loading
core/java/android/app/usage/UsageStatsManager.java +17 −5 Original line number Diff line number Diff line Loading @@ -163,7 +163,6 @@ public final class UsageStatsManager { /** * The app spent sufficient time in the old bucket without any substantial event so it reached * the timeout threshold to have its bucket lowered. * * @hide */ public static final int REASON_MAIN_TIMEOUT = 0x0200; Loading @@ -173,15 +172,25 @@ public final class UsageStatsManager { */ public static final int REASON_MAIN_USAGE = 0x0300; /** * Forced by a core UID. * Forced by the user/developer, either explicitly or implicitly through some action. If user * action was not involved and this is purely due to the system, * {@link #REASON_MAIN_FORCED_BY_SYSTEM} should be used instead. * @hide */ public static final int REASON_MAIN_FORCED = 0x0400; public static final int REASON_MAIN_FORCED_BY_USER = 0x0400; /** * Set by a privileged system app. * Set by a privileged system app. This may be overridden by * {@link #REASON_MAIN_FORCED_BY_SYSTEM} or user action. * @hide */ public static final int REASON_MAIN_PREDICTED = 0x0500; /** * Forced by the system, independent of user action. If user action is involved, * {@link #REASON_MAIN_FORCED_BY_USER} should be used instead. When this is used, only * {@link #REASON_MAIN_FORCED_BY_SYSTEM} or user action can change the bucket. * @hide */ public static final int REASON_MAIN_FORCED_BY_SYSTEM = 0x0600; /** @hide */ public static final int REASON_SUB_MASK = 0x00FF; Loading Loading @@ -1016,7 +1025,10 @@ public final class UsageStatsManager { case REASON_MAIN_DEFAULT: sb.append("d"); break; case REASON_MAIN_FORCED: case REASON_MAIN_FORCED_BY_SYSTEM: sb.append("s"); break; case REASON_MAIN_FORCED_BY_USER: sb.append("f"); break; case REASON_MAIN_PREDICTED: Loading
services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +12 −5 Original line number Diff line number Diff line Loading @@ -23,7 +23,8 @@ import static android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV; import static android.app.usage.UsageEvents.Event.SYSTEM_INTERACTION; import static android.app.usage.UsageEvents.Event.USER_INTERACTION; import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_SYSTEM; import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER; import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; Loading Loading @@ -501,12 +502,18 @@ public class AppStandbyControllerTests { // Can force to NEVER mInjector.mElapsedRealtime = HOUR_MS; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, REASON_MAIN_FORCED); REASON_MAIN_FORCED_BY_USER); assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController, PACKAGE_1)); // Prediction can't override FORCED reason // Prediction can't override FORCED reasons mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET, REASON_MAIN_PREDICTED); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1)); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, REASON_MAIN_FORCED); REASON_MAIN_FORCED_BY_USER); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET, REASON_MAIN_PREDICTED); assertEquals(STANDBY_BUCKET_FREQUENT, getStandbyBucket(mController, PACKAGE_1)); Loading Loading @@ -631,7 +638,7 @@ public class AppStandbyControllerTests { mInjector.mElapsedRealtime = 1 * RARE_THRESHOLD + 100; // Make sure app is in NEVER bucket mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, REASON_MAIN_FORCED); REASON_MAIN_FORCED_BY_USER); mController.checkIdleStates(USER_ID); assertBucket(STANDBY_BUCKET_NEVER); Loading