summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/jobscheduler/framework/java/android/app/AlarmManager.java11
-rw-r--r--apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java8
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java7
-rw-r--r--core/res/AndroidManifest.xml5
-rw-r--r--services/core/java/com/android/server/AlarmManagerInternal.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java2
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>
&lt;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));
}