Merge "Collapse AndroidManifest_common to default" into ub-contactsdialer-i-dev
diff --git a/src/com/android/contacts/util/concurrent/ContactsExecutors.java b/src/com/android/contacts/util/concurrent/ContactsExecutors.java
index bf18876..58a6c1f 100644
--- a/src/com/android/contacts/util/concurrent/ContactsExecutors.java
+++ b/src/com/android/contacts/util/concurrent/ContactsExecutors.java
@@ -25,6 +25,7 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
/**
* Provides some common executors for use with {@link Futures}
@@ -170,15 +171,15 @@
RunnableScheduledFuture<T> {
private final Handler mHandler;
- private final TimeUnit mUnit;
- private final long mDelay;
+ private final long mDelayMillis;
private final Callable<T> mTask;
private final SettableFuture<T> mDelegate = SettableFuture.create();
+ private final AtomicLong mStart = new AtomicLong(-1);
+
private HandlerFuture(Handler handler, long delay, TimeUnit timeUnit, Callable<T> task) {
mHandler = handler;
- mUnit = timeUnit;
- mDelay = delay;
+ mDelayMillis = timeUnit.toMillis(delay);
mTask = task;
}
@@ -189,12 +190,18 @@
@Override
public long getDelay(TimeUnit unit) {
- return unit.convert(mDelay, mUnit);
+ long start = mStart.get();
+ if (start < 0) {
+ return mDelayMillis;
+ }
+ long remaining = mDelayMillis - (System.currentTimeMillis() - start);
+ return TimeUnit.MILLISECONDS.convert(remaining, unit);
}
@Override
public int compareTo(Delayed o) {
- return Long.compare(mDelay, o.getDelay(mUnit));
+ return Long.compare(getDelay(TimeUnit.MILLISECONDS),
+ o.getDelay(TimeUnit.MILLISECONDS));
}
@Override
@@ -210,6 +217,10 @@
@Override
public void run() {
+ if (!mStart.compareAndSet(-1, System.currentTimeMillis())) {
+ // Already started
+ return;
+ }
try {
mDelegate.set(mTask.call());
} catch (Exception e) {