From 34fbbdeb9a5648df57b29dcd86496ca9b89ce80f Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Wed, 20 Apr 2022 15:22:04 -0700 Subject: [PATCH] Allow injecting cached NTP time without network Bug: 197038444 Test: manual Change-Id: Ib47bc64e706201620edf6403da86338f6734dae4 --- .../server/location/gnss/NtpTimeHelper.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/location/gnss/NtpTimeHelper.java b/services/core/java/com/android/server/location/gnss/NtpTimeHelper.java index 4a66516632a5f..8732065ea0093 100644 --- a/services/core/java/com/android/server/location/gnss/NtpTimeHelper.java +++ b/services/core/java/com/android/server/location/gnss/NtpTimeHelper.java @@ -73,7 +73,6 @@ class NtpTimeHelper { private final WakeLock mWakeLock; private final Handler mHandler; - @GuardedBy("this") private final InjectNtpTimeCallback mCallback; // flags to trigger NTP when network becomes available @@ -129,6 +128,8 @@ class NtpTimeHelper { return; } if (!isNetworkConnected()) { + // try to inject the cached NTP time + injectCachedNtpTime(); // try again when network is up mInjectNtpTimeState = STATE_PENDING_NETWORK; return; @@ -157,23 +158,7 @@ class NtpTimeHelper { // only update when NTP time is fresh // If refreshSuccess is false, cacheAge does not drop down. - ntpResult = mNtpTime.getCachedTimeResult(); - if (ntpResult != null && ntpResult.getAgeMillis() < NTP_INTERVAL) { - long time = ntpResult.getTimeMillis(); - long timeReference = ntpResult.getElapsedRealtimeMillis(); - long certainty = ntpResult.getCertaintyMillis(); - - if (DEBUG) { - long now = System.currentTimeMillis(); - Log.d(TAG, "NTP server returned: " - + time + " (" + new Date(time) + ")" - + " ntpResult: " + ntpResult - + " system time offset: " + (time - now)); - } - - // Ok to cast to int, as can't rollover in practice - mHandler.post(() -> mCallback.injectTime(time, timeReference, (int) certainty)); - + if (injectCachedNtpTime()) { delay = NTP_INTERVAL; mNtpBackOff.reset(); } else { @@ -201,4 +186,26 @@ class NtpTimeHelper { // release wake lock held by task mWakeLock.release(); } + + /** Returns true if successfully inject cached NTP time. */ + private synchronized boolean injectCachedNtpTime() { + NtpTrustedTime.TimeResult ntpResult = mNtpTime.getCachedTimeResult(); + if (ntpResult == null || ntpResult.getAgeMillis() >= NTP_INTERVAL) { + return false; + } + + long time = ntpResult.getTimeMillis(); + long timeReference = ntpResult.getElapsedRealtimeMillis(); + long certainty = ntpResult.getCertaintyMillis(); + + if (DEBUG) { + long now = System.currentTimeMillis(); + Log.d(TAG, "NTP server returned: " + time + " (" + new Date(time) + ")" + + " ntpResult: " + ntpResult + " system time offset: " + (time - now)); + } + + // Ok to cast to int, as can't rollover in practice + mHandler.post(() -> mCallback.injectTime(time, timeReference, (int) certainty)); + return true; + } }