diff --git a/src/en/mangapark/AndroidManifest.xml b/src/en/mangapark/AndroidManifest.xml
deleted file mode 100644
index 30deb7f79..000000000
--- a/src/en/mangapark/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/en/mangapark/README.md b/src/en/mangapark/README.md
deleted file mode 100644
index 326a6a972..000000000
--- a/src/en/mangapark/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# MangaPark
-
-Table of Content
-- [FAQ](#FAQ)
-
-[Uncomment this if needed; and replace ( and ) with ( and )]: <> (- [Guides](#Guides))
-
-Don't find the question you are look for go check out our general FAQs and Guides over at [Extension FAQ](https://tachiyomi.org/help/faq/#extensions) or [Getting Started](https://tachiyomi.org/help/guides/getting-started/#installation)
-
-## FAQ
-
-### How do I deal with duplicate chapters?
-To solve this issue, follow the below steps.
-
-1. Go to **Browse** → **Extensions**.
-1. Click on **MangaPark** extension and then **Chapter List Source**.
-1. Choose an option like **Smart list** or **Prioritize source**.
-1. Go back to **MangaPark**'s chapter list and refresh it.
-
-[Uncomment this if needed]: <> (## Guides)
\ No newline at end of file
diff --git a/src/en/mangapark/build.gradle b/src/en/mangapark/build.gradle
deleted file mode 100644
index 91d433365..000000000
--- a/src/en/mangapark/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlinx-serialization'
-
-ext {
- extName = 'MangaPark'
- pkgNameSuffix = 'en.mangapark'
- extClass = '.MangaPark'
- extVersionCode = 23
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/en/mangapark/res/mipmap-hdpi/ic_launcher.png b/src/en/mangapark/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 74307452b..000000000
Binary files a/src/en/mangapark/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangapark/res/mipmap-mdpi/ic_launcher.png b/src/en/mangapark/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 317550192..000000000
Binary files a/src/en/mangapark/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangapark/res/mipmap-xhdpi/ic_launcher.png b/src/en/mangapark/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 8e63f732a..000000000
Binary files a/src/en/mangapark/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangapark/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangapark/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 934da61ca..000000000
Binary files a/src/en/mangapark/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangapark/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangapark/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index dfbb1479a..000000000
Binary files a/src/en/mangapark/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangapark/res/web_hi_res_512.png b/src/en/mangapark/res/web_hi_res_512.png
deleted file mode 100644
index eb894066e..000000000
Binary files a/src/en/mangapark/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt b/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt
deleted file mode 100644
index eb23ee261..000000000
--- a/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt
+++ /dev/null
@@ -1,614 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangapark
-
-import android.annotation.SuppressLint
-import android.app.Application
-import android.content.SharedPreferences
-import android.net.Uri
-import eu.kanade.tachiyomi.network.GET
-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.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.ParsedHttpSource
-import eu.kanade.tachiyomi.util.asJsoup
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonObject
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.CacheControl
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.get
-import uy.kohesive.injekt.injectLazy
-import java.text.SimpleDateFormat
-import java.util.Calendar
-import java.util.Locale
-
-class MangaPark : ConfigurableSource, ParsedHttpSource() {
-
- override val lang = "en"
-
- override val client = network.cloudflareClient
-
- override val supportsLatest = true
- override val name = "MangaPark"
- override val baseUrl = "https://v2.mangapark.net"
-
- private val nextPageSelector = ".paging:not(.order) > li:last-child > a"
- private val json: Json by injectLazy()
- private val dateFormat = SimpleDateFormat("MMM d, yyyy, HH:mm a", Locale.ENGLISH)
- private val dateFormatTimeOnly = SimpleDateFormat("HH:mm a", Locale.ENGLISH)
-
- override fun popularMangaRequest(page: Int) = GET("$baseUrl/search?orderby=views_a&page=$page")
-
- override fun popularMangaSelector() = searchMangaSelector()
-
- override fun popularMangaFromElement(element: Element) = mangaFromElement(element)
-
- override fun popularMangaNextPageSelector() = nextPageSelector
-
- override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/latest" + if (page > 1) "/$page" else "")
-
- override fun latestUpdatesSelector() = ".ls1 .item"
-
- override fun latestUpdatesFromElement(element: Element) = mangaFromElement(element)
-
- override fun latestUpdatesNextPageSelector() = nextPageSelector
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val uri = Uri.parse("$baseUrl/search").buildUpon()
- if (query.isNotEmpty()) {
- uri.appendQueryParameter("q", query)
- }
- filters.forEach {
- if (it is UriFilter) {
- it.addToUri(uri)
- }
- }
- if (page != 1) {
- uri.appendQueryParameter("page", page.toString())
- }
- return GET(uri.toString())
- }
-
- override fun searchMangaSelector() = ".item"
-
- override fun searchMangaFromElement(element: Element) = mangaFromElement(element)
-
- override fun searchMangaNextPageSelector() = nextPageSelector
-
- private fun mangaFromElement(element: Element) = SManga.create().apply {
- val coverElement = element.getElementsByClass("cover").first()!!
- url = coverElement.attr("href")
- title = coverElement.attr("title")
- thumbnail_url = coverElement.select("img").attr("abs:src")
- }
-
- @SuppressLint("DefaultLocale")
- override fun mangaDetailsParse(document: Document) = SManga.create().apply {
- document.select(".cover > img").first()!!.let { coverElement ->
- title = coverElement.attr("title")
- thumbnail_url = coverElement.attr("abs:src")
- }
-
- document.select(".attr > tbody > tr").forEach {
- when (it.getElementsByTag("th").first()!!.text().trim().lowercase()) {
- "author(s)" -> {
- author = it.getElementsByTag("a").joinToString(transform = Element::text)
- }
- "artist(s)" -> {
- artist = it.getElementsByTag("a").joinToString(transform = Element::text)
- }
- "genre(s)" -> {
- genre = it.getElementsByTag("a").joinToString(transform = Element::text)
- }
- "status" -> {
- status = when (it.getElementsByTag("td").text().trim().lowercase()) {
- "ongoing" -> SManga.ONGOING
- "completed" -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
- }
- }
- }
-
- description = document.getElementsByClass("summary").text().trim()
-
- // add alternative name to manga description
- val altName = "Alternative Name: "
- document.select(".attr > tbody > tr:contains(Alter) td").firstOrNull()?.ownText()?.let {
- if (it.isBlank().not()) {
- description = when {
- description.isNullOrBlank() -> altName + it
- else -> description + "\n\n$altName" + it
- }
- }
- }
- }
-
- // force network to make sure chapter prefs take effect
- override fun chapterListRequest(manga: SManga): Request {
- return GET(baseUrl + manga.url, headers, CacheControl.FORCE_NETWORK)
- }
-
- override fun chapterListParse(response: Response): List {
- fun List.getMissingChapters(allChapters: List): List {
- val chapterNums = this.map { it.chapter_number }
- return allChapters.filter { it.chapter_number !in chapterNums }.distinctBy { it.chapter_number }
- }
-
- fun List.filterOrAll(source: String): List {
- val chapters = this.filter { it.scanlator!!.contains(source) }
- return if (chapters.isNotEmpty()) {
- (chapters + chapters.getMissingChapters(this)).sortedByDescending { it.chapter_number }
- } else {
- this
- }
- }
-
- val mangaBySource = response.asJsoup().select("div[id^=stream]")
- .map { sourceElement ->
- var lastNum = 0F
- val sourceName = sourceElement.select("i + span").text()
-
- sourceElement.select(chapterListSelector())
- .reversed() // so incrementing lastNum works
- .map { chapterElement ->
- chapterFromElement(chapterElement, sourceName, lastNum)
- .also { lastNum = it.chapter_number }
- }
- .distinctBy { it.chapter_number } // there's even duplicate chapters within a source ( -.- )
- }
-
- return when (getSourcePref()) {
- // source with most chapters along with chapters that source doesn't have
- "most" -> {
- val chapters = mangaBySource.maxByOrNull { it.count() }!!
- (chapters + chapters.getMissingChapters(mangaBySource.flatten())).sortedByDescending { it.chapter_number }
- }
- // "smart list" - try not to miss a chapter and avoid dupes
- "smart" -> mangaBySource.flatten().distinctBy { it.chapter_number }.sortedByDescending { it.chapter_number }
- // use a specific source + any missing chapters, display all if none available from that source
- "rock" -> mangaBySource.flatten().filterOrAll("Rock")
- "duck" -> mangaBySource.flatten().filterOrAll("Duck")
- "mini" -> mangaBySource.flatten().filterOrAll("Mini")
- "fox" -> mangaBySource.flatten().filterOrAll("Fox")
- "panda" -> mangaBySource.flatten().filterOrAll("Panda")
- // all sources, all chapters
- else -> mangaBySource.flatMap { it.reversed() }
- }
- }
-
- override fun chapterListSelector() = ".volume .chapter li"
-
- private val chapterNumberRegex = Regex("""\b\d+\.?\d?\b""")
-
- private fun chapterFromElement(element: Element, source: String, lastNum: Float): SChapter {
- fun Float.incremented() = this + .00001F
- fun Float?.orIncrementLastNum() = if (this == null || this < lastNum) lastNum.incremented() else this
-
- return SChapter.create().apply {
- element.select(".tit > a").first()!!.let {
- url = it.attr("href").removeSuffix("1")
- name = it.text()
- }
- // Get the chapter number or create a unique one if it's not available
- chapter_number = chapterNumberRegex.findAll(name)
- .toList()
- .map { it.value.toFloatOrNull() }
- .let { nums ->
- when {
- nums.count() == 1 -> nums[0].orIncrementLastNum()
- nums.count() >= 2 -> nums[1].orIncrementLastNum()
- else -> lastNum.incremented()
- }
- }
- date_upload = parseDate(element.select(".time").first()!!.text().trim())
- scanlator = source
- }
- }
-
- override fun chapterFromElement(element: Element): SChapter = throw UnsupportedOperationException("Not used")
-
- @SuppressLint("DefaultLocale")
- private fun parseDate(date: String): Long {
- val lcDate = date.lowercase()
- if (lcDate.endsWith("ago")) return parseRelativeDate(lcDate)
-
- // Handle 'yesterday' and 'today'
- var relativeDate: Calendar? = null
- if (lcDate.startsWith("yesterday")) {
- relativeDate = Calendar.getInstance()
- relativeDate.add(Calendar.DAY_OF_MONTH, -1) // yesterday
- } else if (lcDate.startsWith("today")) {
- relativeDate = Calendar.getInstance()
- }
-
- relativeDate?.let {
- // Since the date is not specified, it defaults to 1970!
- val time = dateFormatTimeOnly.parse(lcDate.substringAfter(' ')) ?: return 0
- val cal = Calendar.getInstance()
- cal.time = time
-
- // Copy time to relative date
- it.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY))
- it.set(Calendar.MINUTE, cal.get(Calendar.MINUTE))
- return it.timeInMillis
- }
-
- return dateFormat.parse(lcDate)?.time ?: 0
- }
-
- /**
- * Parses dates in this form:
- * `11 days ago`
- */
- private fun parseRelativeDate(date: String): Long {
- val trimmedDate = date.split(" ")
-
- if (trimmedDate[2] != "ago") return 0
-
- val number = when (trimmedDate[0]) {
- "a" -> 1
- else -> trimmedDate[0].toIntOrNull() ?: return 0
- }
- val unit = trimmedDate[1].removeSuffix("s") // Remove 's' suffix
-
- val now = Calendar.getInstance()
-
- // Map English unit to Java unit
- val javaUnit = when (unit) {
- "year" -> Calendar.YEAR
- "month" -> Calendar.MONTH
- "week" -> Calendar.WEEK_OF_MONTH
- "day" -> Calendar.DAY_OF_MONTH
- "hour" -> Calendar.HOUR
- "minute" -> Calendar.MINUTE
- "second" -> Calendar.SECOND
- else -> return 0
- }
-
- now.add(javaUnit, -number)
-
- return now.timeInMillis
- }
-
- private val objRegex = Regex("""var _load_pages = (\[.*])""")
-
- override fun pageListParse(response: Response): List {
- val obj = objRegex.find(response.body.string())?.groupValues?.get(1)
- ?: throw Exception("_load_pages not found - ${response.request.url}")
-
- return json.parseToJsonElement(obj).jsonArray.mapIndexed { i, it ->
- val url = it.jsonObject["u"]!!.jsonPrimitive.content
- Page(i, imageUrl = if (url.startsWith("//")) "https://$url" else url)
- }
- }
-
- override fun pageListParse(document: Document): List = throw UnsupportedOperationException("Not used")
-
- // Unused, we can get image urls directly from the chapter page
- override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("Not used")
-
- override fun getFilterList() = FilterList(
- AuthorArtistText(),
- SearchTypeFilter("Title query", "name-match"),
- SearchTypeFilter("Author/Artist query", "autart-match"),
- SortFilter(),
- GenreGroup(),
- GenreInclusionFilter(),
- ChapterCountFilter(),
- StatusFilter(),
- RatingFilter(),
- TypeFilter(),
- YearFilter(),
- )
-
- private class SearchTypeFilter(name: String, val uriParam: String) :
- Filter.Select(name, STATE_MAP), UriFilter {
- override fun addToUri(uri: Uri.Builder) {
- if (STATE_MAP[state] != "contain") {
- uri.appendQueryParameter(uriParam, STATE_MAP[state])
- }
- }
-
- companion object {
- private val STATE_MAP = arrayOf("contain", "begin", "end")
- }
- }
-
- private class AuthorArtistText : Filter.Text("Author/Artist"), UriFilter {
- override fun addToUri(uri: Uri.Builder) {
- if (state.isNotEmpty()) {
- uri.appendQueryParameter("autart", state)
- }
- }
- }
-
- private class GenreFilter(val uriParam: String, displayName: String) : Filter.TriState(displayName)
-
- private class GenreGroup :
- Filter.Group(
- "Genres",
- listOf(
- GenreFilter("4-koma", "4 koma"),
- GenreFilter("action", "Action"),
- GenreFilter("adaptation", "Adaptation"),
- GenreFilter("adult", "Adult"),
- GenreFilter("adventure", "Adventure"),
- GenreFilter("aliens", "Aliens"),
- GenreFilter("animals", "Animals"),
- GenreFilter("anthology", "Anthology"),
- GenreFilter("award-winning", "Award winning"),
- GenreFilter("comedy", "Comedy"),
- GenreFilter("cooking", "Cooking"),
- GenreFilter("crime", "Crime"),
- GenreFilter("crossdressing", "Crossdressing"),
- GenreFilter("delinquents", "Delinquents"),
- GenreFilter("demons", "Demons"),
- GenreFilter("doujinshi", "Doujinshi"),
- GenreFilter("drama", "Drama"),
- GenreFilter("ecchi", "Ecchi"),
- GenreFilter("fan-colored", "Fan colored"),
- GenreFilter("fantasy", "Fantasy"),
- GenreFilter("food", "Food"),
- GenreFilter("full-color", "Full color"),
- GenreFilter("game", "Game"),
- GenreFilter("gender-bender", "Gender bender"),
- GenreFilter("genderswap", "Genderswap"),
- GenreFilter("ghosts", "Ghosts"),
- GenreFilter("gore", "Gore"),
- GenreFilter("gossip", "Gossip"),
- GenreFilter("gyaru", "Gyaru"),
- GenreFilter("harem", "Harem"),
- GenreFilter("historical", "Historical"),
- GenreFilter("horror", "Horror"),
- GenreFilter("incest", "Incest"),
- GenreFilter("isekai", "Isekai"),
- GenreFilter("josei", "Josei"),
- GenreFilter("kids", "Kids"),
- GenreFilter("loli", "Loli"),
- GenreFilter("lolicon", "Lolicon"),
- GenreFilter("long-strip", "Long strip"),
- GenreFilter("mafia", "Mafia"),
- GenreFilter("magic", "Magic"),
- GenreFilter("magical-girls", "Magical girls"),
- GenreFilter("manhwa", "Manhwa"),
- GenreFilter("martial-arts", "Martial arts"),
- GenreFilter("mature", "Mature"),
- GenreFilter("mecha", "Mecha"),
- GenreFilter("medical", "Medical"),
- GenreFilter("military", "Military"),
- GenreFilter("monster-girls", "Monster girls"),
- GenreFilter("monsters", "Monsters"),
- GenreFilter("music", "Music"),
- GenreFilter("mystery", "Mystery"),
- GenreFilter("ninja", "Ninja"),
- GenreFilter("office-workers", "Office workers"),
- GenreFilter("official-colored", "Official colored"),
- GenreFilter("one-shot", "One shot"),
- GenreFilter("parody", "Parody"),
- GenreFilter("philosophical", "Philosophical"),
- GenreFilter("police", "Police"),
- GenreFilter("post-apocalyptic", "Post apocalyptic"),
- GenreFilter("psychological", "Psychological"),
- GenreFilter("reincarnation", "Reincarnation"),
- GenreFilter("reverse-harem", "Reverse harem"),
- GenreFilter("romance", "Romance"),
- GenreFilter("samurai", "Samurai"),
- GenreFilter("school-life", "School life"),
- GenreFilter("sci-fi", "Sci fi"),
- GenreFilter("seinen", "Seinen"),
- GenreFilter("shota", "Shota"),
- GenreFilter("shotacon", "Shotacon"),
- GenreFilter("shoujo", "Shoujo"),
- GenreFilter("shoujo-ai", "Shoujo ai"),
- GenreFilter("shounen", "Shounen"),
- GenreFilter("shounen-ai", "Shounen ai"),
- GenreFilter("slice-of-life", "Slice of life"),
- GenreFilter("smut", "Smut"),
- GenreFilter("space", "Space"),
- GenreFilter("sports", "Sports"),
- GenreFilter("super-power", "Super power"),
- GenreFilter("superhero", "Superhero"),
- GenreFilter("supernatural", "Supernatural"),
- GenreFilter("survival", "Survival"),
- GenreFilter("suspense", "Suspense"),
- GenreFilter("thriller", "Thriller"),
- GenreFilter("time-travel", "Time travel"),
- GenreFilter("toomics", "Toomics"),
- GenreFilter("traditional-games", "Traditional games"),
- GenreFilter("tragedy", "Tragedy"),
- GenreFilter("user-created", "User created"),
- GenreFilter("vampire", "Vampire"),
- GenreFilter("vampires", "Vampires"),
- GenreFilter("video-games", "Video games"),
- GenreFilter("virtual-reality", "Virtual reality"),
- GenreFilter("web-comic", "Web comic"),
- GenreFilter("webtoon", "Webtoon"),
- GenreFilter("wuxia", "Wuxia"),
- GenreFilter("yaoi", "Yaoi"),
- GenreFilter("yuri", "Yuri"),
- GenreFilter("zombies", "Zombies"),
- ),
- ),
- UriFilter {
- override fun addToUri(uri: Uri.Builder) {
- val genresParameterValue = state.filter { it.isIncluded() }.joinToString(",") { it.uriParam }
- if (genresParameterValue.isNotEmpty()) {
- uri.appendQueryParameter("genres", genresParameterValue)
- }
-
- val genresExcludeParameterValue = state.filter { it.isExcluded() }.joinToString(",") { it.uriParam }
- if (genresExcludeParameterValue.isNotEmpty()) {
- uri.appendQueryParameter("genres-exclude", genresExcludeParameterValue)
- }
- }
- }
-
- private class GenreInclusionFilter : UriSelectFilter(
- "Genre inclusion",
- "genres-mode",
- arrayOf(
- Pair("and", "And mode"),
- Pair("or", "Or mode"),
- ),
- )
-
- private class ChapterCountFilter : UriSelectFilter(
- "Chapter count",
- "chapters",
- arrayOf(
- Pair("any", "Any"),
- Pair("1", "1 +"),
- Pair("5", "5 +"),
- Pair("10", "10 +"),
- Pair("20", "20 +"),
- Pair("30", "30 +"),
- Pair("40", "40 +"),
- Pair("50", "50 +"),
- Pair("100", "100 +"),
- Pair("150", "150 +"),
- Pair("200", "200 +"),
- ),
- )
-
- private class StatusFilter : UriSelectFilter(
- "Status",
- "status",
- arrayOf(
- Pair("any", "Any"),
- Pair("completed", "Completed"),
- Pair("ongoing", "Ongoing"),
- ),
- )
-
- private class RatingFilter : UriSelectFilter(
- "Rating",
- "rating",
- arrayOf(
- Pair("any", "Any"),
- Pair("5", "5 stars"),
- Pair("4", "4 stars"),
- Pair("3", "3 stars"),
- Pair("2", "2 stars"),
- Pair("1", "1 star"),
- Pair("0", "0 stars"),
- ),
- )
-
- private class TypeFilter : UriSelectFilter(
- "Type",
- "types",
- arrayOf(
- Pair("any", "Any"),
- Pair("manga", "Japanese Manga"),
- Pair("manhwa", "Korean Manhwa"),
- Pair("manhua", "Chinese Manhua"),
- Pair("unknown", "Unknown"),
- ),
- )
-
- private class YearFilter : UriSelectFilter(
- "Release year",
- "years",
- arrayOf(
- Pair("any", "Any"),
- // Get all years between today and 1946
- *(Calendar.getInstance().get(Calendar.YEAR) downTo 1946).map {
- Pair(it.toString(), it.toString())
- }.toTypedArray(),
- ),
- )
-
- private class SortFilter : UriSelectFilter(
- "Sort",
- "orderby",
- arrayOf(
- Pair("a-z", "A-Z"),
- Pair("views_a", "Views all-time"),
- Pair("views_y", "Views last 365 days"),
- Pair("views_s", "Views last 180 days"),
- Pair("views_t", "Views last 90 days"),
- Pair("rating", "Rating"),
- Pair("update", "Latest"),
- Pair("create", "New manga"),
- ),
- firstIsUnspecified = false,
- defaultValue = 1,
- )
-
- /**
- * Class that creates a select filter. Each entry in the dropdown has a name and a display name.
- * If an entry is selected it is appended as a query parameter onto the end of the URI.
- * If `firstIsUnspecified` is set to true, if the first entry is selected, nothing will be appended on the the URI.
- */
- // vals:
- private open class UriSelectFilter(
- displayName: String,
- val uriParam: String,
- val vals: Array>,
- val firstIsUnspecified: Boolean = true,
- defaultValue: Int = 0,
- ) :
- Filter.Select(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter {
- override fun addToUri(uri: Uri.Builder) {
- if (state != 0 || !firstIsUnspecified) {
- uri.appendQueryParameter(uriParam, vals[state].first)
- }
- }
- }
-
- /**
- * Represents a filter that is able to modify a URI.
- */
- private interface UriFilter {
- fun addToUri(uri: Uri.Builder)
- }
-
- // Preferences
-
- private val preferences: SharedPreferences by lazy {
- Injekt.get().getSharedPreferences("source_$id", 0x0000)
- }
-
- override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
- val myPref = androidx.preference.ListPreference(screen.context).apply {
- key = SOURCE_PREF_TITLE
- title = SOURCE_PREF_TITLE
- entries = sourceArray.map { it.first }.toTypedArray()
- entryValues = sourceArray.map { it.second }.toTypedArray()
- summary = "%s"
-
- setOnPreferenceChangeListener { _, newValue ->
- val selected = newValue as String
- val index = this.findIndexOfValue(selected)
- val entry = entryValues[index] as String
- preferences.edit().putString(SOURCE_PREF, entry).commit()
- }
- }
- screen.addPreference(myPref)
- }
-
- private fun getSourcePref(): String? = preferences.getString(SOURCE_PREF, "all")
-
- companion object {
- private const val SOURCE_PREF_TITLE = "Chapter List Source"
- private const val SOURCE_PREF = "Manga_Park_Source"
- private val sourceArray = arrayOf(
- Pair("All sources, all chapters", "all"),
- Pair("Source with most chapters", "most"),
- Pair("Smart list", "smart"),
- Pair("Prioritize source: Rock", "rock"),
- Pair("Prioritize source: Duck", "duck"),
- Pair("Prioritize source: Mini", "mini"),
- Pair("Prioritize source: Fox", "fox"),
- Pair("Prioritize source: Panda", "panda"),
- )
- }
-}