Merge "Fix alarm processing of QUERY_PACKAGE_RESTART" into udc-dev am: 036b40a7d8

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22166049

Change-Id: I4b67fcad0aaeff3e3561c3df5fad812e5ca8a8b1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Suprabh Shukla
2023-03-23 15:18:28 +00:00
committed by Automerger Merge Worker
2 changed files with 68 additions and 5 deletions

View File

@@ -4287,13 +4287,28 @@ public class AlarmManagerService extends SystemService {
} }
} }
boolean lookForPackageLocked(String packageName) { @GuardedBy("mLock")
final ArrayList<Alarm> allAlarms = mAlarmStore.asList(); boolean lookForPackageLocked(String packageName, int uid) {
for (final Alarm alarm : allAlarms) { // This is called extremely rarely, e.g. when the user opens the force-stop page in settings
// so the loops using an iterator should be fine.
for (final Alarm alarm : mAlarmStore.asList()) {
if (alarm.matches(packageName) && alarm.creatorUid == uid) {
return true;
}
}
final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.get(uid);
if (alarmsForUid != null) {
for (final Alarm alarm : alarmsForUid) {
if (alarm.matches(packageName)) { if (alarm.matches(packageName)) {
return true; return true;
} }
} }
}
for (final Alarm alarm : mPendingNonWakeupAlarms) {
if (alarm.matches(packageName) && alarm.creatorUid == uid) {
return true;
}
}
return false; return false;
} }
@@ -5271,7 +5286,7 @@ public class AlarmManagerService extends SystemService {
case Intent.ACTION_QUERY_PACKAGE_RESTART: case Intent.ACTION_QUERY_PACKAGE_RESTART:
pkgList = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES); pkgList = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
for (String packageName : pkgList) { for (String packageName : pkgList) {
if (lookForPackageLocked(packageName)) { if (lookForPackageLocked(packageName, uid)) {
setResultCode(Activity.RESULT_OK); setResultCode(Activity.RESULT_OK);
return; return;
} }

View File

@@ -3875,4 +3875,52 @@ public final class AlarmManagerServiceTest {
assertAndHandleMessageSync(REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED); assertAndHandleMessageSync(REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED);
assertEquals(2, mService.mAlarmsPerUid.get(TEST_CALLING_UID_2)); assertEquals(2, mService.mAlarmsPerUid.get(TEST_CALLING_UID_2));
} }
@Test
public void lookForPackageLocked() throws Exception {
final String package2 = "test.package.2";
final int uid2 = 359712;
setTestAlarm(ELAPSED_REALTIME, mNowElapsedTest + 10, getNewMockPendingIntent());
setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 15,
getNewMockPendingIntent(uid2, package2));
doReturn(true).when(mService).checkAllowNonWakeupDelayLocked(anyLong());
assertTrue(mService.lookForPackageLocked(TEST_CALLING_PACKAGE, TEST_CALLING_UID));
assertTrue(mService.lookForPackageLocked(package2, uid2));
mNowElapsedTest += 10; // Advance time past the first alarm only.
mTestTimer.expire();
assertTrue(mService.lookForPackageLocked(TEST_CALLING_PACKAGE, TEST_CALLING_UID));
assertTrue(mService.lookForPackageLocked(package2, uid2));
// The non-wakeup alarm is sent on interactive state change: false -> true.
mService.interactiveStateChangedLocked(false);
mService.interactiveStateChangedLocked(true);
assertFalse(mService.lookForPackageLocked(TEST_CALLING_PACKAGE, TEST_CALLING_UID));
assertTrue(mService.lookForPackageLocked(package2, uid2));
mNowElapsedTest += 10; // Advance time past the second alarm.
mTestTimer.expire();
assertFalse(mService.lookForPackageLocked(TEST_CALLING_PACKAGE, TEST_CALLING_UID));
assertFalse(mService.lookForPackageLocked(package2, uid2));
}
@Test
public void onQueryPackageRestart() {
final String[] packages = {"p1", "p2", "p3"};
final int uid = 5421;
final Intent packageAdded = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART)
.setData(Uri.fromParts("package", packages[0], null))
.putExtra(Intent.EXTRA_PACKAGES, packages)
.putExtra(Intent.EXTRA_UID, uid);
mPackageChangesReceiver.onReceive(mMockContext, packageAdded);
for (String p : packages) {
verify(mService).lookForPackageLocked(p, uid);
}
}
} }