summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextClock.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/widget/TextClock.java')
-rw-r--r--core/java/android/widget/TextClock.java40
1 files changed, 24 insertions, 16 deletions
diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java
index b1485ef27de5..e48afb2a3cc8 100644
--- a/core/java/android/widget/TextClock.java
+++ b/core/java/android/widget/TextClock.java
@@ -34,7 +34,6 @@ import android.icu.text.DateTimePatternGenerator;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
-import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.format.DateFormat;
@@ -45,6 +44,10 @@ import android.view.inspector.InspectableProperty;
import com.android.internal.R;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.TimeZone;
@@ -185,18 +188,29 @@ public class TextClock extends TextView {
private final Runnable mTicker = new Runnable() {
public void run() {
- if (mStopTicking) {
+ removeCallbacks(this);
+ if (mStopTicking || !mShouldRunTicker) {
return; // Test disabled the clock ticks
}
onTimeChanged();
- long now = SystemClock.uptimeMillis();
- long next = now + (1000 - now % 1000);
+ Instant now = mTime.toInstant();
+ ZoneId zone = mTime.getTimeZone().toZoneId();
+
+ ZonedDateTime nextTick;
+ if (mHasSeconds) {
+ nextTick = now.atZone(zone).plusSeconds(1).withNano(0);
+ } else {
+ nextTick = now.atZone(zone).plusMinutes(1).withSecond(0).withNano(0);
+ }
- Handler handler = getHandler();
- if (handler != null) {
- handler.postAtTime(mTicker, next);
+ long millisUntilNextTick = Duration.between(now, nextTick.toInstant()).toMillis();
+ if (millisUntilNextTick <= 0) {
+ // This should never happen, but if it does, then tick again in a second.
+ millisUntilNextTick = 1000;
}
+
+ postDelayed(this, millisUntilNextTick);
}
};
@@ -519,8 +533,7 @@ public class TextClock extends TextView {
mHasSeconds = DateFormat.hasSeconds(mFormat);
if (mShouldRunTicker && hadSeconds != mHasSeconds) {
- if (hadSeconds) getHandler().removeCallbacks(mTicker);
- else mTicker.run();
+ mTicker.run();
}
}
@@ -557,14 +570,10 @@ public class TextClock extends TextView {
if (!mShouldRunTicker && isVisible) {
mShouldRunTicker = true;
- if (mHasSeconds) {
- mTicker.run();
- } else {
- onTimeChanged();
- }
+ mTicker.run();
} else if (mShouldRunTicker && !isVisible) {
mShouldRunTicker = false;
- getHandler().removeCallbacks(mTicker);
+ removeCallbacks(mTicker);
}
}
@@ -592,7 +601,6 @@ public class TextClock extends TextView {
private void registerReceiver() {
final IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);