From 1dc88deedbbf5eaa09257ef62e73d49c9b775cbd Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Tue, 19 Jul 2022 17:38:50 -0700 Subject: [PATCH] Allowlist alarm-clock alarms from pre-S apps for FGS FGS starts are allowed by default to apps targeting pre-S sdks. However, on update their alarms may start getting denied if the app could not reset its alarms. Explicitly adding them to the allowlist to avoid this problem. Test: atest FrameworksMockingServicesTests:AlarmManagerServiceTest Test: Manual, using steps listed in b/238407723 Bug: 239098759 Bug: 238407723 Change-Id: I895901f0c870b161a8a4df92ebe93c873a55abc9 --- .../com/android/server/alarm/AlarmManagerService.java | 6 +++++- .../android/server/alarm/AlarmManagerServiceTest.java | 9 +++++++-- 2 files changed, 12 insertions(+), 3 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 e8bcfd2f5bb8f..c94cc8ff2612c 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -2895,7 +2895,11 @@ public class AlarmManagerService extends SystemService { } else { needsPermission = false; lowerQuota = allowWhileIdle; - idleOptions = allowWhileIdle ? mOptsWithFgs.toBundle() : null; + idleOptions = (allowWhileIdle || (alarmClock != null)) + // This avoids exceptions on existing alarms when the app upgrades to + // target S. Note that FGS from pre-S apps isn't restricted anyway. + ? mOptsWithFgs.toBundle() + : null; if (exact) { exactAllowReason = EXACT_ALLOW_REASON_COMPAT; } 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 67ef7f5bded8c..80de823a6a1b9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java @@ -2357,10 +2357,15 @@ public class AlarmManagerServiceTest { mBinder.set(TEST_CALLING_PACKAGE, RTC_WAKEUP, 1234, WINDOW_EXACT, 0, 0, alarmPi, null, null, null, alarmClock); + final ArgumentCaptor bundleCaptor = ArgumentCaptor.forClass(Bundle.class); verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L), eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE), - isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull(), - eq(EXACT_ALLOW_REASON_COMPAT)); + isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), + bundleCaptor.capture(), eq(EXACT_ALLOW_REASON_COMPAT)); + + final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue()); + final int type = idleOptions.getTemporaryAppAllowlistType(); + assertEquals(TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED, type); } @Test