diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1c5da6be41..5cb14f1565 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -7,6 +7,10 @@ This release includes the following changes since the [1.5.0-beta01 release](#150-beta01-2024-10-30): +* ExoPlayer: + * Add a setter to `SntpClient` to set the max elapsed time since the last + update after which the client is re-initialized + ([#1794](https://github.com/androidx/media/pull/1794)). * Extractors: * Fix media duration parsing in `mdhd` box of MP4 files to handle `-1` values ([#1819](https://github.com/androidx/media/issues/1819)). diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/SntpClient.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/SntpClient.java index df8010c75f..db84e8494d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/SntpClient.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/SntpClient.java @@ -96,6 +96,12 @@ public final class SntpClient { @GuardedBy("valueLock") private static int timeoutMs = DEFAULT_TIMEOUT_MS; + @GuardedBy("valueLock") + private static long maxElapsedTimeUntilUpdateMs = C.TIME_UNSET; + + @GuardedBy("valueLock") + private static long lastUpdateElapsedRealtime = C.TIME_UNSET; + private SntpClient() {} /** Returns the NTP host address used to retrieve {@link #getElapsedRealtimeOffsetMs()}. */ @@ -148,6 +154,24 @@ public final class SntpClient { } } + /** + * Sets the maximum time to elapse until the client is re-initialized, in milliseconds. + * + *

The default is {@link C#TIME_UNSET} to never re-initialize. + */ + public static void setMaxElapsedTimeUntilUpdateMs(long maxElapsedTimeUntilUpdateMs) { + synchronized (valueLock) { + SntpClient.maxElapsedTimeUntilUpdateMs = maxElapsedTimeUntilUpdateMs; + } + } + + /** Returns the maximum time to elapse until the client is re-initialized, in milliseconds. */ + public static long getMaxElapsedTimeUntilUpdateMs() { + synchronized (valueLock) { + return maxElapsedTimeUntilUpdateMs; + } + } + /** * Returns whether the device time offset has already been loaded. * @@ -156,6 +180,11 @@ public final class SntpClient { */ public static boolean isInitialized() { synchronized (valueLock) { + if (lastUpdateElapsedRealtime != C.TIME_UNSET + && maxElapsedTimeUntilUpdateMs != C.TIME_UNSET) { + long deltaLastUpdate = SystemClock.elapsedRealtime() - lastUpdateElapsedRealtime; + isInitialized = isInitialized && deltaLastUpdate < maxElapsedTimeUntilUpdateMs; + } return isInitialized; } } @@ -353,6 +382,7 @@ public final class SntpClient { } long offsetMs = loadNtpTimeOffsetMs(); synchronized (valueLock) { + lastUpdateElapsedRealtime = SystemClock.elapsedRealtime(); elapsedRealtimeOffsetMs = offsetMs; isInitialized = true; }