diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java index 1e7d226c1c..d050c1d37f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java @@ -734,7 +734,7 @@ public final class DownloadManager { break; case MSG_CONTENT_LENGTH_CHANGED: task = (Task) message.obj; - onContentLengthChanged(task); + onContentLengthChanged(task, Util.toLong(message.arg1, message.arg2)); return; // No need to post back to mainHandler. case MSG_UPDATE_PROGRESS: updateProgress(); @@ -1030,9 +1030,8 @@ public final class DownloadManager { // Task event processing. - private void onContentLengthChanged(Task task) { + private void onContentLengthChanged(Task task, long contentLength) { String downloadId = task.request.id; - long contentLength = task.contentLength; Download download = Assertions.checkNotNull(getDownload(downloadId, /* loadFromIndex= */ false)); if (contentLength == download.contentLength || contentLength == C.LENGTH_UNSET) { @@ -1325,7 +1324,13 @@ public final class DownloadManager { this.contentLength = contentLength; @Nullable Handler internalHandler = this.internalHandler; if (internalHandler != null) { - internalHandler.obtainMessage(MSG_CONTENT_LENGTH_CHANGED, this).sendToTarget(); + internalHandler + .obtainMessage( + MSG_CONTENT_LENGTH_CHANGED, + (int) (contentLength >> 32), + (int) contentLength, + this) + .sendToTarget(); } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadProgress.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadProgress.java index 9d946daa28..ba226e60b2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadProgress.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadProgress.java @@ -21,8 +21,8 @@ import com.google.android.exoplayer2.C; public class DownloadProgress { /** The number of bytes that have been downloaded. */ - public long bytesDownloaded; + public volatile long bytesDownloaded; /** The percentage that has been downloaded, or {@link C#PERCENTAGE_UNSET} if unknown. */ - public float percentDownloaded; + public volatile float percentDownloaded; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/Downloader.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/Downloader.java index fa10d5842b..53485aced6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/Downloader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/Downloader.java @@ -28,6 +28,10 @@ public interface Downloader { /** * Called when progress is made during a download operation. * + *

May be called directly from {@link #download}, or from any other thread used by the + * downloader. In all cases, {@link #download} is guaranteed not to return until after the last + * call to {@link #onProgress} has finished executing. + * * @param contentLength The length of the content in bytes, or {@link C#LENGTH_UNSET} if * unknown. * @param bytesDownloaded The number of bytes that have been downloaded.