Bug fix in Alarm where it was not getting called correctly if the

new timeout was set that was smaller than the previously set timeout

> Using uptimeMillis in Alarm to avoid errors due to system time
changes
> Adding an extra check in Wait in case Thread.sleep eats up
all the timeout

Change-Id: Id1fac5e8fdb81a0c3c7a6a5e50586b2a2f180d06
(cherry picked from commit a2125e1d10)
This commit is contained in:
Sunny Goyal
2016-08-27 15:33:16 -07:00
parent def6e474da
commit 6f2bb1ada5
2 changed files with 20 additions and 4 deletions

View File

@@ -17,6 +17,7 @@
package com.android.launcher3;
import android.os.Handler;
import android.os.SystemClock;
public class Alarm implements Runnable{
// if we reach this time and the alarm hasn't been cancelled, call the listener
@@ -41,9 +42,16 @@ public class Alarm implements Runnable{
// Sets the alarm to go off in a certain number of milliseconds. If the alarm is already set,
// it's overwritten and only the new alarm setting is used
public void setAlarm(long millisecondsInFuture) {
long currentTime = System.currentTimeMillis();
long currentTime = SystemClock.uptimeMillis();
mAlarmPending = true;
long oldTriggerTime = mAlarmTriggerTime;
mAlarmTriggerTime = currentTime + millisecondsInFuture;
// If the previous alarm was set for a longer duration, cancel it.
if (mWaitingForCallback && oldTriggerTime > mAlarmTriggerTime) {
mHandler.removeCallbacks(this);
mWaitingForCallback = false;
}
if (!mWaitingForCallback) {
mHandler.postDelayed(this, mAlarmTriggerTime - currentTime);
mWaitingForCallback = true;
@@ -51,15 +59,14 @@ public class Alarm implements Runnable{
}
public void cancelAlarm() {
mAlarmTriggerTime = 0;
mAlarmPending = false;
}
// this is called when our timer runs out
public void run() {
mWaitingForCallback = false;
if (mAlarmTriggerTime != 0) {
long currentTime = System.currentTimeMillis();
if (mAlarmPending) {
long currentTime = SystemClock.uptimeMillis();
if (mAlarmTriggerTime > currentTime) {
// We still need to wait some time to trigger spring loaded mode--
// post a new callback

View File

@@ -25,6 +25,15 @@ public class Wait {
}
SystemClock.sleep(sleepMillis);
}
// Check once more before returning false.
try {
if (condition.isTrue()) {
return true;
}
} catch (Throwable t) {
// Ignore
}
return false;
}
}