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 d7163d870d1e6..5599e542762e6 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 ef470fe14f4b5..3b20735770b59 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; @@ -1265,7 +1264,30 @@ public class AlarmManagerServiceTest { mService.interactiveStateChangedLocked(false); mService.interactiveStateChangedLocked(true); runnableCaptor.getValue().run(); - verify(mMockContext).sendBroadcastAsUser(mService.mTimeTickIntent, UserHandle.ALL); + final ArgumentCaptor 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 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 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