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

Commit 410c2bfe authored by Hui Yu's avatar Hui Yu Committed by Android (Google) Code Review
Browse files

Merge "Background location permission should elevate the standby bucket to FREQUENT" into sc-dev

parents c66db32d cd834ae5
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

import static com.android.server.SystemService.PHASE_BOOT_COMPLETED;
import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
@@ -1207,6 +1208,11 @@ public class AppStandbyController
            return STANDBY_BUCKET_ACTIVE;
        }

        if (mPackageManager.checkPermission(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION,
                packageName) == PERMISSION_GRANTED) {
            return STANDBY_BUCKET_FREQUENT;
        }

        return STANDBY_BUCKET_NEVER;
    }

+43 −0
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

import static com.android.server.usage.AppStandbyController.DEFAULT_ELAPSED_TIME_THRESHOLDS;
import static com.android.server.usage.AppStandbyController.DEFAULT_SCREEN_TIME_THRESHOLDS;
@@ -56,6 +58,8 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import static org.mockito.AdditionalMatchers.not;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doReturn;
@@ -127,6 +131,8 @@ public class AppStandbyControllerTests {
    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 String PACKAGE_BACKGROUND_LOCATION = "com.example.backgroundLocation";
    private static final int UID_BACKGROUND_LOCATION = 10005;
    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);
@@ -391,7 +397,14 @@ public class AppStandbyControllerTests {
        piw.packageName = PACKAGE_WELLBEING;
        packages.add(piw);

        PackageInfo pib = new PackageInfo();
        pib.applicationInfo = new ApplicationInfo();
        pib.applicationInfo.uid = UID_BACKGROUND_LOCATION;
        pib.packageName = PACKAGE_BACKGROUND_LOCATION;
        packages.add(pib);

        doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), anyInt());

        try {
            for (int i = 0; i < packages.size(); ++i) {
                PackageInfo pkg = packages.get(i);
@@ -402,6 +415,18 @@ public class AppStandbyControllerTests {
                        .getPackageUidAsUser(eq(pkg.packageName), anyInt(), anyInt());
                doReturn(pkg.applicationInfo).when(mockPm)
                        .getApplicationInfo(eq(pkg.packageName), anyInt());

                if (pkg.packageName.equals(PACKAGE_BACKGROUND_LOCATION)) {
                    doReturn(PERMISSION_GRANTED).when(mockPm).checkPermission(
                            eq(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                            eq(pkg.packageName));
                    doReturn(PERMISSION_DENIED).when(mockPm).checkPermission(
                            not(eq(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)),
                            eq(pkg.packageName));
                } else {
                    doReturn(PERMISSION_DENIED).when(mockPm).checkPermission(anyString(),
                            eq(pkg.packageName));
                }
            }
        } catch (PackageManager.NameNotFoundException nnfe) {}
    }
@@ -1825,6 +1850,24 @@ public class AppStandbyControllerTests {
        assertEquals(93 * DAY_MS, mController.mAppStandbyScreenThresholds[4]);
    }

    /**
     * Package with ACCESS_BACKGROUND_LOCATION permission has minimum bucket
     * STANDBY_BUCKET_FREQUENT.
     * @throws Exception
     */
    @Test
    public void testBackgroundLocationBucket() throws Exception {
        reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime,
                PACKAGE_BACKGROUND_LOCATION);
        assertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_BACKGROUND_LOCATION);

        mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD;
        // Make sure PACKAGE_BACKGROUND_LOCATION does not get lowered than STANDBY_BUCKET_FREQUENT.
        mController.setAppStandbyBucket(PACKAGE_BACKGROUND_LOCATION, USER_ID, STANDBY_BUCKET_RARE,
                REASON_MAIN_TIMEOUT);
        assertBucket(STANDBY_BUCKET_FREQUENT, PACKAGE_BACKGROUND_LOCATION);
    }

    private String getAdminAppsStr(int userId) {
        return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
    }