From 6055776329a2e46a0e8d570a840d7a28669eb148 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 20 May 2024 11:31:00 +0300 Subject: [PATCH] Fix crashes --- .../kotatsu/core/cache/MemoryContentCache.kt | 8 +++---- .../kotatsu/core/prefs/SourceSettings.kt | 8 +++++-- .../utils/validation/DomainValidator.kt | 24 +++++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/cache/MemoryContentCache.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/cache/MemoryContentCache.kt index 88a3fa19c..c76d7f317 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/cache/MemoryContentCache.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/cache/MemoryContentCache.kt @@ -16,16 +16,16 @@ class MemoryContentCache @Inject constructor(application: Application) : Compone private val isLowRam = application.isLowRamDevice() - init { - application.registerComponentCallbacks(this) - } - private val detailsCache = ExpiringLruCache>(if (isLowRam) 1 else 4, 5, TimeUnit.MINUTES) private val pagesCache = ExpiringLruCache>>(if (isLowRam) 1 else 4, 10, TimeUnit.MINUTES) private val relatedMangaCache = ExpiringLruCache>>(if (isLowRam) 1 else 3, 10, TimeUnit.MINUTES) + init { + application.registerComponentCallbacks(this) + } + suspend fun getDetails(source: MangaSource, url: String): Manga? { return detailsCache[Key(source, url)]?.awaitOrNull() } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt index f6c2f4d28..8b87e8169 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context import android.content.SharedPreferences.OnSharedPreferenceChangeListener import androidx.core.content.edit -import okhttp3.internal.isSensitiveHeader import org.koitharu.kotatsu.core.util.ext.getEnumValue import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty import org.koitharu.kotatsu.core.util.ext.putEnumValue @@ -12,6 +11,7 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.settings.utils.validation.DomainValidator class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig { @@ -31,7 +31,11 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig .ifNullOrEmpty { key.defaultValue } .sanitizeHeaderValue() - is ConfigKey.Domain -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue } + is ConfigKey.Domain -> prefs.getString(key.key, key.defaultValue) + ?.trim() + ?.takeIf { DomainValidator.isValidDomain(it) } + ?: key.defaultValue + is ConfigKey.ShowSuspiciousContent -> prefs.getBoolean(key.key, key.defaultValue) is ConfigKey.SplitByTranslations -> prefs.getBoolean(key.key, key.defaultValue) } as T diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/validation/DomainValidator.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/validation/DomainValidator.kt index 201fabeec..c596a2321 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/validation/DomainValidator.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/validation/DomainValidator.kt @@ -11,20 +11,24 @@ class DomainValidator : EditTextValidator() { if (trimmed.isEmpty()) { return ValidationResult.Success } - return if (!checkCharacters(trimmed)) { + return if (!isValidDomain(trimmed)) { ValidationResult.Failed(context.getString(R.string.invalid_domain_message)) } else { ValidationResult.Success } } - private fun checkCharacters(value: String): Boolean = runCatching { - val parts = value.split(':') - require(parts.size <= 2) - val urlBuilder = HttpUrl.Builder() - urlBuilder.host(parts.first()) - if (parts.size == 2) { - urlBuilder.port(parts[1].toInt()) - } - }.isSuccess + companion object { + + fun isValidDomain(value: String): Boolean = runCatching { + require(value.isNotEmpty()) + val parts = value.split(':') + require(parts.size <= 2) + val urlBuilder = HttpUrl.Builder() + urlBuilder.host(parts.first()) + if (parts.size == 2) { + urlBuilder.port(parts[1].toInt()) + } + }.isSuccess + } }