diff --git a/CHANGELOG.md b/CHANGELOG.md index b70400cae5..90e1782902 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,5 +9,11 @@ ## Other ?? Technical stuff, what happened behind the scene --> +## Additions +- Sync DoH provider list with upstream (added Mullvad, Control D, Njalla, and Shecan) + ## Fixes -- Fixed NPE crash on tablets +- Fixed only few DoH provider is actually being used (Cloudflare, Google, AdGuard, and Quad9) + +## Other +- Simplify network helper code 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 deleted file mode 100644 index 8ee13a81d0..0000000000 --- a/app/src/main/java/yokai/domain/extension/repo/exception/FetchExtensionRepoException.kt +++ /dev/null @@ -1,6 +0,0 @@ -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 b0dccc7ece..c7e793a877 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,7 +5,6 @@ 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 @@ -28,11 +27,7 @@ class CreateExtensionRepo( } val baseUrl = repoUrl.removeSuffix("/index.min.json") - return try { - extensionRepoService.fetchRepoDetails(baseUrl)?.let { insert(it) } ?: Result.InvalidUrl - } catch (e: FetchExtensionRepoException) { - Result.RepoFetchFailed - } + return extensionRepoService.fetchRepoDetails(baseUrl)?.let { insert(it) } ?: Result.InvalidUrl } private suspend fun insert(repo: ExtensionRepo): Result { @@ -79,7 +74,6 @@ 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 776a04c2fd..8494bc931e 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,12 +1,10 @@ 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 @@ -23,18 +21,7 @@ class UpdateExtensionRepo( } suspend fun await(repo: ExtensionRepo) { - val newRepo = try { - extensionRepoService.fetchRepoDetails(repo.baseUrl) ?: return - } catch (e: Exception) { - when (e) { - is FetchExtensionRepoException -> { - // TODO: A way to show user that a repo failed to update - Logger.e(e) { "Failed to fetch repo details" } - return - } - else -> throw e - } - } + val newRepo = extensionRepoService.fetchRepoDetails(repo.baseUrl) ?: return 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 70ab809c5a..b07f5d0468 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 @@ -1,20 +1,15 @@ package yokai.domain.extension.repo.service import androidx.core.net.toUri +import co.touchlab.kermit.Logger import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import eu.kanade.tachiyomi.util.system.withIOContext import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject -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, @@ -29,35 +24,16 @@ class ExtensionRepoService( val url = "$repo/repo.json".toUri() try { - val response = with(json) { + with(json) { client.newCall(GET(url.toString())) .awaitSuccess() - .parseAs() + .parseAs() + .toExtensionRepo(baseUrl = repo) } - response["meta"] - ?.jsonObject - ?.let { jsonToExtensionRepo(baseUrl = repo, it) } } catch (e: Exception) { - when (e) { - is HttpException -> null - is UnknownHostException -> throw FetchExtensionRepoException(e) - else -> throw e - } + Logger.e(e) { "Failed to fetch repo details" } + null } } } - - private fun jsonToExtensionRepo(baseUrl: String, obj: JsonObject): ExtensionRepo? { - return try { - ExtensionRepo( - baseUrl = baseUrl, - name = obj["name"]!!.jsonPrimitive.content, - shortName = obj["shortName"]?.jsonPrimitive?.content, - website = obj["website"]!!.jsonPrimitive.content, - signingKeyFingerprint = obj["signingKeyFingerprint"]!!.jsonPrimitive.content, - ) - } catch (_: NullPointerException) { - null - } - } } 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 72ba6b5d19..58f3a6518a 100644 --- a/app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt +++ b/app/src/main/java/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt @@ -54,7 +54,6 @@ 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)) } @@ -94,7 +93,6 @@ 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/domain/src/commonMain/kotlin/eu/kanade/tachiyomi/domain/manga/models/Manga.kt b/domain/src/commonMain/kotlin/eu/kanade/tachiyomi/domain/manga/models/Manga.kt index ac57b2b7f5..da8d99f67b 100644 --- a/domain/src/commonMain/kotlin/eu/kanade/tachiyomi/domain/manga/models/Manga.kt +++ b/domain/src/commonMain/kotlin/eu/kanade/tachiyomi/domain/manga/models/Manga.kt @@ -5,6 +5,7 @@ import java.util.Locale import yokai.domain.manga.models.MangaUpdate // TODO: Transform into data class +@Deprecated("Use data class version", ReplaceWith("yokai.domain.manga.models.Manga")) interface Manga : SManga { var id: Long? diff --git a/app/src/main/java/yokai/domain/extension/repo/model/ExtensionRepo.kt b/domain/src/commonMain/kotlin/yokai/domain/extension/repo/model/ExtensionRepo.kt similarity index 100% rename from app/src/main/java/yokai/domain/extension/repo/model/ExtensionRepo.kt rename to domain/src/commonMain/kotlin/yokai/domain/extension/repo/model/ExtensionRepo.kt diff --git a/domain/src/commonMain/kotlin/yokai/domain/extension/repo/service/ExtensionRepoDto.kt b/domain/src/commonMain/kotlin/yokai/domain/extension/repo/service/ExtensionRepoDto.kt new file mode 100644 index 0000000000..b00388182f --- /dev/null +++ b/domain/src/commonMain/kotlin/yokai/domain/extension/repo/service/ExtensionRepoDto.kt @@ -0,0 +1,27 @@ +package yokai.domain.extension.repo.service + +import kotlinx.serialization.Serializable +import yokai.domain.extension.repo.model.ExtensionRepo + +@Serializable +data class ExtensionRepoMetaDto( + val meta: ExtensionRepoDto, +) + +@Serializable +data class ExtensionRepoDto( + val name: String, + val shortName: String?, + val website: String, + val signingKeyFingerprint: String, +) + +fun ExtensionRepoMetaDto.toExtensionRepo(baseUrl: String): ExtensionRepo { + return ExtensionRepo( + baseUrl = baseUrl, + name = meta.name, + shortName = meta.shortName, + website = meta.website, + signingKeyFingerprint = meta.signingKeyFingerprint, + ) +} diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 92872c10e2..a809a88adc 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -883,7 +883,6 @@ 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\"?