From 55b2eac827b4d393a4394bd776e83dc5ea2508ef Mon Sep 17 00:00:00 2001
From: FlaminSarge <FlaminSarge@users.noreply.github.com>
Date: Sat, 30 Oct 2021 09:29:30 -0700
Subject: [PATCH] [Mangadex] Update originalLanguage pref to use
 MultiSelectListPreference (#9671)

The zh-hk workaround is done during query param building rather than being stored in the preference value
---
 src/all/mangadex/build.gradle                 |   2 +-
 .../extension/all/mangadex/MDConstants.kt     |  22 ++--
 .../extension/all/mangadex/MangaDex.kt        | 105 ++++++------------
 .../extension/all/mangadex/MangaDexFilters.kt |  44 ++++----
 4 files changed, 63 insertions(+), 110 deletions(-)

diff --git a/src/all/mangadex/build.gradle b/src/all/mangadex/build.gradle
index 17705fe5a..72eaa9c46 100644
--- a/src/all/mangadex/build.gradle
+++ b/src/all/mangadex/build.gradle
@@ -6,7 +6,7 @@ ext {
     extName = 'MangaDex'
     pkgNameSuffix = 'all.mangadex'
     extClass = '.MangaDexFactory'
-    extVersionCode = 142
+    extVersionCode = 143
     isNsfw = true
 }
 
diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt
index e5eef94f5..2a41bf63f 100644
--- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt
+++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt
@@ -68,21 +68,13 @@ object MDConstants {
         return "${contentRatingPref}_$dexLang"
     }
 
-    private const val originalLanguageJapanesePref = "originalLanguageJapanese"
+    private const val originalLanguagePref = "originalLanguage"
+    const val originalLanguagePrefValJapanese = "ja"
+    const val originalLanguagePrefValChinese = "zh"
+    const val originalLanguagePrefValChineseHk = "zh-hk"
+    const val originalLanguagePrefValKorean = "ko"
 
-    fun getOriginalLanguageJapanesePref(dexLang: String): String {
-        return "${originalLanguageJapanesePref}_$dexLang"
-    }
-
-    private const val originalLanguageChinesePref = "originalLanguageChinese"
-
-    fun getOriginalLanguageChinesePref(dexLang: String): String {
-        return "${originalLanguageChinesePref}_$dexLang"
-    }
-
-    private const val originalLanguageKoreanPref = "originalLanguageKorean"
-
-    fun getOriginalLanguageKoreanPref(dexLang: String): String {
-        return "${originalLanguageKoreanPref}_$dexLang"
+    fun getOriginalLanguagePrefKey(dexLang: String): String {
+        return "${originalLanguagePref}_$dexLang"
     }
 }
diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt
index b9753223b..943f9dfe2 100644
--- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt
+++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt
@@ -70,28 +70,15 @@ abstract class MangaDex(override val lang: String, val dexLang: String) :
                 MDConstants.getContentRatingPrefKey(dexLang),
                 MDConstants.contentRatingPrefDefaults
             )?.forEach { addQueryParameter("contentRating[]", it) }
-            if (preferences.getBoolean(
-                    MDConstants.getOriginalLanguageJapanesePref(dexLang),
-                    false
-                )
-            ) {
-                addQueryParameter("originalLanguage[]", "ja")
-            }
-            // dex has zh and zh-hk for chinese manhua
-            if (preferences.getBoolean(
-                    MDConstants.getOriginalLanguageChinesePref(dexLang),
-                    false
-                )
-            ) {
-                addQueryParameter("originalLanguage[]", "zh")
-                addQueryParameter("originalLanguage[]", "zh-hk")
-            }
-            if (preferences.getBoolean(
-                    MDConstants.getOriginalLanguageKoreanPref(dexLang),
-                    false
-                )
-            ) {
-                addQueryParameter("originalLanguage[]", "ko")
+            preferences.getStringSet(
+                MDConstants.getOriginalLanguagePrefKey(dexLang),
+                setOf()
+            )?.forEach {
+                addQueryParameter("originalLanguage[]", it)
+                // dex has zh and zh-hk for chinese manhua
+                if (it == MDConstants.originalLanguagePrefValChinese) {
+                    addQueryParameter("originalLanguage[]", MDConstants.originalLanguagePrefValChineseHk)
+                }
             }
         }.build().toUrl().toString()
         return GET(
@@ -124,7 +111,7 @@ abstract class MangaDex(override val lang: String, val dexLang: String) :
         return MangasPage(mangaList, hasMoreResults)
     }
 
