Loading apex/jobscheduler/framework/java/android/app/AlarmManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +5 −3 Original line number Diff line number Diff line Loading @@ -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 Loading apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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() { Loading core/res/AndroidManifest.xml +3 −2 Original line number Diff line number Diff line Loading @@ -4650,7 +4650,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 Loading @@ -4676,7 +4677,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" Loading services/core/java/com/android/server/AlarmManagerInternal.java +4 −4 Original line number Diff line number Diff line Loading @@ -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. Loading Loading
apex/jobscheduler/framework/java/android/app/AlarmManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +5 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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() { Loading
core/res/AndroidManifest.xml +3 −2 Original line number Diff line number Diff line Loading @@ -4650,7 +4650,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 Loading @@ -4676,7 +4677,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" Loading
services/core/java/com/android/server/AlarmManagerInternal.java +4 −4 Original line number Diff line number Diff line Loading @@ -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. Loading