diff options
6 files changed, 28 insertions, 13 deletions
diff --git a/apex/jobscheduler/framework/java/android/app/AlarmManager.java b/apex/jobscheduler/framework/java/android/app/AlarmManager.java index 53e81c789d2b..439f54c6328b 100644 --- a/apex/jobscheduler/framework/java/android/app/AlarmManager.java +++ b/apex/jobscheduler/framework/java/android/app/AlarmManager.java @@ -290,6 +290,17 @@ public class AlarmManager { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) public static final long SCHEDULE_EXACT_ALARM_DENIED_BY_DEFAULT = 226439802L; + /** + * Holding the permission {@link Manifest.permission#SCHEDULE_EXACT_ALARM} will no longer pin + * the standby-bucket of the app to + * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_WORKING_SET} or better. + * + * @hide + */ + @ChangeId + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final long SCHEDULE_EXACT_ALARM_DOES_NOT_ELEVATE_BUCKET = 262645982L; + @UnsupportedAppUsage private final IAlarmManager mService; private final Context mContext; diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index 29e730df2374..d6d51e0cf3fe 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -2704,9 +2704,11 @@ public class AlarmManagerService extends SystemService { } @Override - public boolean hasExactAlarmPermission(String packageName, int uid) { - return hasScheduleExactAlarmInternal(packageName, uid) - || hasUseExactAlarmInternal(packageName, uid); + public boolean shouldGetBucketElevation(String packageName, int uid) { + return hasUseExactAlarmInternal(packageName, uid) || (!CompatChanges.isChangeEnabled( + AlarmManager.SCHEDULE_EXACT_ALARM_DOES_NOT_ELEVATE_BUCKET, packageName, + UserHandle.getUserHandleForUid(uid)) && hasScheduleExactAlarmInternal( + packageName, uid)); } @Override 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 d837ae0eb61c..e55e39851742 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -1492,7 +1492,8 @@ public class AppStandbyController return STANDBY_BUCKET_WORKING_SET; } - if (mInjector.hasExactAlarmPermission(packageName, UserHandle.getUid(userId, appId))) { + if (mInjector.shouldGetExactAlarmBucketElevation(packageName, + UserHandle.getUid(userId, appId))) { return STANDBY_BUCKET_WORKING_SET; } } @@ -2625,8 +2626,8 @@ public class AppStandbyController return packageName.equals(mWellbeingApp); } - boolean hasExactAlarmPermission(String packageName, int uid) { - return mAlarmManagerInternal.hasExactAlarmPermission(packageName, uid); + boolean shouldGetExactAlarmBucketElevation(String packageName, int uid) { + return mAlarmManagerInternal.shouldGetBucketElevation(packageName, uid); } void updatePowerWhitelistCache() { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 78a6a666c573..a8790b0aa0e1 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4649,7 +4649,8 @@ <p>Apps need to target API {@link android.os.Build.VERSION_CODES#S} or above to be able to request this permission. Note that apps targeting lower API levels do not need this permission to use exact alarm APIs. - <p>Apps that hold this permission, always stay in the + <p>Apps that hold this permission and target API + {@link android.os.Build.VERSION_CODES#TIRAMISU} and below always stay in the {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_WORKING_SET WORKING_SET} or lower standby bucket. <p>If your app relies on exact alarms for core functionality, it can instead request @@ -4675,7 +4676,7 @@ <p> Apps need to target API {@link android.os.Build.VERSION_CODES#TIRAMISU} or above to be able to request this permission. Note that only one of {@code USE_EXACT_ALARM} or {@code SCHEDULE_EXACT_ALARM} should be requested on a device. If your app is already using - {@code SCHEDULE_EXACT_ALARM} on older SDKs but need {@code USE_EXACT_ALARM} on SDK 33 and + {@code SCHEDULE_EXACT_ALARM} on older SDKs but needs {@code USE_EXACT_ALARM} on SDK 33 and above, then {@code SCHEDULE_EXACT_ALARM} should be declared with a max-sdk attribute, like: <pre> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" diff --git a/services/core/java/com/android/server/AlarmManagerInternal.java b/services/core/java/com/android/server/AlarmManagerInternal.java index b6a8227c2461..b7f2b8d4ffe6 100644 --- a/services/core/java/com/android/server/AlarmManagerInternal.java +++ b/services/core/java/com/android/server/AlarmManagerInternal.java @@ -47,11 +47,11 @@ public interface AlarmManagerInternal { void remove(PendingIntent rec); /** - * Returns if the given package in the given user holds - * {@link android.Manifest.permission#SCHEDULE_EXACT_ALARM} or - * {@link android.Manifest.permission#USE_EXACT_ALARM}. + * Returns {@code true} if the given package in the given uid holds + * {@link android.Manifest.permission#USE_EXACT_ALARM} or + * {@link android.Manifest.permission#SCHEDULE_EXACT_ALARM} for apps targeting T or lower. */ - boolean hasExactAlarmPermission(String packageName, int uid); + boolean shouldGetBucketElevation(String packageName, int uid); /** * Sets the device's current time zone and time zone confidence. 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 308a4b67de24..dcf1b35068c6 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -295,7 +295,7 @@ public class AppStandbyControllerTests { } @Override - boolean hasExactAlarmPermission(String packageName, int uid) { + boolean shouldGetExactAlarmBucketElevation(String packageName, int uid) { return mClockApps.contains(Pair.create(packageName, uid)); } |