Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50880678 authored by Suprabh Shukla's avatar Suprabh Shukla Committed by Automerger Merge Worker
Browse files

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

parents 08a45570 036b40a7
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -4287,13 +4287,28 @@ public class AlarmManagerService extends SystemService {
        }
    }

    boolean lookForPackageLocked(String packageName) {
        final ArrayList<Alarm> allAlarms = mAlarmStore.asList();
        for (final Alarm alarm : allAlarms) {
    @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;
            }
        }
        return false;
    }

@@ -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;
                            }
+48 −0
Original line number Diff line number Diff line
@@ -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);
        }
    }
}