-    // LATEST section  API can't sort by date yet so not implemented
+    // LATEST section API can't sort by date yet so not implemented
     override fun latestUpdatesParse(response: Response): MangasPage {
         val chapterListDto = helper.json.decodeFromString<ChapterListDto>(response.body!!.string())
         val hasMoreResults = chapterListDto.limit + chapterListDto.offset < chapterListDto.total
@@ -170,16 +157,15 @@ abstract class MangaDex(override val lang: String, val dexLang: String) :
             addQueryParameter("translatedLanguage[]", dexLang)
             addQueryParameter("order[publishAt]", "desc")
             addQueryParameter("includeFutureUpdates", "0")
-            if (preferences.getBoolean(MDConstants.getOriginalLanguageJapanesePref(dexLang), false)) {
-                addQueryParameter("originalLanguage[]", "ja")
-            }
-            // dex has zh and zh-hk for chinese manhua
-            if (preferences.getBoolean(MDConstants.getOriginalLanguageChinesePref(dexLang), false)) {
-                addQueryParameter("originalLanguage[]", "zh")
-                addQueryParameter("originalLanguage[]", "zh-hk")
-            }
-            if (preferences.getBoolean(MDConstants.getOriginalLanguageKoreanPref(dexLang), false)) {
-                addQueryParameter("originalLanguage[]", "ko")
+            preferences.getStringSet(
+                MDConstants.getOriginalLanguagePrefKey(dexLang),
+                setOf()
+            )?.forEach {
+                addQueryParameter("originalLanguage[]", it)
+                // dex has zh and zh-hk for chinese manhua
+                if (it == MDConstants.originalLanguagePrefValChinese) {
+                    addQueryParameter("originalLanguage[]", MDConstants.originalLanguagePrefValChineseHk)
+                }
             }
             preferences.getStringSet(
                 MDConstants.getContentRatingPrefKey(dexLang),
@@ -489,44 +475,21 @@ abstract class MangaDex(override val lang: String, val dexLang: String) :
             }
         }
 
-        val originalLanguageJapanesePref = SwitchPreferenceCompat(screen.context).apply {
-            key = MDConstants.getOriginalLanguageJapanesePref(dexLang)
-            title = "Japanese"
-            summary = "If enabled, only shows content that was originally published in Japanese in both latest and browse"
-            setDefaultValue(false)
-
+        val originalLanguagePref = MultiSelectListPreference(screen.context).apply {
+            key = MDConstants.getOriginalLanguagePrefKey(dexLang)
+            title = "Filter original languages"
+            summary = "Only show content that was originally published in the selected languages in both latest and browse"
+            entries = arrayOf("Japanese", "Chinese", "Korean")
+            entryValues = arrayOf(
+                MDConstants.originalLanguagePrefValJapanese,
+                MDConstants.originalLanguagePrefValChinese,
+                MDConstants.originalLanguagePrefValKorean
+            )
+            setDefaultValue(setOf<String>())
             setOnPreferenceChangeListener { _, newValue ->
-                val checkValue = newValue as Boolean
+                val checkValue = newValue as Set<String>
                 preferences.edit()
-                    .putBoolean(MDConstants.getOriginalLanguageJapanesePref(dexLang), checkValue)
-                    .commit()
-            }
-        }
-
-        val originalLanguageChinesePref = SwitchPreferenceCompat(screen.context).apply {
-            key = MDConstants.getOriginalLanguageChinesePref(dexLang)
-            title = "Chinese"
-            summary = "If enabled, only shows content that was originally published in Chinese in both latest and browse"
-            setDefaultValue(false)
-
-            setOnPreferenceChangeListener { _, newValue ->
-                val checkValue = newValue as Boolean
-                preferences.edit()
-                    .putBoolean(MDConstants.getOriginalLanguageChinesePref(dexLang), checkValue)
-                    .commit()
-            }
-        }
-
-        val originalLanguageKoreanPref = SwitchPreferenceCompat(screen.context).apply {
-            key = MDConstants.getOriginalLanguageKoreanPref(dexLang)
-            title = "Korean"
-            summary = "If enabled, only shows content that was originally published in Korean in both latest and browse"
-            setDefaultValue(false)
-
-            setOnPreferenceChangeListener { _, newValue ->
-                val checkValue = newValue as Boolean
-                preferences.edit()
-                    .putBoolean(MDConstants.getOriginalLanguageKoreanPref(dexLang), checkValue)
+                    .putStringSet(MDConstants.getOriginalLanguagePrefKey(dexLang), checkValue)
                     .commit()
             }
         }
@@ -535,9 +498,7 @@ abstract class MangaDex(override val lang: String, val dexLang: String) :
         screen.addPreference(dataSaverPref)
         screen.addPreference(standardHttpsPortPref)
         screen.addPreference(contentRatingPref)
-        screen.addPreference(originalLanguageJapanesePref)
-        screen.addPreference(originalLanguageChinesePref)
-        screen.addPreference(originalLanguageKoreanPref)
+        screen.addPreference(originalLanguagePref)
     }
 
     override fun getFilterList(): FilterList =
diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt
index e6b4c1a5d..7a5e7b8da 100644
--- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt
+++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt
@@ -78,26 +78,26 @@ class MangaDexFilters {
     private class OriginalLanguageList(originalLanguage: List<OriginalLanguage>) :
         Filter.Group<OriginalLanguage>("Original language", originalLanguage)
 
-    private fun getOriginalLanguage(preferences: SharedPreferences, dexLang: String) = listOf(
-        OriginalLanguage("Japanese (Manga)", "ja").apply {
-            state = preferences.getBoolean(
-                MDConstants.getOriginalLanguageJapanesePref(dexLang),
-                false
-            )
-        },
-        OriginalLanguage("Chinese (Manhua)", "zh").apply {
-            state = preferences.getBoolean(
-                MDConstants.getOriginalLanguageChinesePref(dexLang),
-                false
-            )
-        },
-        OriginalLanguage("Korean (Manhwa)", "ko").apply {
-            state = preferences.getBoolean(
-                MDConstants.getOriginalLanguageKoreanPref(dexLang),
-                false
-            )
-        },
-    )
+    private fun getOriginalLanguage(preferences: SharedPreferences, dexLang: String): List<OriginalLanguage> {
+        val originalLanguages = preferences.getStringSet(
+            MDConstants.getOriginalLanguagePrefKey(dexLang),
+            setOf()
+        )
+        return listOf(
+            OriginalLanguage("Japanese (Manga)", "ja").apply {
+                state = originalLanguages
+                    ?.contains(MDConstants.originalLanguagePrefValJapanese) ?: false
+            },
+            OriginalLanguage("Chinese (Manhua)", "zh").apply {
+                state = originalLanguages
+                    ?.contains(MDConstants.originalLanguagePrefValChinese) ?: false
+            },
+            OriginalLanguage("Korean (Manhwa)", "ko").apply {
+                state = originalLanguages
+                    ?.contains(MDConstants.originalLanguagePrefValKorean) ?: false
+            },
+        )
+    }
 
     internal class Tag(val id: String, name: String) : Filter.TriState(name)
     private class TagList(tags: List<Tag>) : Filter.Group<Tag>("Tags", tags)
@@ -209,10 +209,10 @@ class MangaDexFilters {
                         filter.state.forEach { lang ->
                             if (lang.state) {
                                 // dex has zh and zh-hk for chinese manhua
-                                if (lang.isoCode == "zh") {
+                                if (lang.isoCode == MDConstants.originalLanguagePrefValChinese) {
                                     addQueryParameter(
                                         "originalLanguage[]",
-                                        "zh-hk"
+                                        MDConstants.originalLanguagePrefValChineseHk
                                     )
                                 }
                                 addQueryParameter(