diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 3ed054989..7569e976e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -13,9 +13,9 @@ import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin import org.koin.dsl.module import org.koitharu.kotatsu.core.db.MangaDatabase -import org.koitharu.kotatsu.core.http.persistentcookiejar.PersistentCookieJar -import org.koitharu.kotatsu.core.http.persistentcookiejar.cache.SetCookieCache -import org.koitharu.kotatsu.core.http.persistentcookiejar.persistence.SharedPrefsCookiePersistor +import org.koitharu.kotatsu.core.local.cookies.PersistentCookieJar +import org.koitharu.kotatsu.core.local.cookies.cache.SetCookieCache +import org.koitharu.kotatsu.core.local.cookies.persistence.SharedPrefsCookiePersistor import org.koitharu.kotatsu.core.local.CbzFetcher import org.koitharu.kotatsu.core.local.PagesCache import org.koitharu.kotatsu.core.prefs.AppSettings @@ -47,19 +47,15 @@ class KotatsuApp : Application() { .cache(CacheUtils.createHttpCache(applicationContext)) .build() } - }, module { - single { - MangaLoaderContext() - } - }, module { single { mangaDb().build() } - }, module { + single { + MangaLoaderContext() + } factory { AppSettings(applicationContext) } - }, module { single { PagesCache(applicationContext) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/ClearableCookieJar.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/ClearableCookieJar.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/ClearableCookieJar.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/ClearableCookieJar.kt index da912d32e..9f93debf3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/ClearableCookieJar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/ClearableCookieJar.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar +package org.koitharu.kotatsu.core.local.cookies import okhttp3.CookieJar diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/PersistentCookieJar.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/PersistentCookieJar.kt similarity index 90% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/PersistentCookieJar.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/PersistentCookieJar.kt index b99cae53a..5a39be07e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/PersistentCookieJar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/PersistentCookieJar.kt @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar +package org.koitharu.kotatsu.core.local.cookies -import org.koitharu.kotatsu.core.http.persistentcookiejar.persistence.CookiePersistor +import org.koitharu.kotatsu.core.local.cookies.persistence.CookiePersistor import okhttp3.Cookie import okhttp3.HttpUrl -import org.koitharu.kotatsu.core.http.persistentcookiejar.cache.CookieCache +import org.koitharu.kotatsu.core.local.cookies.cache.CookieCache import java.util.* class PersistentCookieJar( diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/CookieCache.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/CookieCache.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/CookieCache.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/CookieCache.kt index 523c234da..177d468c0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/CookieCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/CookieCache.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar.cache +package org.koitharu.kotatsu.core.local.cookies.cache import okhttp3.Cookie diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/IdentifiableCookie.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/IdentifiableCookie.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/IdentifiableCookie.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/IdentifiableCookie.kt index 0579db1ef..6ff70030e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/IdentifiableCookie.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/IdentifiableCookie.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar.cache +package org.koitharu.kotatsu.core.local.cookies.cache import okhttp3.Cookie import java.util.* diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/SetCookieCache.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/SetCookieCache.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/SetCookieCache.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/SetCookieCache.kt index 9ad8b8d2a..b776b0b33 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/cache/SetCookieCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/SetCookieCache.kt @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar.cache +package org.koitharu.kotatsu.core.local.cookies.cache import okhttp3.Cookie -import org.koitharu.kotatsu.core.http.persistentcookiejar.cache.IdentifiableCookie.Companion.decorateAll +import org.koitharu.kotatsu.core.local.cookies.cache.IdentifiableCookie.Companion.decorateAll import java.util.* import java.util.concurrent.ConcurrentHashMap diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/CookiePersistor.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/CookiePersistor.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/CookiePersistor.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/CookiePersistor.kt index 8c33bd79b..197b02b85 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/CookiePersistor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/CookiePersistor.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar.persistence +package org.koitharu.kotatsu.core.local.cookies.persistence import okhttp3.Cookie diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/SerializableCookie.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SerializableCookie.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/SerializableCookie.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SerializableCookie.kt index 3ba44dfca..88f882633 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/SerializableCookie.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SerializableCookie.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar.persistence +package org.koitharu.kotatsu.core.local.cookies.persistence import android.util.Log import okhttp3.Cookie diff --git a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/SharedPrefsCookiePersistor.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SharedPrefsCookiePersistor.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/SharedPrefsCookiePersistor.kt rename to app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SharedPrefsCookiePersistor.kt index 42aa74feb..f20b8ff3e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/http/persistentcookiejar/persistence/SharedPrefsCookiePersistor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SharedPrefsCookiePersistor.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.http.persistentcookiejar.persistence +package org.koitharu.kotatsu.core.local.cookies.persistence import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/BaseMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/BaseMangaRepository.kt deleted file mode 100644 index b2c32b4d0..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/BaseMangaRepository.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.koitharu.kotatsu.core.parser - -import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.core.model.MangaTag -import org.koitharu.kotatsu.core.model.SortOrder -import org.koitharu.kotatsu.domain.MangaLoaderContext - -abstract class BaseMangaRepository(protected val loaderContext: MangaLoaderContext) : - MangaRepository { - - override val sortOrders: Set get() = emptySet() - - override suspend fun getPageFullUrl(page: MangaPage) : String = page.url - - override suspend fun getTags(): Set = emptySet() -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt index 5e07c1cb0..c39189a70 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt @@ -4,10 +4,10 @@ import android.content.Context import android.net.Uri import androidx.core.net.toFile import androidx.core.net.toUri +import org.koin.core.KoinComponent import org.koin.core.inject import org.koitharu.kotatsu.core.local.CbzFilter import org.koitharu.kotatsu.core.model.* -import org.koitharu.kotatsu.domain.MangaLoaderContext import org.koitharu.kotatsu.domain.local.MangaIndex import org.koitharu.kotatsu.domain.local.MangaZip import org.koitharu.kotatsu.utils.AlphanumComparator @@ -19,9 +19,9 @@ import java.util.* import java.util.zip.ZipEntry import java.util.zip.ZipFile -class LocalMangaRepository(loaderContext: MangaLoaderContext) : BaseMangaRepository(loaderContext) { +class LocalMangaRepository : MangaRepository, KoinComponent { - private val context by loaderContext.inject() + private val context by inject() override suspend fun getList( offset: Int, @@ -114,6 +114,12 @@ class LocalMangaRepository(loaderContext: MangaLoaderContext) : BaseMangaReposit return list.firstOrNull() } + override val sortOrders = emptySet() + + override suspend fun getPageFullUrl(page: MangaPage) = page.url + + override suspend fun getTags() = emptySet() + companion object { fun isFileSupported(name: String): Boolean { diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt new file mode 100644 index 000000000..6234cf5ac --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/RemoteMangaRepository.kt @@ -0,0 +1,27 @@ +package org.koitharu.kotatsu.core.parser + +import org.koin.core.KoinComponent +import org.koin.core.inject +import org.koitharu.kotatsu.core.model.MangaPage +import org.koitharu.kotatsu.core.model.MangaSource +import org.koitharu.kotatsu.core.model.MangaTag +import org.koitharu.kotatsu.core.model.SortOrder +import org.koitharu.kotatsu.domain.MangaLoaderContext + +abstract class RemoteMangaRepository : MangaRepository, KoinComponent { + + protected abstract val source: MangaSource + + protected val loaderContext by inject() + protected val conf by lazy(LazyThreadSafetyMode.NONE) { + loaderContext.getSettings(source) + } + + override val sortOrders: Set get() = emptySet() + + override suspend fun getPageFullUrl(page: MangaPage): String = page.url + + override suspend fun getTags(): Set = emptySet() + + abstract fun onCreatePreferences(): Set +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ChanRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ChanRepository.kt index f30527848..b84d15414 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ChanRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ChanRepository.kt @@ -1,17 +1,14 @@ package org.koitharu.kotatsu.core.parser.site +import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.exceptions.ParseException import org.koitharu.kotatsu.core.model.* -import org.koitharu.kotatsu.core.parser.BaseMangaRepository -import org.koitharu.kotatsu.domain.MangaLoaderContext +import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.utils.ext.* -abstract class ChanRepository( - private val source: MangaSource, - loaderContext: MangaLoaderContext -) : BaseMangaRepository(loaderContext) { +abstract class ChanRepository : RemoteMangaRepository() { - protected abstract val domain: String + protected abstract val defaultDomain: String override val sortOrders = setOf(SortOrder.NEWEST, SortOrder.POPULARITY, SortOrder.ALPHABETICAL) @@ -21,12 +18,13 @@ abstract class ChanRepository( sortOrder: SortOrder?, tag: MangaTag? ): List { + val domain = conf.getDomain(defaultDomain) val url = when { query != null -> "https://$domain/?do=search&subaction=search&story=${query.urlEncoded()}" tag != null -> "https://$domain/tags/${tag.key}&n=${getSortKey2(sortOrder)}?offset=$offset" else -> "https://$domain/${getSortKey(sortOrder)}?offset=$offset" } - val doc = loaderContext.get(url).parseHtml() + val doc = loaderContext.httpGet(url).parseHtml() val root = doc.body().selectFirst("div.main_fon").getElementById("content") ?: throw ParseException("Cannot find root") return root.select("div.content_row").mapNotNull { row -> @@ -60,7 +58,8 @@ abstract class ChanRepository( override suspend fun getDetails(manga: Manga): Manga { - val doc = loaderContext.get(manga.url).parseHtml() + val domain = conf.getDomain(defaultDomain) + val doc = loaderContext.httpGet(manga.url).parseHtml() val root = doc.body().getElementById("dle-content") ?: throw ParseException("Cannot find root") return manga.copy( @@ -83,7 +82,7 @@ abstract class ChanRepository( } override suspend fun getPages(chapter: MangaChapter): List { - val doc = loaderContext.get(chapter.url).parseHtml() + val doc = loaderContext.httpGet(chapter.url).parseHtml() val scripts = doc.select("script") for (script in scripts) { val data = script.html() @@ -107,7 +106,8 @@ abstract class ChanRepository( } override suspend fun getTags(): Set { - val doc = loaderContext.get("https://$domain/catalog").parseHtml() + val domain = conf.getDomain(defaultDomain) + val doc = loaderContext.httpGet("https://$domain/catalog").parseHtml() val root = doc.body().selectFirst("div.main_fon").getElementById("side") .select("ul").last() return root.select("li.sidetag").map { li -> @@ -120,6 +120,8 @@ abstract class ChanRepository( }.toSet() } + override fun onCreatePreferences() = setOf(R.string.key_parser_domain) + private fun getSortKey(sortOrder: SortOrder?) = when (sortOrder ?: sortOrders.minBy { it.ordinal }) { SortOrder.ALPHABETICAL -> "catalog" diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt index eb7df7140..59a14b695 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt @@ -1,18 +1,14 @@ package org.koitharu.kotatsu.core.parser.site +import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.exceptions.ParseException import org.koitharu.kotatsu.core.model.* -import org.koitharu.kotatsu.core.parser.BaseMangaRepository -import org.koitharu.kotatsu.domain.MangaLoaderContext +import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.utils.ext.* -abstract class GroupleRepository( - private val source: MangaSource, - loaderContext: MangaLoaderContext -) : - BaseMangaRepository(loaderContext) { +abstract class GroupleRepository : RemoteMangaRepository() { - protected abstract val domain: String + protected abstract val defaultDomain: String override val sortOrders = setOf( SortOrder.UPDATED, SortOrder.POPULARITY, @@ -26,13 +22,14 @@ abstract class GroupleRepository( sortOrder: SortOrder?, tag: MangaTag? ): List { + val domain = conf.getDomain(defaultDomain) val doc = when { - !query.isNullOrEmpty() -> loaderContext.post( + !query.isNullOrEmpty() -> loaderContext.httpPost( "https://$domain/search", mapOf("q" to query) ) - tag == null -> loaderContext.get("https://$domain/list?sortType=${getSortKey(sortOrder)}&offset=$offset") - else -> loaderContext.get( + tag == null -> loaderContext.httpGet("https://$domain/list?sortType=${getSortKey(sortOrder)}&offset=$offset") + else -> loaderContext.httpGet( "https://$domain/list/genre/${tag.key}?sortType=${getSortKey( sortOrder )}&offset=$offset" @@ -86,7 +83,8 @@ abstract class GroupleRepository( } override suspend fun getDetails(manga: Manga): Manga { - val doc = loaderContext.get(manga.url).parseHtml() + val domain = conf.getDomain(defaultDomain) + val doc = loaderContext.httpGet(manga.url).parseHtml() val root = doc.body().getElementById("mangaBox") ?: throw ParseException("Cannot find root") return manga.copy( description = root.selectFirst("div.manga-description").firstChild()?.html(), @@ -109,7 +107,7 @@ abstract class GroupleRepository( } override suspend fun getPages(chapter: MangaChapter): List { - val doc = loaderContext.get(chapter.url + "?mtr=1").parseHtml() + val doc = loaderContext.httpGet(chapter.url + "?mtr=1").parseHtml() val scripts = doc.select("script") for (script in scripts) { val data = script.html() @@ -135,7 +133,8 @@ abstract class GroupleRepository( } override suspend fun getTags(): Set { - val doc = loaderContext.get("https://$domain/list/genres/sort_name").parseHtml() + val domain = conf.getDomain(defaultDomain) + val doc = loaderContext.httpGet("https://$domain/list/genres/sort_name").parseHtml() val root = doc.body().getElementById("mangaBox").selectFirst("div.leftContent") .selectFirst("table.table") return root.select("a.element-link").map { a -> @@ -147,6 +146,8 @@ abstract class GroupleRepository( }.toSet() } + override fun onCreatePreferences() = setOf(R.string.key_parser_domain) + private fun getSortKey(sortOrder: SortOrder?) = when (sortOrder ?: sortOrders.minBy { it.ordinal }) { SortOrder.ALPHABETICAL -> "name" diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt index 7994f38ff..81a47fe19 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt @@ -1,10 +1,9 @@ package org.koitharu.kotatsu.core.parser.site import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.domain.MangaLoaderContext -class HenChanRepository(loaderContext: MangaLoaderContext) : - ChanRepository(MangaSource.HENCHAN, loaderContext) { +class HenChanRepository : ChanRepository() { - override val domain: String = "h-chan.me" + override val defaultDomain = "h-chan.me" + override val source = MangaSource.HENCHAN } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaChanRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaChanRepository.kt index 30984d55f..9091fe922 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaChanRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaChanRepository.kt @@ -1,10 +1,9 @@ package org.koitharu.kotatsu.core.parser.site import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.domain.MangaLoaderContext -class MangaChanRepository(loaderContext: MangaLoaderContext) : - ChanRepository(MangaSource.MANGACHAN, loaderContext) { +class MangaChanRepository : ChanRepository() { - override val domain: String = "manga-chan.me" + override val defaultDomain = "manga-chan.me" + override val source = MangaSource.MANGACHAN } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MintMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MintMangaRepository.kt index 012ed1d27..afd708856 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MintMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MintMangaRepository.kt @@ -1,10 +1,9 @@ package org.koitharu.kotatsu.core.parser.site import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.domain.MangaLoaderContext -class MintMangaRepository(loaderContext: MangaLoaderContext) : - GroupleRepository(MangaSource.MINTMANGA, loaderContext) { +class MintMangaRepository : GroupleRepository() { - override val domain: String = "mintmanga.live" + override val source = MangaSource.MINTMANGA + override val defaultDomain: String = "mintmanga.live" } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt index 09b317e52..bca9851ef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt @@ -1,11 +1,9 @@ package org.koitharu.kotatsu.core.parser.site import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.domain.MangaLoaderContext -class ReadmangaRepository(loaderContext: MangaLoaderContext) : - GroupleRepository(MangaSource.READMANGA_RU, loaderContext) { - - override val domain = "readmanga.me" +class ReadmangaRepository : GroupleRepository() { + override val defaultDomain = "readmanga.me" + override val source = MangaSource.READMANGA_RU } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/SelfMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/SelfMangaRepository.kt index fa63665aa..d02131966 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/SelfMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/SelfMangaRepository.kt @@ -1,10 +1,9 @@ package org.koitharu.kotatsu.core.parser.site import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.domain.MangaLoaderContext -class SelfMangaRepository(loaderContext: MangaLoaderContext) : - GroupleRepository(MangaSource.SELFMANGA, loaderContext) { +class SelfMangaRepository : GroupleRepository() { - override val domain: String = "selfmanga.ru" + override val defaultDomain = "selfmanga.ru" + override val source = MangaSource.SELFMANGA } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/YaoiChanRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/YaoiChanRepository.kt index 9d44ca31c..430832995 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/YaoiChanRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/YaoiChanRepository.kt @@ -1,10 +1,9 @@ package org.koitharu.kotatsu.core.parser.site import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.domain.MangaLoaderContext -class YaoiChanRepository(loaderContext: MangaLoaderContext) : - ChanRepository(MangaSource.YAOICHAN, loaderContext) { +class YaoiChanRepository : ChanRepository() { - override val domain: String = "yaoi-chan.me" + override val source = MangaSource.YAOICHAN + override val defaultDomain = "yaoi-chan.me" } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt new file mode 100644 index 000000000..5987a9d6a --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt @@ -0,0 +1,15 @@ +package org.koitharu.kotatsu.core.prefs + +import android.content.Context +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.model.MangaSource + +class SourceConfig(context: Context, source: MangaSource) { + + private val prefs = context.getSharedPreferences(source.name, Context.MODE_PRIVATE) + + private val keyDomain = context.getString(R.string.key_parser_domain) + + fun getDomain(defaultValue: String) = prefs.getString(keyDomain, defaultValue) ?: defaultValue + +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt b/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt index c92e2401c..e2dc53753 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt @@ -5,14 +5,17 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.koin.core.KoinComponent +import org.koin.core.get import org.koin.core.inject +import org.koitharu.kotatsu.core.model.MangaSource +import org.koitharu.kotatsu.core.prefs.SourceConfig import org.koitharu.kotatsu.utils.ext.await class MangaLoaderContext : KoinComponent { private val okHttp by inject() - suspend fun get(url: String, block: (Request.Builder.() -> Unit)? = null): Response { + suspend fun httpGet(url: String, block: (Request.Builder.() -> Unit)? = null): Response { val request = Request.Builder() .get() .url(url) @@ -22,7 +25,7 @@ class MangaLoaderContext : KoinComponent { return okHttp.newCall(request.build()).await() } - suspend fun post( + suspend fun httpPost( url: String, form: Map, block: (Request.Builder.() -> Unit)? = null @@ -39,4 +42,6 @@ class MangaLoaderContext : KoinComponent { } return okHttp.newCall(request.build()).await() } + + fun getSettings(source: MangaSource) = SourceConfig(get(), source) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt b/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt index 9814e6494..e4272cc5f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.domain import org.koin.core.KoinComponent import org.koin.core.get -import org.koin.core.inject import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.parser.LocalMangaRepository import org.koitharu.kotatsu.core.parser.MangaRepository @@ -10,8 +9,6 @@ import org.koitharu.kotatsu.core.prefs.AppSettings object MangaProviderFactory : KoinComponent { - private val loaderContext by inject() - val sources: List get() { val list = MangaSource.values().toList() - MangaSource.LOCAL @@ -22,10 +19,9 @@ object MangaProviderFactory : KoinComponent { } } - fun createLocal() = LocalMangaRepository(loaderContext) + fun createLocal() = LocalMangaRepository() fun create(source: MangaSource): MangaRepository { - val constructor = source.cls.getConstructor(MangaLoaderContext::class.java) - return constructor.newInstance(loaderContext) + return source.cls.newInstance() } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt index f8d20acb5..3005f4b86 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt @@ -30,6 +30,7 @@ class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetai imageView_cover.load(manga.largeCoverUrl ?: manga.coverUrl) { fallback(R.drawable.ic_placeholder) crossfade(true) + lifecycle(this@MangaDetailsFragment) } textView_title.text = manga.title textView_subtitle.textAndVisible = manga.altTitle diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt index 6d8ccdb3a..58c9944c4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt @@ -5,7 +5,6 @@ import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatDelegate import androidx.collection.arrayMapOf -import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.SeekBarPreference import org.koitharu.kotatsu.R @@ -21,8 +20,6 @@ class AppearanceSettingsFragment : BasePreferenceFragment(R.string.appearance), findPreference(R.string.key_list_mode)?.summary = listModes[settings.listMode]?.let(::getString) - findPreference(R.string.key_theme)?.summaryProvider = - ListPreference.SimpleSummaryProvider.getInstance() findPreference(R.string.key_grid_size)?.run { summary = "%d%%".format(value) setOnPreferenceChangeListener { preference, newValue -> diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SourceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SourceSettingsFragment.kt index f87a51f5a..a3a3c119c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SourceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SourceSettingsFragment.kt @@ -1,18 +1,25 @@ package org.koitharu.kotatsu.ui.settings import android.os.Bundle +import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import org.koin.core.KoinComponent +import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource +import org.koitharu.kotatsu.core.parser.RemoteMangaRepository +import org.koitharu.kotatsu.domain.MangaProviderFactory +import org.koitharu.kotatsu.ui.settings.utils.EditTextSummaryProvider import org.koitharu.kotatsu.utils.ext.withArgs class SourceSettingsFragment : PreferenceFragmentCompat(), KoinComponent { - private lateinit var source: MangaSource + private val source by lazy(LazyThreadSafetyMode.NONE) { + requireArguments().getParcelable(EXTRA_SOURCE)!! + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - source = requireArguments().getParcelable(EXTRA_SOURCE)!! + preferenceManager.sharedPreferencesName = source.name } override fun onResume() { @@ -21,7 +28,15 @@ class SourceSettingsFragment : PreferenceFragmentCompat(), KoinComponent { } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - + val repo = MangaProviderFactory.create(source) as? RemoteMangaRepository ?: return + val keys = repo.onCreatePreferences().map(::getString) + addPreferencesFromResource(R.xml.pref_source) + for (i in 0 until preferenceScreen.preferenceCount) { + val pref = preferenceScreen.getPreference(i) + pref.isVisible = pref.key in keys + } + findPreference(getString(R.string.key_parser_domain))?.summaryProvider = + EditTextSummaryProvider(R.string._default) } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/utils/EditTextSummaryProvider.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/utils/EditTextSummaryProvider.kt new file mode 100644 index 000000000..847c46960 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/utils/EditTextSummaryProvider.kt @@ -0,0 +1,17 @@ +package org.koitharu.kotatsu.ui.settings.utils + +import androidx.annotation.StringRes +import androidx.preference.EditTextPreference +import androidx.preference.Preference + +class EditTextSummaryProvider(@StringRes private val emptySummaryId: Int) : + Preference.SummaryProvider { + + override fun provideSummary(preference: EditTextPreference): CharSequence { + return if (preference.text.isNullOrEmpty()) { + preference.context.getString(emptySummaryId) + } else { + preference.text + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 21837c952..065acbd5e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -100,6 +100,8 @@ Очистить историю поиска История поиска очищена Только жесты - Internal storage - External storage + Внутренний накопитель + Внешнее хранилище + Домен + По умолчанию \ No newline at end of file diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index 25bce7faa..16dd185c8 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -10,6 +10,8 @@ reading_history_clear grid_size reader_switchers + + domain -1 1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0910746b7..8313b024c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -103,4 +103,6 @@ Gestures only Internal storage External storage + Domain + Default \ No newline at end of file diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml index bee6fef8b..481f311f8 100644 --- a/app/src/main/res/xml/pref_appearance.xml +++ b/app/src/main/res/xml/pref_appearance.xml @@ -9,6 +9,7 @@ android:entryValues="@array/values_theme" android:key="@string/key_theme" android:title="@string/theme" + app:useSimpleSummaryProvider="true" app:iconSpaceReserved="false" /> + + + + + \ No newline at end of file