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:
@@ -4287,10 +4287,25 @@ public class AlarmManagerService extends SystemService {
|
||||
}
|
||||
}
|
||||
|
||||
boolean lookForPackageLocked(String packageName) {
|
||||
final ArrayList<Alarm> allAlarms = mAlarmStore.asList();
|
||||
for (final Alarm alarm : allAlarms) {
|
||||
if (alarm.matches(packageName)) {
|
||||
@GuardedBy("mLock")
|
||||
boolean lookForPackageLocked(String packageName, int uid) {
|
||||
// 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)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (final Alarm alarm : mPendingNonWakeupAlarms) {
|
||||
if (alarm.matches(packageName) && alarm.creatorUid == uid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -5271,7 +5286,7 @@ public class AlarmManagerService extends SystemService {
|
||||
case Intent.ACTION_QUERY_PACKAGE_RESTART:
|
||||
pkgList = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
|
||||
for (String packageName : pkgList) {
|
||||
if (lookForPackageLocked(packageName)) {
|
||||
if (lookForPackageLocked(packageName, uid)) {
|
||||
setResultCode(Activity.RESULT_OK);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3875,4 +3875,52 @@ public final class AlarmManagerServiceTest {
|
||||
assertAndHandleMessageSync(REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user