diff --git a/src/en/readmanhwa/build.gradle b/src/en/readmanhwa/build.gradle index 54ea13dc4..82ac57a25 100644 --- a/src/en/readmanhwa/build.gradle +++ b/src/en/readmanhwa/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'ReadManhwa' pkgNameSuffix = 'en.readmanhwa' extClass = '.ReadManhwa' - extVersionCode = 5 + extVersionCode = 6 libVersion = '1.2' } diff --git a/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt b/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt index 3aa5e1125..f3bf659ee 100644 --- a/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt +++ b/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt @@ -1,5 +1,9 @@ package eu.kanade.tachiyomi.extension.en.readmanhwa +import android.app.Application +import android.content.SharedPreferences +import android.support.v7.preference.CheckBoxPreference +import android.support.v7.preference.PreferenceScreen import com.github.salomonbrys.kotson.fromJson import com.github.salomonbrys.kotson.get import com.github.salomonbrys.kotson.int @@ -10,6 +14,7 @@ import com.google.gson.JsonArray import com.google.gson.JsonObject import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -26,8 +31,10 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import rx.Observable +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get -class ReadManhwa : HttpSource() { +class ReadManhwa : ConfigurableSource, HttpSource() { override val name = "ReadManhwa" @@ -43,6 +50,10 @@ class ReadManhwa : HttpSource() { .add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") .add("X-NSFW", enableNsfw.toString()) + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + override val client: OkHttpClient = network.cloudflareClient private val gson = Gson() @@ -60,11 +71,15 @@ class ReadManhwa : HttpSource() { return MangasPage(mangas, jsonObject["current_page"].int < jsonObject["last_page"].int) } + private fun getMangaUrl(url: String): String { + return HttpUrl.parse(url)!!.newBuilder() + .setQueryParameter("nsfw", isNSFWEnabledInPref().toString()).toString() + } // Popular override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/api/comics?page=$page&q=&sort=popularity&order=desc&duration=week", headers) + return GET(getMangaUrl("$baseUrl/api/comics?page=$page&q=&sort=popularity&order=desc&duration=week"), headers) } override fun popularMangaParse(response: Response): MangasPage = parseMangaFromJson(response) @@ -72,7 +87,7 @@ class ReadManhwa : HttpSource() { // Latest override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/api/comics?page=$page&q=&sort=uploaded_at&order=desc&duration=day", headers) + return GET(getMangaUrl("$baseUrl/api/comics?page=$page&q=&sort=uploaded_at&order=desc&duration=day"), headers) } override fun latestUpdatesParse(response: Response): MangasPage = parseMangaFromJson(response) @@ -87,6 +102,7 @@ class ReadManhwa : HttpSource() { .addQueryParameter("page", page.toString()) .addQueryParameter("order", "desc") .addQueryParameter("q", query) + .addQueryParameter("nsfw", enableNsfw.toString()) filters.forEach { filter -> when (filter) { @@ -108,10 +124,10 @@ class ReadManhwa : HttpSource() { .map { mangaDetailsParse(it).apply { initialized = true } } // Return the real URL for "Open in browser" - override fun mangaDetailsRequest(manga: SManga) = GET("$baseUrl/en/webtoon/${manga.url}", headers) + override fun mangaDetailsRequest(manga: SManga) = GET(getMangaUrl("$baseUrl/en/webtoon/${manga.url}"), headers) private fun apiMangaDetailsRequest(manga: SManga): Request { - return GET("$baseUrl/api/comics/${manga.url}", headers) + return GET(getMangaUrl("$baseUrl/api/comics/${manga.url}"), headers) } override fun mangaDetailsParse(response: Response): SManga { @@ -145,7 +161,7 @@ class ReadManhwa : HttpSource() { } override fun chapterListRequest(manga: SManga): Request { - return GET("$baseUrl/api/comics/${manga.url}/chapters", headers) + return GET(getMangaUrl("$baseUrl/api/comics/${manga.url}/chapters"), headers) } private fun chapterListParse(response: Response, titleSlug: String): List { @@ -177,7 +193,7 @@ class ReadManhwa : HttpSource() { // Pages override fun pageListRequest(chapter: SChapter): Request { - return GET("$baseUrl/api/comics/${chapter.url}/images", headers) + return GET(getMangaUrl("$baseUrl/api/comics/${chapter.url}/images"), headers) } override fun pageListParse(response: Response): List { @@ -191,7 +207,7 @@ class ReadManhwa : HttpSource() { // Filters override fun getFilterList() = FilterList( - NSFWFilter(), + NSFWFilter().apply { state = isNSFWEnabledInPref() }, GenreFilter(getGenreList()), DurationFilter(getDurationList()), SortFilter(getSortList()) @@ -279,4 +295,42 @@ class ReadManhwa : HttpSource() { Pair("Popularity", "popularity"), Pair("Date", "uploaded_at") ) + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val nsfw = CheckBoxPreference(screen.context).apply { + key = NSFW + title = NSFW_TITLE + setDefaultValue(NSFW_DEFAULT) + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as Boolean + preferences.edit().putBoolean(NSFW, selected).commit() + } + } + screen.addPreference(nsfw) + } + + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + val nsfw = androidx.preference.CheckBoxPreference(screen.context).apply { + key = NSFW + title = NSFW_TITLE + setDefaultValue(NSFW_DEFAULT) + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as Boolean + preferences.edit().putBoolean(NSFW, selected).commit() + } + } + screen.addPreference(nsfw) + } + + private fun isNSFWEnabledInPref(): Boolean { + return preferences.getBoolean(NSFW, NSFW_DEFAULT) + } + + companion object { + private const val NSFW = "NSFW" + private const val NSFW_TITLE = "Show NSFW" + private const val NSFW_DEFAULT = true + } }