diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java index 8fc3ffecb3..96610b2ad0 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java @@ -90,6 +90,19 @@ public final class Loader implements LoaderErrorThrower { /** A callback to be notified of {@link Loader} events. */ public interface Callback { + /** + * Called when a load has started for the first time or through a retry. + * + * @param loadable The loadable whose load has completed. + * @param elapsedRealtimeMs {@link SystemClock#elapsedRealtime} when the load attempts to start. + * @param loadDurationMs The duration in milliseconds of the load since {@link #startLoading} + * was called. + * @param retryCount The number of failed attempts since {@link #startLoading} was called (this + * is zero for the first load attempt). + */ + default void onLoadStarted( + T loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) {} + /** * Called when a load has completed. * @@ -531,6 +544,9 @@ public final class Loader implements LoaderErrorThrower { } private void execute() { + long nowMs = SystemClock.elapsedRealtime(); + long durationMs = nowMs - startTimeMs; + Assertions.checkNotNull(this.callback).onLoadStarted(loadable, nowMs, durationMs, errorCount); currentError = null; downloadExecutor.execute(Assertions.checkNotNull(currentTask)); }