From cd834ae54cf85364c90463f1a18daaaf88c46991 Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Wed, 31 Mar 2021 16:09:31 -0700 Subject: [PATCH] Background location permission should elevate the standby bucket to FREQUENT Uid that has permission ACCESS_BACKGROUND_LOCATION will have at least STANDBY_BUCKET_FREQUENT. Bug: 183034945 Test: atest frameworks/base/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java#testBackgroundLocationBucket Change-Id: I83caceb464faeda242e06e4a46faf7749b1bcf65 --- .../server/usage/AppStandbyController.java | 6 +++ .../usage/AppStandbyControllerTests.java | 43 +++++++++++++++++++ 2 files changed, 49 insertions(+) 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 a62e258153a03..e07a650345b6d 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -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; @@ -1202,6 +1203,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; } 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 8991e9fedadfd..beb63a44f9e97 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -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; @@ -124,6 +128,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); @@ -376,7 +382,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); @@ -387,6 +400,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) {} } @@ -1787,6 +1812,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)); }