diff --git a/app/build.gradle b/app/build.gradle index 69e2b2373..4cd4b8cf9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,14 +6,14 @@ plugins { } android { - compileSdkVersion 31 - buildToolsVersion '31.0.0' + compileSdkVersion 32 + buildToolsVersion '32.0.0' namespace 'org.koitharu.kotatsu' defaultConfig { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 32 versionCode 402 versionName '3.1.1' generatedDensities = [] diff --git a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt index 4708c0849..b8183a96b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/domain/DownloadManager.kt @@ -119,7 +119,8 @@ class DownloadManager( for ((chapterIndex, chapter) in chapters.withIndex()) { val pages = repo.getPages(chapter) for ((pageIndex, page) in pages.withIndex()) { - failsafe@ do { + var retryCounter = 0 + failsafe@ while (true) { try { val url = repo.getPageUrl(page) val file = cache[url] ?: downloadFile(url, page.referer, destination, tempFileName) @@ -129,12 +130,18 @@ class DownloadManager( pageNumber = pageIndex, ext = MimeTypeMap.getFileExtensionFromUrl(url), ) + break@failsafe } catch (e: IOException) { - outState.value = DownloadState.WaitingForNetwork(startId, data, cover) - connectivityManager.waitForNetwork() - continue@failsafe + if (retryCounter < MAX_DOWNLOAD_ATTEMPTS) { + outState.value = DownloadState.WaitingForNetwork(startId, data, cover) + delay(DOWNLOAD_ERROR_DELAY) + connectivityManager.waitForNetwork() + retryCounter++ + } else { + throw e + } } - } while (false) + } outState.value = DownloadState.Progress( startId, data, cover, @@ -180,26 +187,14 @@ class DownloadManager( .get() .build() val call = okHttp.newCall(request) - var attempts = MAX_DOWNLOAD_ATTEMPTS val file = File(destination, tempFileName) - while (true) { - try { - val response = call.clone().await() - runInterruptible(Dispatchers.IO) { - file.outputStream().use { out -> - checkNotNull(response.body).byteStream().copyTo(out) - } - } - return file - } catch (e: IOException) { - attempts-- - if (attempts <= 0) { - throw e - } else { - delay(DOWNLOAD_ERROR_DELAY) - } + val response = call.clone().await() + runInterruptible(Dispatchers.IO) { + file.outputStream().use { out -> + checkNotNull(response.body).byteStream().copyTo(out) } } + return file } private fun errorStateHandler(outState: MutableStateFlow) = diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt index d1ff7ae6c..733bf17d4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt @@ -5,6 +5,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkRequest import android.net.Uri +import android.os.Build import androidx.work.CoroutineWorker import kotlin.coroutines.resume import kotlinx.coroutines.suspendCancellableCoroutine @@ -14,6 +15,10 @@ val Context.connectivityManager: ConnectivityManager suspend fun ConnectivityManager.waitForNetwork(): Network { val request = NetworkRequest.Builder().build() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // fast path + activeNetwork?.let { return it } + } return suspendCancellableCoroutine { cont -> val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) {