diff options
| author | 2023-01-27 16:21:46 -0800 | |
|---|---|---|
| committer | 2023-01-31 11:10:23 -0800 | |
| commit | 14b9df230e7d1e64db7473799f6f34bd30fbf50e (patch) | |
| tree | 282ecb6cdbbb99efa237284a8eb6765ad70c5d8c | |
| parent | 8970870803ea01c9aac0ac006d0a15cf2171a3b8 (diff) | |
Add "defer-until-active" policy to TIME_TICK broadcast.
Adding this policy ensures that apps in the Cached/Frozen
state are not brought out of that state to deliver this
broadcast.
Also, update the usage of makeRemovingMatchingFilter() as
it is deprecated.
Bug: 266988990
Bug: 266001401
Test: atest ./services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
Change-Id: Iff993aa8fa03a5da69517bd46343e8b8c5a1bf48
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java | 9 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java | 26 |
2 files changed, 29 insertions, 6 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 2533a0f47ee6..c319ea1d333a 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -1933,8 +1933,9 @@ public class AlarmManagerService extends SystemService { Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS); - mTimeTickOptions = BroadcastOptions - .makeRemovingMatchingFilter(new IntentFilter(Intent.ACTION_TIME_TICK)) + mTimeTickOptions = BroadcastOptions.makeBasic() + .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) + .setDeferUntilActive(true) .toBundle(); mTimeTickTrigger = new IAlarmListener.Stub() { @Override @@ -4252,8 +4253,8 @@ public class AlarmManagerService extends SystemService { } } // And send a TIME_TICK right now, since it is important to get the UI updated. - mHandler.post(() -> - getContext().sendBroadcastAsUser(mTimeTickIntent, UserHandle.ALL)); + mHandler.post(() -> getContext().sendBroadcastAsUser(mTimeTickIntent, + UserHandle.ALL, null, mTimeTickOptions)); } else { mNonInteractiveStartTime = nowELAPSED; } 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 57c5a6efa099..47271c78f7b5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java @@ -112,7 +112,6 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; import android.Manifest; import android.app.ActivityManager; @@ -1264,7 +1263,30 @@ public class AlarmManagerServiceTest { mService.interactiveStateChangedLocked(false); mService.interactiveStateChangedLocked(true); runnableCaptor.getValue().run(); - verify(mMockContext).sendBroadcastAsUser(mService.mTimeTickIntent, UserHandle.ALL); + final ArgumentCaptor<Bundle> optionsCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mMockContext).sendBroadcastAsUser(eq(mService.mTimeTickIntent), eq(UserHandle.ALL), + isNull(), optionsCaptor.capture()); + verifyTimeTickBroadcastOptions(optionsCaptor.getValue()); + } + + @Test + public void sendsTimeTickOnAlarmTrigger() throws Exception { + final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class); + // Stubbing so the handler doesn't actually run the runnable. + doReturn(true).when(mService.mHandler).post(runnableCaptor.capture()); + mService.mTimeTickTrigger.doAlarm(mock(IAlarmCompleteListener.class)); + runnableCaptor.getValue().run(); + final ArgumentCaptor<Bundle> optionsCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mMockContext).sendBroadcastAsUser(eq(mService.mTimeTickIntent), eq(UserHandle.ALL), + isNull(), optionsCaptor.capture()); + verifyTimeTickBroadcastOptions(optionsCaptor.getValue()); + } + + private void verifyTimeTickBroadcastOptions(Bundle actualOptionsBundle) { + final BroadcastOptions actualOptions = new BroadcastOptions(actualOptionsBundle); + assertEquals(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT, + actualOptions.getDeliveryGroupPolicy()); + assertTrue(actualOptions.isDeferUntilActive()); } @Test |