From 027ec1ec0cf566a31029735a343cc0e58568d4db Mon Sep 17 00:00:00 2001
From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com>
Date: Sun, 25 May 2025 15:23:20 -0700
Subject: [PATCH] feat(Downloader): display timeouts to user
---
.../manager/download/KtorDownloadManager.kt | 19 ++++++++++++++++---
app/src/main/res/values/strings.xml | 1 +
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/app/src/main/kotlin/com/aliucord/manager/manager/download/KtorDownloadManager.kt b/app/src/main/kotlin/com/aliucord/manager/manager/download/KtorDownloadManager.kt
index 150e1dc..c4eb917 100644
--- a/app/src/main/kotlin/com/aliucord/manager/manager/download/KtorDownloadManager.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/manager/download/KtorDownloadManager.kt
@@ -1,5 +1,8 @@
package com.aliucord.manager.manager.download
+import android.content.Context
+import androidx.annotation.StringRes
+import com.aliucord.manager.R
import com.aliucord.manager.manager.download.IDownloadManager.Result
import com.aliucord.manager.util.IS_PROBABLY_EMULATOR
import io.ktor.client.HttpClient
@@ -11,6 +14,7 @@ import io.ktor.http.contentLength
import io.ktor.utils.io.readAvailable
import kotlinx.coroutines.CancellationException
import java.io.File
+import java.net.SocketTimeoutException
/**
* Handle downloading remote urls to a path with Ktor.
@@ -65,6 +69,9 @@ class KtorDownloadManager(private val http: HttpClient) : IDownloadManager {
} catch (_: CancellationException) {
tmpOut.delete()
return Result.Cancelled(systemTriggered = false)
+ } catch (t: SocketTimeoutException) {
+ tmpOut.delete()
+ return Error(t, localizedError = R.string.downloader_err_timeout)
} catch (t: Throwable) {
tmpOut.delete()
return Error(t)
@@ -77,8 +84,14 @@ class KtorDownloadManager(private val http: HttpClient) : IDownloadManager {
/**
* Wrapper around an exception that occurred from invoking Ktor
*/
- class Error(private val throwable: Throwable) : Result.Error() {
- override fun getDebugReason(): String = throwable.message ?: "Unknown exception"
- override fun toString(): String = throwable.stackTraceToString()
+ class Error(
+ private val error: Throwable,
+ @StringRes
+ private val localizedError: Int? = null,
+ ) : Result.Error() {
+ override fun toString(): String = error.stackTraceToString()
+ override fun getDebugReason(): String = error.message ?: "Unknown exception"
+ override fun getLocalizedReason(context: Context): String? =
+ localizedError?.let(context::getString)
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 407024a..729a1f8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -148,6 +148,7 @@
Update to %1$s
Download failed (Unknown)
+ Download failed (Timeout)
Download failed (Invalid response)
Download failed (File exists)
Download failed (Insufficient space)