summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuprabh Shukla <suprabh@google.com>2021-06-21 14:21:03 -0700
committerDaniel Norman <danielnorman@google.com>2021-06-23 21:36:53 -0700
commit49f048a64a8db8f205f38ea58952df524c0579dd (patch)
tree174d225cd538b3bf2e1649cffe275e07d0586726
parent18cc7986f4569535351857109c605d8e003539c0 (diff)
canScheduleExactAlarms returns true for older apps
Callers that don't target S can schedule exact alarms so should get a return value of true when they call canScheduleExactAlarm. Test: atest FrameworksMockingServicesTests:AlarmManagerServiceTest Bug: 191328951 Change-Id: I1cd1d0fb3d3d922360494552e653ed540bfe5227
-rw-r--r--apex/jobscheduler/framework/java/android/app/AlarmManager.java16
-rw-r--r--apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java3
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java8
3 files changed, 18 insertions, 9 deletions
diff --git a/apex/jobscheduler/framework/java/android/app/AlarmManager.java b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
index 1efe5cb2f53e..4843415fdbdd 100644
--- a/apex/jobscheduler/framework/java/android/app/AlarmManager.java
+++ b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
@@ -1285,14 +1285,20 @@ public class AlarmManager {
}
/**
- * Called to check if the caller has the permission
- * {@link Manifest.permission#SCHEDULE_EXACT_ALARM}.
- *
- * Apps can start {@link android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM} to
+ * Called to check if the caller can schedule exact alarms.
+ * <p>
+ * Apps targeting {@link Build.VERSION_CODES#S} or higher can schedule exact alarms if they
+ * have the {@link Manifest.permission#SCHEDULE_EXACT_ALARM} permission. These apps can also
+ * start {@link android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM} to
* request this from the user.
+ * <p>
+ * Apps targeting lower sdk versions, can always schedule exact alarms.
*
- * @return {@code true} if the caller has the permission, {@code false} otherwise.
+ * @return {@code true} if the caller can schedule exact alarms.
* @see android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM
+ * @see #setExact(int, long, PendingIntent)
+ * @see #setExactAndAllowWhileIdle(int, long, PendingIntent)
+ * @see #setAlarmClock(AlarmClockInfo, PendingIntent)
*/
public boolean canScheduleExactAlarms() {
return hasScheduleExactAlarm(mContext.getOpPackageName(), mContext.getUserId());
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 fb5129f18417..70e548d4c547 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -2572,6 +2572,9 @@ public class AlarmManagerService extends SystemService {
throw new SecurityException("Uid " + callingUid
+ " cannot query hasScheduleExactAlarm for uid " + uid);
}
+ if (!isExactAlarmChangeEnabled(packageName, userId)) {
+ return true;
+ }
return (uid > 0) ? hasScheduleExactAlarmInternal(packageName, uid) : false;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index 280204dfd481..eab1afbd931e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -1914,11 +1914,11 @@ public class AlarmManagerServiceTest {
public void hasScheduleExactAlarmBinderCallChangeDisabled() throws RemoteException {
mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
- mockExactAlarmPermissionGrant(true, false, MODE_DEFAULT);
- assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ mockExactAlarmPermissionGrant(false, true, MODE_DEFAULT);
+ assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
- mockExactAlarmPermissionGrant(true, true, MODE_ALLOWED);
- assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+ mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+ assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
}
private void mockChangeEnabled(long changeId, boolean enabled) {