Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0eb48db9 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Prevent default wellbeing app from falling below WORKING_SET bucket

Bug: 166301584
Test: atest AppStandbyControllerTests
Change-Id: I5ef67308cabbe43801103e888165d488f4888ab9
(cherry picked from commit 9df9e307)
parent 0c04c701
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -1120,6 +1120,10 @@ public class AppStandbyController implements AppStandbyInternal {
            if (isDeviceProvisioningPackage(packageName)) {
            if (isDeviceProvisioningPackage(packageName)) {
                return STANDBY_BUCKET_EXEMPTED;
                return STANDBY_BUCKET_EXEMPTED;
            }
            }

            if (mInjector.isWellbeingPackage(packageName)) {
                return STANDBY_BUCKET_WORKING_SET;
            }
        }
        }


        // Check this last, as it can be the most expensive check
        // Check this last, as it can be the most expensive check
@@ -1929,6 +1933,7 @@ public class AppStandbyController implements AppStandbyInternal {
         */
         */
        @GuardedBy("mPowerWhitelistedApps")
        @GuardedBy("mPowerWhitelistedApps")
        private final ArraySet<String> mPowerWhitelistedApps = new ArraySet<>();
        private final ArraySet<String> mPowerWhitelistedApps = new ArraySet<>();
        private String mWellbeingApp = null;


        Injector(Context context, Looper looper) {
        Injector(Context context, Looper looper) {
            mContext = context;
            mContext = context;
@@ -1962,6 +1967,9 @@ public class AppStandbyController implements AppStandbyInternal {
                if (activityManager.isLowRamDevice() || ActivityManager.isSmallBatteryDevice()) {
                if (activityManager.isLowRamDevice() || ActivityManager.isSmallBatteryDevice()) {
                    mAutoRestrictedBucketDelayMs = 12 * ONE_HOUR;
                    mAutoRestrictedBucketDelayMs = 12 * ONE_HOUR;
                }
                }

                final PackageManager packageManager = mContext.getPackageManager();
                mWellbeingApp = packageManager.getWellbeingPackageName();
            }
            }
            mBootPhase = phase;
            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() {
        void updatePowerWhitelistCache() {
            try {
            try {
                // Don't call out to DeviceIdleController with the lock held.
                // Don't call out to DeviceIdleController with the lock held.
+32 −0
Original line number Original line Diff line number Diff line
@@ -112,6 +112,8 @@ public class AppStandbyControllerTests {
    private static final int UID_SYSTEM_HEADFULL = 10002;
    private static final int UID_SYSTEM_HEADFULL = 10002;
    private static final String PACKAGE_SYSTEM_HEADLESS = "com.example.system.headless";
    private static final String PACKAGE_SYSTEM_HEADLESS = "com.example.system.headless";
    private static final int UID_SYSTEM_HEADLESS = 10003;
    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_ID = 0;
    private static final int USER_ID2 = 10;
    private static final int USER_ID2 = 10;
    private static final UserHandle USER_HANDLE_USER2 = new UserHandle(USER_ID2);
    private static final UserHandle USER_HANDLE_USER2 = new UserHandle(USER_ID2);
@@ -217,6 +219,11 @@ public class AppStandbyControllerTests {
            return mNonIdleWhitelistApps.contains(packageName);
            return mNonIdleWhitelistApps.contains(packageName);
        }
        }


        @Override
        boolean isWellbeingPackage(String packageName) {
            return PACKAGE_WELLBEING.equals(packageName);
        }

        @Override
        @Override
        void updatePowerWhitelistCache() {
        void updatePowerWhitelistCache() {
        }
        }
@@ -329,6 +336,12 @@ public class AppStandbyControllerTests {
        pish.packageName = PACKAGE_SYSTEM_HEADLESS;
        pish.packageName = PACKAGE_SYSTEM_HEADLESS;
        packages.add(pish);
        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());
        doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), anyInt());
        try {
        try {
            for (int i = 0; i < packages.size(); ++i) {
            for (int i = 0; i < packages.size(); ++i) {
@@ -1516,6 +1529,25 @@ public class AppStandbyControllerTests {
        assertBucket(STANDBY_BUCKET_RARE, PACKAGE_1);
        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) {
    private String getAdminAppsStr(int userId) {
        return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
        return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
    }
    }