Sending a TIME_TICK on screen_on
We used to send a single TIME_TICK on coming out of idle but now that is
delayed for a while after screen_on, which can lead to obsolete ui for
components relying on TIME_TICK for updating themselves.
Also, added a tag for TIME_TICK listener so it's easier to track in the
dump.
Test: atest FrameworksMockingServicesTests:AlarmManagerServiceTest
Bug: 119328963
Change-Id: I7740236c5c6dfd3c5338856c8e939a9c42bd519e
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 854c03f..e50f7fc 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -1122,8 +1122,6 @@
rescheduleKernelAlarmsLocked();
updateNextAlarmClockLocked();
- // And send a TIME_TICK right now, since it is important to get the UI updated.
- mHandler.post(() -> getContext().sendBroadcastAsUser(mTimeTickIntent, UserHandle.ALL));
}
static final class InFlight {
@@ -1297,7 +1295,7 @@
mInjector.init();
synchronized (mLock) {
- mHandler = new AlarmHandler(Looper.myLooper());
+ mHandler = new AlarmHandler();
mConstants = new Constants(mHandler);
mNextWakeup = mNextNonWakeup = 0;
@@ -3045,6 +3043,9 @@
mNonInteractiveTime = dur;
}
}
+ // And send a TIME_TICK right now, since it is important to get the UI updated.
+ mHandler.post(() ->
+ getContext().sendBroadcastAsUser(mTimeTickIntent, UserHandle.ALL));
} else {
mNonInteractiveStartTime = nowELAPSED;
}
@@ -3833,7 +3834,8 @@
mWakeLock.setWorkSource(null);
}
- private class AlarmHandler extends Handler {
+ @VisibleForTesting
+ class AlarmHandler extends Handler {
public static final int ALARM_EVENT = 1;
public static final int SEND_NEXT_ALARM_CLOCK_CHANGED = 2;
public static final int LISTENER_TIMEOUT = 3;
@@ -3842,8 +3844,8 @@
public static final int APP_STANDBY_PAROLE_CHANGED = 6;
public static final int REMOVE_FOR_STOPPED = 7;
- AlarmHandler(Looper looper) {
- super(looper);
+ AlarmHandler() {
+ super(Looper.myLooper());
}
public void postRemoveForStopped(int uid) {
@@ -3956,8 +3958,8 @@
final WorkSource workSource = null; // Let system take blame for time tick events.
setImpl(ELAPSED_REALTIME, mInjector.getElapsedRealtime() + tickEventDelay, 0,
- 0, null, mTimeTickTrigger, null, AlarmManager.FLAG_STANDALONE, workSource,
- null, Process.myUid(), "android");
+ 0, null, mTimeTickTrigger, "TIME_TICK", AlarmManager.FLAG_STANDALONE,
+ workSource, null, Process.myUid(), "android");
// Finally, remember when we set the tick alarm
synchronized (mLock) {