summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java42
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java14
2 files changed, 24 insertions, 32 deletions
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 0e4887d27b53..2ea8592e883e 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -2637,15 +2637,18 @@ public class AlarmManagerService extends SystemService {
* Returns true if the given uid can set window to be as small as it wants.
*/
boolean isExemptFromMinWindowRestrictions(int uid) {
- return isExemptFromExactAlarmPermission(uid);
+ return isExemptFromExactAlarmPermissionNoLock(uid);
}
/**
* Returns true if the given uid does not require SCHEDULE_EXACT_ALARM to set exact,
* allow-while-idle alarms.
- * Note: It is ok to call this method without the lock {@link #mLock} held.
+ * <b> Note: This should not be called with {@link #mLock} held.</b>
*/
- boolean isExemptFromExactAlarmPermission(int uid) {
+ boolean isExemptFromExactAlarmPermissionNoLock(int uid) {
+ if (Build.IS_DEBUGGABLE && Thread.holdsLock(mLock)) {
+ Slog.wtfStack(TAG, "Alarm lock held while calling into DeviceIdleController");
+ }
return (UserHandle.isSameApp(mSystemUiUid, uid)
|| UserHandle.isCore(uid)
|| mLocalDeviceIdleController == null
@@ -2747,7 +2750,7 @@ public class AlarmManagerService extends SystemService {
}
if (needsPermission && !hasScheduleExactAlarmInternal(callingPackage, callingUid)
&& !hasUseExactAlarmInternal(callingPackage, callingUid)) {
- if (!isExemptFromExactAlarmPermission(callingUid)) {
+ if (!isExemptFromExactAlarmPermissionNoLock(callingUid)) {
final String errorMessage = "Caller " + callingPackage + " needs to hold "
+ Manifest.permission.SCHEDULE_EXACT_ALARM + " to set "
+ "exact alarms.";
@@ -2810,7 +2813,7 @@ public class AlarmManagerService extends SystemService {
if (!isExactAlarmChangeEnabled(packageName, userId)) {
return true;
}
- return isExemptFromExactAlarmPermission(packageUid)
+ return isExemptFromExactAlarmPermissionNoLock(packageUid)
|| hasScheduleExactAlarmInternal(packageName, packageUid)
|| hasUseExactAlarmInternal(packageName, packageUid);
}
@@ -3862,10 +3865,7 @@ public class AlarmManagerService extends SystemService {
// added: true => package was added to the deny list
// added: false => package was removed from the deny list
if (added) {
- synchronized (mLock) {
- removeExactAlarmsOnPermissionRevokedLocked(uid,
- changedPackage, /*killUid = */ true);
- }
+ removeExactAlarmsOnPermissionRevoked(uid, changedPackage, /*killUid = */ true);
} else {
sendScheduleExactAlarmPermissionStateChangedBroadcast(changedPackage, userId);
}
@@ -3880,9 +3880,8 @@ public class AlarmManagerService extends SystemService {
*
* This is not expected to get called frequently.
*/
- @GuardedBy("mLock")
- void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName, boolean killUid) {
- if (isExemptFromExactAlarmPermission(uid)
+ void removeExactAlarmsOnPermissionRevoked(int uid, String packageName, boolean killUid) {
+ if (isExemptFromExactAlarmPermissionNoLock(uid)
|| !isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
return;
}
@@ -3891,7 +3890,9 @@ public class AlarmManagerService extends SystemService {
final Predicate<Alarm> whichAlarms = a -> (a.uid == uid && a.packageName.equals(packageName)
&& a.windowLength == 0);
- removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
+ synchronized (mLock) {
+ removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
+ }
if (killUid && mConstants.KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED) {
PermissionManagerService.killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
@@ -4807,10 +4808,7 @@ public class AlarmManagerService extends SystemService {
case REMOVE_EXACT_ALARMS:
int uid = msg.arg1;
String packageName = (String) msg.obj;
- synchronized (mLock) {
- removeExactAlarmsOnPermissionRevokedLocked(uid, packageName, /*killUid = */
- true);
- }
+ removeExactAlarmsOnPermissionRevoked(uid, packageName, /*killUid = */true);
break;
case EXACT_ALARM_DENY_LIST_PACKAGES_ADDED:
handleChangesToExactAlarmDenyList((ArraySet<String>) msg.obj, true);
@@ -4826,10 +4824,7 @@ public class AlarmManagerService extends SystemService {
uid = msg.arg1;
if (!hasScheduleExactAlarmInternal(packageName, uid)
&& !hasUseExactAlarmInternal(packageName, uid)) {
- synchronized (mLock) {
- removeExactAlarmsOnPermissionRevokedLocked(uid,
- packageName, /*killUid = */false);
- }
+ removeExactAlarmsOnPermissionRevoked(uid, packageName, /*killUid = */false);
}
break;
case CHECK_EXACT_ALARM_PERMISSION_ON_FEATURE_TOGGLE:
@@ -4849,10 +4844,7 @@ public class AlarmManagerService extends SystemService {
if (defaultDenied) {
if (!hasScheduleExactAlarmInternal(pkg, uid)
&& !hasUseExactAlarmInternal(pkg, uid)) {
- synchronized (mLock) {
- removeExactAlarmsOnPermissionRevokedLocked(uid, pkg,
- true);
- }
+ removeExactAlarmsOnPermissionRevoked(uid, pkg, true);
}
} else if (hasScheduleExactAlarmInternal(pkg, uid)) {
sendScheduleExactAlarmPermissionStateChangedBroadcast(pkg,
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 529def3697cd..8461b39f8899 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -2758,7 +2758,7 @@ public class AlarmManagerServiceTest {
mService.handleChangesToExactAlarmDenyList(new ArraySet<>(packages), false);
// No permission revoked.
- verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(anyInt(), anyString(),
+ verify(mService, never()).removeExactAlarmsOnPermissionRevoked(anyInt(), anyString(),
anyBoolean());
// Permission got granted only for (appId1, userId2).
@@ -2813,14 +2813,14 @@ public class AlarmManagerServiceTest {
mService.handleChangesToExactAlarmDenyList(new ArraySet<>(packages), true);
// Permission got revoked only for (appId1, userId2)
- verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(
+ verify(mService, never()).removeExactAlarmsOnPermissionRevoked(
eq(UserHandle.getUid(userId1, appId1)), eq(packages[0]), eq(true));
- verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(
+ verify(mService, never()).removeExactAlarmsOnPermissionRevoked(
eq(UserHandle.getUid(userId1, appId2)), eq(packages[1]), eq(true));
- verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(
+ verify(mService, never()).removeExactAlarmsOnPermissionRevoked(
eq(UserHandle.getUid(userId2, appId2)), eq(packages[1]), eq(true));
- verify(mService).removeExactAlarmsOnPermissionRevokedLocked(
+ verify(mService).removeExactAlarmsOnPermissionRevoked(
eq(UserHandle.getUid(userId2, appId1)), eq(packages[0]), eq(true));
}
@@ -2833,7 +2833,7 @@ public class AlarmManagerServiceTest {
mIAppOpsCallback.opChanged(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID, TEST_CALLING_PACKAGE);
assertAndHandleMessageSync(REMOVE_EXACT_ALARMS);
- verify(mService).removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID,
+ verify(mService).removeExactAlarmsOnPermissionRevoked(TEST_CALLING_UID,
TEST_CALLING_PACKAGE, true);
}
@@ -2919,7 +2919,7 @@ public class AlarmManagerServiceTest {
null);
assertEquals(6, mService.mAlarmStore.size());
- mService.removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID, TEST_CALLING_PACKAGE,
+ mService.removeExactAlarmsOnPermissionRevoked(TEST_CALLING_UID, TEST_CALLING_PACKAGE,
true);
final ArrayList<Alarm> remaining = mService.mAlarmStore.asList();