diff options
Diffstat (limited to 'core/java/android/widget/TextClock.java')
| -rw-r--r-- | core/java/android/widget/TextClock.java | 40 |
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); |
