Merge "Prevent default wellbeing app from falling below WORKING_SET bucket" into rvc-qpr-dev am: 711cdc2220

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12663452

Change-Id: I5c85d31b5c42f4bbb7c33671d36120a6bcff5d80
This commit is contained in:
Michael Wachenschwanz
2020-09-24 21:26:05 +00:00
committed by Automerger Merge Worker
2 changed files with 48 additions and 0 deletions

View File

@@ -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.

View File

@@ -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);
@@ -217,6 +219,11 @@ public class AppStandbyControllerTests {
return mNonIdleWhitelistApps.contains(packageName);
}
@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));
}