diff --git a/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt b/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt index 5011b0d2db43..e737c4663af5 100644 --- a/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt +++ b/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt @@ -11,13 +11,17 @@ object ProgressManager { private val listenersMap = ConcurrentHashMap() val LISTENER = object : ProgressResponseBody.InternalProgressListener { - override fun onProgress(url: String, bytesRead: Long, totalBytes: Long) { + override fun onProgress( + url: String, + bytesRead: Long, + totalBytes: Long, + isComplete: Boolean + ) { getProgressListener(url)?.let { - var percentage = (bytesRead * 1f / totalBytes * 100f).toInt() - var isComplete = percentage >= 100 - if (percentage <= -100) { - percentage = 0 - isComplete = true + val percentage = when { + isComplete -> 100 + totalBytes == -1L -> 0 + else -> (bytesRead * 1f / totalBytes * 100f).toInt().coerceIn(0, 100) } it.invoke(isComplete, percentage, bytesRead, totalBytes) if (isComplete) { @@ -31,7 +35,7 @@ object ProgressManager { if (url.isNotEmpty()) { val url = getUrlNoOption(url) listenersMap[url] = listener - listener.invoke(false, 1, 0, 0) + listener.invoke(false, 0, 0, 0) } } diff --git a/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt b/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt index 9a8158a9a1c1..ad5b20c43e0d 100644 --- a/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt +++ b/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt @@ -4,11 +4,18 @@ import android.os.Handler import android.os.Looper import okhttp3.MediaType import okhttp3.ResponseBody -import okio.* +import okio.Buffer +import okio.BufferedSource +import okio.ForwardingSource +import okio.Source +import okio.buffer import java.io.IOException -import kotlin.jvm.Throws -class ProgressResponseBody internal constructor(private val url: String, private val internalProgressListener: InternalProgressListener?, private val responseBody: ResponseBody) : ResponseBody() { +class ProgressResponseBody internal constructor( + private val url: String, + private val internalProgressListener: InternalProgressListener, + private val responseBody: ResponseBody +) : ResponseBody() { private var bufferedSource: BufferedSource? = null override fun contentType(): MediaType? { return responseBody.contentType() @@ -34,9 +41,13 @@ class ProgressResponseBody internal constructor(private val url: String, private override fun read(sink: Buffer, byteCount: Long): Long { val bytesRead = super.read(sink, byteCount) totalBytesRead += if (bytesRead == -1L) 0 else bytesRead - if (internalProgressListener != null && lastTotalBytesRead != totalBytesRead) { + if (lastTotalBytesRead != totalBytesRead || bytesRead == -1L) { lastTotalBytesRead = totalBytesRead - mainThreadHandler.post { internalProgressListener.onProgress(url, totalBytesRead, contentLength()) } + mainThreadHandler.post { + internalProgressListener.onProgress( + url, totalBytesRead, contentLength(), bytesRead == -1L + ) + } } return bytesRead } @@ -44,7 +55,7 @@ class ProgressResponseBody internal constructor(private val url: String, private } interface InternalProgressListener { - fun onProgress(url: String, bytesRead: Long, totalBytes: Long) + fun onProgress(url: String, bytesRead: Long, totalBytes: Long, isComplete: Boolean) } companion object {