diff options
-rw-r--r-- | apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java | 16 | ||||
-rw-r--r-- | services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java | 32 |
2 files changed, 48 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 aeed1885dae5..36ccaf9c6fb8 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1120,6 +1120,10 @@ public class AppStandbyController implements AppStandbyInternal { if (isDeviceProvisioningPackage(packageName)) { return STANDBY_BUCKET_EXEMPTED; } + + if (mInjector.isWellbeingPackage(packageName)) { + return STANDBY_BUCKET_WORKING_SET; + } } // Check this last, as it can be the most expensive check @@ -1929,6 +1933,7 @@ public class AppStandbyController implements AppStandbyInternal { */ @GuardedBy("mPowerWhitelistedApps") private final ArraySet<String> mPowerWhitelistedApps = new ArraySet<>(); + private String mWellbeingApp = null; Injector(Context context, Looper looper) { mContext = context; @@ -1962,6 +1967,9 @@ public class AppStandbyController implements AppStandbyInternal { if (activityManager.isLowRamDevice() || ActivityManager.isSmallBatteryDevice()) { mAutoRestrictedBucketDelayMs = 12 * ONE_HOUR; } + + final PackageManager packageManager = mContext.getPackageManager(); + mWellbeingApp = packageManager.getWellbeingPackageName(); } mBootPhase = phase; } @@ -2006,6 +2014,14 @@ public class AppStandbyController implements AppStandbyInternal { } } + /** + * Returns {@code true} if the supplied package is the wellbeing app. Otherwise, + * returns {@code false}. + */ + boolean isWellbeingPackage(String packageName) { + return mWellbeingApp != null && mWellbeingApp.equals(packageName); + } + void updatePowerWhitelistCache() { try { // Don't call out to DeviceIdleController with the lock held. 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 4dec7a1a0ab9..a07e60ce838e 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -112,6 +112,8 @@ public class AppStandbyControllerTests { private static final int UID_SYSTEM_HEADFULL = 10002; private static final String PACKAGE_SYSTEM_HEADLESS = "com.example.system.headless"; private static final int UID_SYSTEM_HEADLESS = 10003; + private static final String PACKAGE_WELLBEING = "com.example.wellbeing"; + private static final int UID_WELLBEING = 10004; private static final int USER_ID = 0; private static final int USER_ID2 = 10; private static final UserHandle USER_HANDLE_USER2 = new UserHandle(USER_ID2); @@ -218,6 +220,11 @@ public class AppStandbyControllerTests { } @Override + boolean isWellbeingPackage(String packageName) { + return PACKAGE_WELLBEING.equals(packageName); + } + + @Override void updatePowerWhitelistCache() { } @@ -329,6 +336,12 @@ public class AppStandbyControllerTests { pish.packageName = PACKAGE_SYSTEM_HEADLESS; packages.add(pish); + PackageInfo piw = new PackageInfo(); + piw.applicationInfo = new ApplicationInfo(); + piw.applicationInfo.uid = UID_WELLBEING; + piw.packageName = PACKAGE_WELLBEING; + packages.add(piw); + doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), anyInt()); try { for (int i = 0; i < packages.size(); ++i) { @@ -1516,6 +1529,25 @@ public class AppStandbyControllerTests { assertBucket(STANDBY_BUCKET_RARE, PACKAGE_1); } + @Test + public void testWellbeingAppElevated() { + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_WELLBEING); + assertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_WELLBEING); + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + assertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_1); + mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD; + + // Make sure the default wellbeing app does not get lowered below WORKING_SET. + mController.setAppStandbyBucket(PACKAGE_WELLBEING, USER_ID, STANDBY_BUCKET_RARE, + REASON_MAIN_TIMEOUT); + assertBucket(STANDBY_BUCKET_WORKING_SET, PACKAGE_WELLBEING); + + // A non default wellbeing app should be able to fall lower than WORKING_SET. + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, + REASON_MAIN_TIMEOUT); + assertBucket(STANDBY_BUCKET_RARE, PACKAGE_1); + } + private String getAdminAppsStr(int userId) { return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId)); } |