diff options
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java | 13 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java | 63 |
2 files changed, 76 insertions, 0 deletions
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 b6f85b2d06bf..1ab79380fb0d 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1364,6 +1364,19 @@ public class AppStandbyController implements AppStandbyInternal { if (DEBUG) { Slog.d(TAG, " Keeping at WORKING_SET due to min timeout"); } + } else if (newBucket == STANDBY_BUCKET_RARE + && getBucketForLocked(packageName, userId, elapsedRealtime) + == STANDBY_BUCKET_RESTRICTED) { + // Prediction doesn't think the app will be used anytime soon and + // it's been long enough that it could just time out into restricted, + // so time it out there instead. Using TIMEOUT will allow prediction + // to raise the bucket when it needs to. + newBucket = STANDBY_BUCKET_RESTRICTED; + reason = REASON_MAIN_TIMEOUT; + if (DEBUG) { + Slog.d(TAG, + "Prediction to RARE overridden by timeout into RESTRICTED"); + } } } diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index 327cfc74dac5..39062f017a73 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -818,6 +818,69 @@ public class AppStandbyControllerTests { assertBucket(STANDBY_BUCKET_RESTRICTED); } + /** + * Test that an app is "timed out" into the RESTRICTED bucket if prediction tries to put it into + * a low bucket after the RESTRICTED timeout. + */ + @Test + public void testRestrictedTimeoutOverridesRestoredLowBucketPrediction() { + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + assertBucket(STANDBY_BUCKET_ACTIVE); + + // Predict to RARE Not long enough to time out into RESTRICTED. + mInjector.mElapsedRealtime += RARE_THRESHOLD; + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, + REASON_MAIN_PREDICTED); + assertBucket(STANDBY_BUCKET_RARE); + + // Add a short timeout event + mInjector.mElapsedRealtime += 1000; + reportEvent(mController, SYSTEM_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + assertBucket(STANDBY_BUCKET_ACTIVE); + mInjector.mElapsedRealtime += 1000; + mController.checkIdleStates(USER_ID); + assertBucket(STANDBY_BUCKET_ACTIVE); + + // Long enough that it could have timed out into RESTRICTED. Instead of reverting to + // predicted RARE, should go into RESTRICTED + mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4; + mController.checkIdleStates(USER_ID); + assertBucket(STANDBY_BUCKET_RESTRICTED); + + // Ensure that prediction can still raise it out despite this override. + mInjector.mElapsedRealtime += 1; + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, + REASON_MAIN_PREDICTED); + assertBucket(STANDBY_BUCKET_ACTIVE); + } + + /** + * Test that an app is "timed out" into the RESTRICTED bucket if prediction tries to put it into + * a low bucket after the RESTRICTED timeout. + */ + @Test + public void testRestrictedTimeoutOverridesPredictionLowBucket() { + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + + // Not long enough to time out into RESTRICTED. + mInjector.mElapsedRealtime += RARE_THRESHOLD; + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, + REASON_MAIN_PREDICTED); + assertBucket(STANDBY_BUCKET_RARE); + + mInjector.mElapsedRealtime += 1; + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + + // Long enough that it could have timed out into RESTRICTED. + mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4; + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, + REASON_MAIN_PREDICTED); + assertBucket(STANDBY_BUCKET_ACTIVE); + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, + REASON_MAIN_PREDICTED); + assertBucket(STANDBY_BUCKET_RESTRICTED); + } + @Test public void testPredictionRaiseFromRestrictedTimeout_highBucket() { reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); |