From 9d4dc5f35126c89ac5c502a5c935ec7b8fa31247 Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Sat, 27 Jul 2024 20:22:24 +0700 Subject: [PATCH] fix(extension/repo): Don't throw an error if it's a connection error Fixes GH-130 --- .../repo/exception/FetchExtensionRepoException.kt | 6 ++++++ .../repo/interactor/CreateExtensionRepo.kt | 8 +++++++- .../repo/interactor/UpdateExtensionRepo.kt | 14 +++++++++++++- .../extension/repo/service/ExtensionRepoService.kt | 10 ++++++++-- .../extension/repo/ExtensionRepoViewModel.kt | 2 ++ .../src/commonMain/moko-resources/base/strings.xml | 1 + 6 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/yokai/domain/extension/repo/exception/FetchExtensionRepoException.kt diff --git a/app/src/main/java/yokai/domain/extension/repo/exception/FetchExtensionRepoException.kt b/app/src/main/java/yokai/domain/extension/repo/exception/FetchExtensionRepoException.kt new file mode 100644 index 0000000000..8ee13a81d0 --- /dev/null +++ b/app/src/main/java/yokai/domain/extension/repo/exception/FetchExtensionRepoException.kt @@ -0,0 +1,6 @@ +package yokai.domain.extension.repo.exception + +import java.io.IOException + +class FetchExtensionRepoException(throwable: Throwable) : + IOException("Failed to retrieve Extension Repo Details", throwable) diff --git a/app/src/main/java/yokai/domain/extension/repo/interactor/CreateExtensionRepo.kt b/app/src/main/java/yokai/domain/extension/repo/interactor/CreateExtensionRepo.kt index c7e793a877..b0dccc7ece 100644 --- a/app/src/main/java/yokai/domain/extension/repo/interactor/CreateExtensionRepo.kt +++ b/app/src/main/java/yokai/domain/extension/repo/interactor/CreateExtensionRepo.kt @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.network.NetworkHelper import okhttp3.OkHttpClient import uy.kohesive.injekt.injectLazy import yokai.domain.extension.repo.ExtensionRepoRepository +import yokai.domain.extension.repo.exception.FetchExtensionRepoException import yokai.domain.extension.repo.exception.SaveExtensionRepoException import yokai.domain.extension.repo.model.ExtensionRepo import yokai.domain.extension.repo.service.ExtensionRepoService @@ -27,7 +28,11 @@ class CreateExtensionRepo( } val baseUrl = repoUrl.removeSuffix("/index.min.json") - return extensionRepoService.fetchRepoDetails(baseUrl)?.let { insert(it) } ?: Result.InvalidUrl + return try { + extensionRepoService.fetchRepoDetails(baseUrl)?.let { insert(it) } ?: Result.InvalidUrl + } catch (e: FetchExtensionRepoException) { + Result.RepoFetchFailed + } } private suspend fun insert(repo: ExtensionRepo): Result { @@ -74,6 +79,7 @@ class CreateExtensionRepo( data class DuplicateFingerprint(val oldRepo: ExtensionRepo, val newRepo: ExtensionRepo) : Result data object InvalidUrl : Result data object RepoAlreadyExists : Result + data object RepoFetchFailed : Result data object Success : Result data object Error : Result } diff --git a/app/src/main/java/yokai/domain/extension/repo/interactor/UpdateExtensionRepo.kt b/app/src/main/java/yokai/domain/extension/repo/interactor/UpdateExtensionRepo.kt index 8494bc931e..e4b9bcf0d3 100644 --- a/app/src/main/java/yokai/domain/extension/repo/interactor/UpdateExtensionRepo.kt +++ b/app/src/main/java/yokai/domain/extension/repo/interactor/UpdateExtensionRepo.kt @@ -1,10 +1,12 @@ package yokai.domain.extension.repo.interactor +import co.touchlab.kermit.Logger import eu.kanade.tachiyomi.network.NetworkHelper import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import yokai.domain.extension.repo.ExtensionRepoRepository +import yokai.domain.extension.repo.exception.FetchExtensionRepoException import yokai.domain.extension.repo.model.ExtensionRepo import yokai.domain.extension.repo.service.ExtensionRepoService @@ -21,7 +23,17 @@ class UpdateExtensionRepo( } suspend fun await(repo: ExtensionRepo) { - val newRepo = extensionRepoService.fetchRepoDetails(repo.baseUrl) ?: return + val newRepo = try { + extensionRepoService.fetchRepoDetails(repo.baseUrl) ?: return + } catch (e: Exception) { + when (e) { + is FetchExtensionRepoException -> { + Logger.e(e) { "Failed to fetch repo details" } + return + } + else -> throw e + } + } if ( repo.signingKeyFingerprint.startsWith("NOFINGERPRINT") || repo.signingKeyFingerprint == newRepo.signingKeyFingerprint diff --git a/app/src/main/java/yokai/domain/extension/repo/service/ExtensionRepoService.kt b/app/src/main/java/yokai/domain/extension/repo/service/ExtensionRepoService.kt index 6facca5e46..70ab809c5a 100644 --- a/app/src/main/java/yokai/domain/extension/repo/service/ExtensionRepoService.kt +++ b/app/src/main/java/yokai/domain/extension/repo/service/ExtensionRepoService.kt @@ -12,7 +12,9 @@ import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import okhttp3.OkHttpClient import uy.kohesive.injekt.injectLazy +import yokai.domain.extension.repo.exception.FetchExtensionRepoException import yokai.domain.extension.repo.model.ExtensionRepo +import java.net.UnknownHostException class ExtensionRepoService( private val client: OkHttpClient, @@ -35,8 +37,12 @@ class ExtensionRepoService( response["meta"] ?.jsonObject ?.let { jsonToExtensionRepo(baseUrl = repo, it) } - } catch (_: HttpException) { - null + } catch (e: Exception) { + when (e) { + is HttpException -> null + is UnknownHostException -> throw FetchExtensionRepoException(e) + else -> throw e + } } } } diff --git a/app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt b/app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt index 58f3a6518a..72ba6b5d19 100644 --- a/app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt +++ b/app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt @@ -54,6 +54,7 @@ class ExtensionRepoViewModel : is CreateExtensionRepo.Result.Success -> internalEvent.value = ExtensionRepoEvent.Success is CreateExtensionRepo.Result.Error -> internalEvent.value = ExtensionRepoEvent.InvalidUrl is CreateExtensionRepo.Result.RepoAlreadyExists -> internalEvent.value = ExtensionRepoEvent.RepoAlreadyExists + is CreateExtensionRepo.Result.RepoFetchFailed -> internalEvent.value = ExtensionRepoEvent.RepoFetchFailed is CreateExtensionRepo.Result.DuplicateFingerprint -> { internalEvent.value = ExtensionRepoEvent.ShowDialog(RepoDialog.Conflict(result.oldRepo, result.newRepo)) } @@ -93,6 +94,7 @@ sealed class ExtensionRepoEvent { sealed class LocalizedMessage(val stringRes: StringResource) : ExtensionRepoEvent() data object InvalidUrl : LocalizedMessage(MR.strings.invalid_repo_url) data object RepoAlreadyExists : LocalizedMessage(MR.strings.repo_already_exists) + data object RepoFetchFailed : LocalizedMessage(MR.strings.repo_fetch_failed) data class ShowDialog(val dialog: RepoDialog) : ExtensionRepoEvent() data object NoOp : ExtensionRepoEvent() data object Success : ExtensionRepoEvent() diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 84e1f263ad..6aae802289 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -880,6 +880,7 @@ Add repo Invalid repo url Repo already exists! + Failed to retrieve repo details. Please try again later You haven\'t added any repos yet. Delete repo? Are you sure you wish to delete the repo \"%s\"?