From 5d2395b569f81c6b267534dfd5c2bb549a423534 Mon Sep 17 00:00:00 2001 From: InfinityDouki56 Date: Wed, 22 Feb 2023 08:40:26 +0100 Subject: [PATCH 1/6] Translated using Weblate (Filipino) Currently translated at 92.4% (392 of 424 strings) Translated using Weblate (Filipino) Currently translated at 100.0% (8 of 8 strings) Co-authored-by: InfinityDouki56 Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/fil/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/ Translation: Kotatsu/Strings Translation: Kotatsu/plurals --- app/src/main/res/values-fil/plurals.xml | 18 +-- app/src/main/res/values-fil/strings.xml | 182 +++++++++++++++++++++++- 2 files changed, 184 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-fil/plurals.xml b/app/src/main/res/values-fil/plurals.xml index 64bc20070..b7a6d36c8 100644 --- a/app/src/main/res/values-fil/plurals.xml +++ b/app/src/main/res/values-fil/plurals.xml @@ -1,12 +1,12 @@ - %1$d (na) aytem - %1$d (na mga) aytem + %1$d aytem + %1$d (na) aytem - Kabuuang %1$d (na) pahina - Kabuuang %1$d (na) mga pahina + "Kabuuang %1$d pahina" + Kabuuang %1$d (na) pahina %1$d minutong nakakalipas @@ -14,15 +14,15 @@ %1$d bagong kabanata - %1$d bagong (mga) kabanata + %1$d mga bagong kabanata - %1$d (na) kabanata - %1$d (na mga) kabanata + "%1$d kabanata" + %1$d (na) kabanata - %1$d (na) kabanata mula sa %2$d - %1$d (na) mga kabanata mula sa %2$d + %1$d kabanata mula sa %2$d + %1$d (na) kabanata mula sa %2$d %1$d oras ang nakalipas diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index c34ef549f..4f2580543 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -8,7 +8,7 @@ Tema Madilim Sundan ang sistema - May naganap na error + May nangyaring error Error sa network Mga detalye Mga kabanata @@ -49,8 +49,8 @@ Subukang i-reformulate ang query. Ang iyong nabasa ay ipapakita dito Ang iyong manga ay ipapakita dito - Mag-save muna - I save ito mula sa mga online na mapagkukunan o mag import ng mga file. + Mag-save muna ng isang bagay + I-save ito mula sa mga online na source o mag import ng mga file. Istante Animasyon ng pahina Hindi magagamit @@ -137,7 +137,7 @@ Detalyadong listahan Grid Mga setting - Mga remote na mapagkukunan + Mga remote na source Naglo-load… Isara Walang nahanap @@ -169,7 +169,7 @@ I-clear ang mga cookie I-clear ang page cache I-save - Ipakita ang notification kung may available na bagong bersyon + Ipakita ang abiso kung may available na bagong bersyon I-download Mga setting ng abiso Tunog ng abiso @@ -214,7 +214,7 @@ Ang ilang device ay may iba\'t ibang gawi ng system, na maaaring masira ang mga gawain sa background. Nakapila na I-download o basahin ang nawawalang kabanata online. - Mala-log out ka mula sa lahat ng mapagkukunan + Mala-log out ka mula sa lahat ng source Tapos na Alisin ang lahat ng kamakailang query sa paghahanap nang permanente\? Pagsasalin @@ -237,7 +237,175 @@ Nagco-compute… Kabanata %1$d ng %2$d Subukan ulit - Pagkakasunud-sunod ng pag-uuri + Pag-aayos ng order I-clear Natanggal ang \"%s\" sa kasaysayan + Mga taps ng gilid + Mga ginamit na source + Magagamit na mga source + Lagi na lang + I-preload ang mga pahina + Naka-log in bilang %s + Iba\'t ibang wika + Maghanap ng kabanata + %1$s%% + Hitsura + Hindi isali ang mga genre + Tukuyin ang mga genre na hindi mo nais na makita sa mga mungkahi + Nakumpleto na ang pagtanggal + Tumutulong na maiwasan ang pag-block ng iyong IP address + Naka-save na pagproseso ng manga + Mayroon nang account + Bumalik + Pag-synchronize + Ilagay ang iyong email upang magpatuloy + Itago + May mga bagong source ng manga + Hindi ka makakatanggap ng mga abiso ngunit ang mga bagong kabanata ay iha-highlight sa mga listahan + Paganahin ang mga abiso + Ayusin ang kategorya + Tina-track + Walang mga paboritong kategorya + Mag-log out + Magdagdag ng bookmark + Tinanggal ang bookmark + Inalis sa kasaysayan + DNS sa HTTPS + Default na mode + Automatikong matukoy ang reader mode + May nangyaring mali. Mangyaring magsumite ng isang bug report sa mga developer upang matulungan kaming ayusin ito. + Ipadala + Muling pagbabasa + Binitawan + Manga mula sa iyong mga paborito + Ang iyong kamakailang nabasa na manga + Pagtanggal ng data + Ipakita ang porsyento na nabasa sa kasaysayan at mga paborito + Ipakita lahat + Pumili ng saklaw + I-clear ang lahat ng kasaysayan + Maaari kang lumikha ng bookmark habang nagbabasa ng manga + Tinanggal ang mga bookmark + Random + Walang mga source ng manga + Paganahin ang mga source ng manga upang basahin ang manga online + Ayusin muli + Walang laman + Changelog + Pindutin muli ang Bumalik upang lumabas + Pindutin ang Bumalik nang dalawang beses upang lumabas sa app + Pagkumpirma ng paglabas + Na-save na manga + Mag-Explore + Iba pang cache + Paggamit ng storage + Magagamit na + %s - %s + Inalis sa mga paborito + Inalis mula sa \"%s\" + Mga pagpipilian + Nagda-download ng manga + Incognito mode + Magagamit ang pag update ng application: %s + Walang mga kabanata + Awtomatikong pag-scroll + Ch. %1$d/%2$d Pg. %3$d/%4$d + Ipakita ang information bar sa pagbasa + Archive ng mga comics + Folder na may mga larawan + Nakumpleto na ang pag-import + Magsisimula na ang pag-import + Feed + Gawing magagamit ang kamakailang manga sa pamamagitan ng mahabang pagpindot sa icon ng application + Ipakita ang mga kamakailang manga shortcut + Ergonomic na kontrol sa mambabasa + Pagwawasto ng kulay + Liwanag + Kaibahan + I-save o kalimutan ang mga hindi na-save na pagbabago\? + Kalimutan + Walang natitirang espasyo sa device + Pag-zoom sa webtoon + Iba\'t ibang wika + Server side error (%1$d). Subukang muli mamaya + I-clear din ang impormasyon tungkol sa mga bagong kabanata + Preloading ng nilalaman + Markahan bilang kasalukuyan + Wika + Ibahagi ang mga log + Magpakita ng kahina-hinalang nilalaman + Dynamic + Ipakita sa grid view + Asuka + Mion + Rikka + Sakura + Mamimi + Kanade + Wala naman dito + Mga serbisyo + Payagan ang mga hindi stable na update + Ipakita ang mga tagapagpahiwatig ng progress ng pagbabasa + Manga na minarkahan bilang NSFW ay hindi kailanman idadagdag sa kasaysayan at ang iyong progress ay hindi mase-save + Maaaring makatulong sa kaso ng ilang mga isyu. Ang lahat ng pahintulot ay mawawalan ng bisa + Imbalidong domain + Huling 2 oras + Nabura ang kasaysayan + Pamahalaan + Wala pang bookmark + 18+ + Hindi natagpuan o inalis ang nilalaman + Magtala ng ilang pagkilos para sa mga layunin ng pag-debug + Permanenteng tanggalin ang mga napiling item sa device\? + Walang mga kabanata sa manga na ito + Nag-a-update ang mga mungkahi + Nilalaman + I-download ang lahat ng napiling manga at ang mga kabanata nito\? Maaari itong kumonsumo ng maraming trapiko at storage. + Mga parallel na pag-download + Pagbagal ng pag-download + Tatanggalin ang mga chapters sa background. Maaari itong tumagal ng ilang oras + Kinansela + I-sync ang iyong data + Tingnan ang mga bagong kabanata at ipaalam ang tungkol dito + Pangalan + I-edit + Tanggalin ang bookmark + Makakatanggap ka ng mga abiso tungkol sa mga update ng manga na iyong binabasa + Mag-undo + Nagbabasa + Cache ng mga pahina + Mga bookmark + Sigurado ka bang gusto mong tanggalin ang mga napiling paboritong kategorya\? +\nAng lahat ng manga sa loob nito ay mawawala at hindi na ito mababawi. + Idinagdag ang bookmark + Awtomatikong matukoy kung ang manga ay webtoon + Huwag paganahin ang pag-optimize ng baterya + Tumutulong sa mga pagsusuri sa mga update sa background + Nakaplano + Nakumpleto na + Naka-hold + Huwag paganahin ang lahat + Gumamit ng fingerprint kung magagamit + Ulat + Ilagay ang iyong email upang magpatuloy + I-reset + Magmungkahi ng mga update sa mga beta na bersyon ng app + Hindi magagamit ang network + I-on ang Wi-Fi o mobile network para magbasa ng manga online + Naka-off + %ss + Mag-tap sa kanang gilid o ang pagpindot sa kanang key ay palaging lilipat sa susunod na pahina + Ipakita ang slider ng paglipat ng pahina + Mga detalye ng error:<br><tt>%1$s</tt><br><br>1. Subukang <a href=%2$s>buksan ang manga sa isang web browser</a> upang matiyak na magagamit ito sa source<br>nito 2. Kung magagamit ito, magpadala ng isang ulat ng error sa mga developer. + Paganahin ang pag-log + Hindi pinagana ang source + Pag-import ng manga + Maaari mong tanggalin ang orihinal na file mula sa storage upang makatipid ng espasyo + Ang napiling mga setting ng kulay ay matatandaan para sa manga na ito + Payagan ang pag-zoom in/zoom out na galaw sa webtoon mode (beta) + Compact + Upang subaybayan ang pag unlad ng pagbabasa, piliin ang Menu → Track sa screen ng mga detalye ng manga. + Nagsimula na ang pag-download + Scheme ng kulay + Miku \ No newline at end of file From 9adf209445de79683dca2e2b830b3e5fc6c8f090 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 25 Feb 2023 17:15:07 +0200 Subject: [PATCH 2/6] Highlight suspicious genres --- .../kotatsu/base/ui/widgets/ChipsView.kt | 20 ++++++----- .../core/parser/MangaTagHighlighter.kt | 26 ++++++++++++++ .../kotatsu/details/ui/DetailsFragment.kt | 6 +++- .../ui/list/FavouritesListViewModel.kt | 4 ++- .../history/ui/HistoryListViewModel.kt | 4 ++- .../list/ui/model/ListModelConversionExt.kt | 34 +++++++++++++++---- .../kotatsu/local/ui/LocalListViewModel.kt | 6 ++-- .../remotelist/ui/RemoteListViewModel.kt | 8 +++-- .../kotatsu/search/ui/SearchViewModel.kt | 4 ++- .../search/ui/multi/MultiSearchViewModel.kt | 16 +++++++-- .../suggestion/SearchSuggestionViewModel.kt | 2 +- .../kotatsu/shelf/ui/ShelfViewModel.kt | 4 +-- .../suggestions/ui/SuggestionsViewModel.kt | 4 ++- .../tracker/ui/updates/UpdatesViewModel.kt | 4 ++- app/src/main/res/values-night/colors.xml | 2 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/constants.xml | 6 ++++ 17 files changed, 117 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt index 809add879..9825b9172 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt @@ -3,15 +3,16 @@ package org.koitharu.kotatsu.base.ui.widgets import android.content.Context import android.util.AttributeSet import android.view.View.OnClickListener -import androidx.annotation.DrawableRes +import androidx.annotation.ColorRes +import androidx.core.content.ContextCompat import androidx.core.view.children -import com.google.android.material.R as materialR import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipGroup import org.koitharu.kotatsu.R import org.koitharu.kotatsu.utils.ext.castOrNull import org.koitharu.kotatsu.utils.ext.getThemeColorStateList +import com.google.android.material.R as materialR class ChipsView @JvmOverloads constructor( context: Context, @@ -75,12 +76,12 @@ class ChipsView @JvmOverloads constructor( private fun bindChip(chip: Chip, model: ChipModel) { chip.text = model.title - if (model.icon == 0) { - chip.isChipIconVisible = false + val tint = if (model.tint == 0) { + null } else { - chip.isChipIconVisible = true - chip.setChipIconResource(model.icon) + ContextCompat.getColorStateList(context, model.tint) } + chip.buttonTintList = tint chip.isClickable = onChipClickListener != null || model.isCheckable chip.isCheckable = model.isCheckable chip.isChecked = model.isChecked @@ -92,6 +93,7 @@ class ChipsView @JvmOverloads constructor( val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_Kotatsu_Chip) chip.setChipDrawable(drawable) chip.isCheckedIconVisible = true + chip.isChipIconVisible = false chip.setCheckedIconResource(R.drawable.ic_check) chip.checkedIconTint = context.getThemeColorStateList(materialR.attr.colorControlNormal) chip.isCloseIconVisible = onChipCloseClickListener != null @@ -113,7 +115,7 @@ class ChipsView @JvmOverloads constructor( } class ChipModel( - @DrawableRes val icon: Int, + @ColorRes val tint: Int, val title: CharSequence, val isCheckable: Boolean, val isChecked: Boolean, @@ -126,7 +128,7 @@ class ChipsView @JvmOverloads constructor( other as ChipModel - if (icon != other.icon) return false + if (tint != other.tint) return false if (title != other.title) return false if (isCheckable != other.isCheckable) return false if (isChecked != other.isChecked) return false @@ -136,7 +138,7 @@ class ChipsView @JvmOverloads constructor( } override fun hashCode(): Int { - var result = icon + var result = tint.hashCode() result = 31 * result + title.hashCode() result = 31 * result + isCheckable.hashCode() result = 31 * result + isChecked.hashCode() diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt new file mode 100644 index 000000000..427d205b6 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt @@ -0,0 +1,26 @@ +package org.koitharu.kotatsu.core.parser + +import android.content.Context +import androidx.annotation.ColorRes +import dagger.Reusable +import dagger.hilt.android.qualifiers.ApplicationContext +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.parsers.model.MangaTag +import javax.inject.Inject + +@Reusable +class MangaTagHighlighter @Inject constructor( + @ApplicationContext context: Context, +) { + + private val dict = context.resources.getStringArray(R.array.genres_warnlist).toSet() + + @ColorRes + fun getTint(tag: MangaTag): Int { + return if (tag.title.lowercase() in dict) { + R.color.warning + } else { + 0 + } + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 237f5781c..0461182fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -26,6 +26,7 @@ import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.adapter.BookmarksAdapter +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.databinding.FragmentDetailsBinding import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.HistoryInfo @@ -69,6 +70,9 @@ class DetailsFragment : @Inject lateinit var coil: ImageLoader + @Inject + lateinit var tagHighlighter: MangaTagHighlighter + private val viewModel by activityViewModels() override fun onInflateView( @@ -321,7 +325,7 @@ class DetailsFragment : manga.tags.map { tag -> ChipsView.ChipModel( title = tag.title, - icon = 0, + tint = tagHighlighter.getTint(tag), data = tag, isCheckable = false, isChecked = false, diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt index a73142563..f10371dc2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment.Companion.NO_ID @@ -36,6 +37,7 @@ class FavouritesListViewModel @AssistedInject constructor( private val trackingRepository: TrackingRepository, private val historyRepository: HistoryRepository, private val settings: AppSettings, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings), ListExtraProvider { var categoryName: String? = null @@ -71,7 +73,7 @@ class FavouritesListViewModel @AssistedInject constructor( ), ) - else -> list.toUi(mode, this) + else -> list.toUi(mode, this, tagHighlighter) } }.catch { emit(listOf(it.toErrorState(canRetry = false))) diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index 8806ea2d2..8f38721f1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.util.ReversibleAction +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.observeAsFlow @@ -38,6 +39,7 @@ class HistoryListViewModel @Inject constructor( private val repository: HistoryRepository, private val settings: AppSettings, private val trackingRepository: TrackingRepository, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { val isGroupingEnabled = MutableLiveData() @@ -118,7 +120,7 @@ class HistoryListViewModel @Inject constructor( val percent = if (showPercent) history.percent else PROGRESS_NONE result += when (mode) { ListMode.LIST -> manga.toListModel(counter, percent) - ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent) + ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent, tagHighlighter) ListMode.GRID -> manga.toGridModel(counter, percent) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt index 215b0c9d9..20fba3c37 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt @@ -4,6 +4,7 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.domain.ListExtraProvider @@ -13,7 +14,10 @@ import org.koitharu.kotatsu.utils.ext.ifZero import java.net.SocketTimeoutException import java.net.UnknownHostException -fun Manga.toListModel(counter: Int, progress: Float) = MangaListModel( +fun Manga.toListModel( + counter: Int, + progress: Float, +) = MangaListModel( id = id, title = title, subtitle = tags.joinToString(", ") { it.title }, @@ -23,7 +27,11 @@ fun Manga.toListModel(counter: Int, progress: Float) = MangaListModel( progress = progress, ) -fun Manga.toListDetailedModel(counter: Int, progress: Float) = MangaListDetailedModel( +fun Manga.toListDetailedModel( + counter: Int, + progress: Float, + tagHighlighter: MangaTagHighlighter?, +) = MangaListDetailedModel( id = id, title = title, subtitle = altTitle, @@ -31,7 +39,15 @@ fun Manga.toListDetailedModel(counter: Int, progress: Float) = MangaListDetailed manga = this, counter = counter, progress = progress, - tags = tags.map { ChipsView.ChipModel(0, it.title, false, false, it) }, + tags = tags.map { + ChipsView.ChipModel( + tint = tagHighlighter?.getTint(it) ?: 0, + title = it.title, + isCheckable = false, + isChecked = false, + data = it, + ) + }, ) fun Manga.toGridModel(counter: Int, progress: Float) = MangaGridModel( @@ -46,18 +62,21 @@ fun Manga.toGridModel(counter: Int, progress: Float) = MangaGridModel( suspend fun List.toUi( mode: ListMode, extraProvider: ListExtraProvider, -): List = toUi(ArrayList(size), mode, extraProvider) + tagHighlighter: MangaTagHighlighter?, +): List = toUi(ArrayList(size), mode, extraProvider, tagHighlighter) fun List.toUi( mode: ListMode, -): List = toUi(ArrayList(size), mode) + tagHighlighter: MangaTagHighlighter?, +): List = toUi(ArrayList(size), mode, tagHighlighter) fun > List.toUi( destination: C, mode: ListMode, + tagHighlighter: MangaTagHighlighter?, ): C = when (mode) { ListMode.LIST -> mapTo(destination) { it.toListModel(0, PROGRESS_NONE) } - ListMode.DETAILED_LIST -> mapTo(destination) { it.toListDetailedModel(0, PROGRESS_NONE) } + ListMode.DETAILED_LIST -> mapTo(destination) { it.toListDetailedModel(0, PROGRESS_NONE, tagHighlighter) } ListMode.GRID -> mapTo(destination) { it.toGridModel(0, PROGRESS_NONE) } } @@ -65,13 +84,14 @@ suspend fun > List.toUi( destination: C, mode: ListMode, extraProvider: ListExtraProvider, + tagHighlighter: MangaTagHighlighter?, ): C = when (mode) { ListMode.LIST -> mapTo(destination) { it.toListModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) } ListMode.DETAILED_LIST -> mapTo(destination) { - it.toListDetailedModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) + it.toListDetailedModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id), tagHighlighter) } ListMode.GRID -> mapTo(destination) { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index 499ed4b6d..240c3649f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.history.domain.HistoryRepository @@ -46,6 +47,7 @@ class LocalListViewModel @Inject constructor( private val historyRepository: HistoryRepository, private val trackingRepository: TrackingRepository, private val settings: AppSettings, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings), ListExtraProvider { val onMangaRemoved = SingleLiveEvent() @@ -76,7 +78,7 @@ class LocalListViewModel @Inject constructor( else -> buildList(list.size + 1) { add(createHeader(list, tags, order)) - list.toUi(this, mode, this@LocalListViewModel) + list.toUi(this, mode, this@LocalListViewModel, tagHighlighter) } } }.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState)) @@ -170,7 +172,7 @@ class LocalListViewModel @Inject constructor( val chips = LinkedList() for ((tag, _) in topTags) { val model = ChipsView.ChipModel( - icon = 0, + tint = 0, title = tag.title, isCheckable = true, isChecked = tag in selectedTags, diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index aef575033..ce2d3edb9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -19,6 +19,7 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.list.ui.MangaListViewModel @@ -49,6 +50,7 @@ class RemoteListViewModel @AssistedInject constructor( private val searchRepository: MangaSearchRepository, settings: AppSettings, dataRepository: MangaDataRepository, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings), OnFilterChangedListener { private val repository = mangaRepositoryFactory.create(source) as RemoteMangaRepository @@ -75,7 +77,7 @@ class RemoteListViewModel @AssistedInject constructor( list == null -> add(LoadingState) list.isEmpty() -> add(createEmptyState(header.hasSelectedTags)) else -> { - list.toUi(this, mode) + list.toUi(this, mode, tagHighlighter) when { error != null -> add(error.toErrorFooter()) hasNext -> add(LoadingFooter) @@ -192,7 +194,7 @@ class RemoteListViewModel @AssistedInject constructor( val result = LinkedList() for (tag in tags) { val model = ChipsView.ChipModel( - icon = 0, + tint = 0, title = tag.title, isCheckable = true, isChecked = selectedTags.remove(tag), @@ -206,7 +208,7 @@ class RemoteListViewModel @AssistedInject constructor( } for (tag in selectedTags) { val model = ChipsView.ChipModel( - icon = 0, + tint = 0, title = tag.title, isCheckable = true, isChecked = true, diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt index b959f65a7..a7976bfe8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.parser.MangaRepository +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -29,6 +30,7 @@ class SearchViewModel @AssistedInject constructor( @Assisted private val query: String, repositoryFactory: MangaRepository.Factory, settings: AppSettings, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { private val repository = repositoryFactory.create(source) @@ -57,7 +59,7 @@ class SearchViewModel @AssistedInject constructor( else -> { val result = ArrayList(list.size + 1) - list.toUi(result, mode) + list.toUi(result, mode, tagHighlighter) when { error != null -> result += error.toErrorFooter() hasNext -> result += LoadingFooter diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt index 2a9455e08..c0eaeaa4d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt @@ -6,7 +6,12 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.async +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update @@ -16,7 +21,12 @@ import org.koitharu.kotatsu.core.exceptions.CompositeException import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.list.ui.model.* +import org.koitharu.kotatsu.list.ui.model.EmptyState +import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.list.ui.model.LoadingFooter +import org.koitharu.kotatsu.list.ui.model.LoadingState +import org.koitharu.kotatsu.list.ui.model.toErrorState +import org.koitharu.kotatsu.list.ui.model.toUi import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.printStackTraceDebug @@ -104,7 +114,7 @@ class MultiSearchViewModel @AssistedInject constructor( async(dispatcher) { runCatchingCancellable { val list = mangaRepositoryFactory.create(source).getList(offset = 0, query = q) - .toUi(ListMode.GRID) + .toUi(ListMode.GRID, null) if (list.isNotEmpty()) { MultiSearchListModel(source, list.size > MIN_HAS_MORE_ITEMS, list) } else { diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt index 31edd3481..361969911 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt @@ -134,7 +134,7 @@ class SearchSuggestionViewModel @Inject constructor( private fun mapTags(tags: List): List = tags.map { tag -> ChipsView.ChipModel( - icon = 0, + tint = 0, title = tag.title, data = tag, isCheckable = false, diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt index ef806d69c..b8d203f85 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt @@ -236,7 +236,7 @@ class ShelfViewModel @Inject constructor( return } destination += ShelfSectionModel.Local( - items = local.toUi(ListMode.GRID, this), + items = local.toUi(ListMode.GRID, this, null), showAllButtonText = R.string.show_all, ) } @@ -251,7 +251,7 @@ class ShelfViewModel @Inject constructor( for ((category, list) in favourites) { if (list.isNotEmpty()) { destination += ShelfSectionModel.Favourites( - items = list.toUi(ListMode.GRID, this), + items = list.toUi(ListMode.GRID, this, null), category = category, showAllButtonText = R.string.show_all, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt index 2eca00df8..1741936f2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -22,6 +23,7 @@ import javax.inject.Inject class SuggestionsViewModel @Inject constructor( repository: SuggestionRepository, settings: AppSettings, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { override val content = combine( @@ -38,7 +40,7 @@ class SuggestionsViewModel @Inject constructor( ), ) - else -> list.toUi(mode) + else -> list.toUi(mode, tagHighlighter) } }.onStart { loadingCounter.increment() diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt index 6a649cd38..1ebe7b8cd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.history.domain.HistoryRepository @@ -30,6 +31,7 @@ class UpdatesViewModel @Inject constructor( private val repository: TrackingRepository, private val settings: AppSettings, private val historyRepository: HistoryRepository, + private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { override val content = combine( @@ -69,7 +71,7 @@ class UpdatesViewModel @Inject constructor( val percent = if (showPercent) historyRepository.getProgress(manga.id) else PROGRESS_NONE when (mode) { ListMode.LIST -> manga.toListModel(counter, percent) - ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent) + ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent, tagHighlighter) ListMode.GRID -> manga.toGridModel(counter, percent) } } diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index ef901bd78..9529f4d9d 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -9,5 +9,5 @@ #29FFFFFF #1FFFFFFF #260052 - + #EF6C00 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bd13e4c65..c05d7cf91 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -22,4 +22,5 @@ #29000000 #1F000000 #334800E0 + #FFA726 diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index a7f1cd3ff..44bc52eed 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -38,4 +38,10 @@ 2 0 + + yaoi + яой + yuri + юри + From d0b9412559d1fef2b66b03fcea09001227e07ec1 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 25 Feb 2023 17:20:06 +0200 Subject: [PATCH 3/6] Revert "Highlight suspicious genres" This reverts commit 9adf209445de79683dca2e2b830b3e5fc6c8f090. --- .../kotatsu/base/ui/widgets/ChipsView.kt | 20 +++++------ .../core/parser/MangaTagHighlighter.kt | 26 -------------- .../kotatsu/details/ui/DetailsFragment.kt | 6 +--- .../ui/list/FavouritesListViewModel.kt | 4 +-- .../history/ui/HistoryListViewModel.kt | 4 +-- .../list/ui/model/ListModelConversionExt.kt | 34 ++++--------------- .../kotatsu/local/ui/LocalListViewModel.kt | 6 ++-- .../remotelist/ui/RemoteListViewModel.kt | 8 ++--- .../kotatsu/search/ui/SearchViewModel.kt | 4 +-- .../search/ui/multi/MultiSearchViewModel.kt | 16 ++------- .../suggestion/SearchSuggestionViewModel.kt | 2 +- .../kotatsu/shelf/ui/ShelfViewModel.kt | 4 +-- .../suggestions/ui/SuggestionsViewModel.kt | 4 +-- .../tracker/ui/updates/UpdatesViewModel.kt | 4 +-- app/src/main/res/values-night/colors.xml | 2 +- app/src/main/res/values/colors.xml | 1 - app/src/main/res/values/constants.xml | 6 ---- 17 files changed, 34 insertions(+), 117 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt index 9825b9172..809add879 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt @@ -3,16 +3,15 @@ package org.koitharu.kotatsu.base.ui.widgets import android.content.Context import android.util.AttributeSet import android.view.View.OnClickListener -import androidx.annotation.ColorRes -import androidx.core.content.ContextCompat +import androidx.annotation.DrawableRes import androidx.core.view.children +import com.google.android.material.R as materialR import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipGroup import org.koitharu.kotatsu.R import org.koitharu.kotatsu.utils.ext.castOrNull import org.koitharu.kotatsu.utils.ext.getThemeColorStateList -import com.google.android.material.R as materialR class ChipsView @JvmOverloads constructor( context: Context, @@ -76,12 +75,12 @@ class ChipsView @JvmOverloads constructor( private fun bindChip(chip: Chip, model: ChipModel) { chip.text = model.title - val tint = if (model.tint == 0) { - null + if (model.icon == 0) { + chip.isChipIconVisible = false } else { - ContextCompat.getColorStateList(context, model.tint) + chip.isChipIconVisible = true + chip.setChipIconResource(model.icon) } - chip.buttonTintList = tint chip.isClickable = onChipClickListener != null || model.isCheckable chip.isCheckable = model.isCheckable chip.isChecked = model.isChecked @@ -93,7 +92,6 @@ class ChipsView @JvmOverloads constructor( val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_Kotatsu_Chip) chip.setChipDrawable(drawable) chip.isCheckedIconVisible = true - chip.isChipIconVisible = false chip.setCheckedIconResource(R.drawable.ic_check) chip.checkedIconTint = context.getThemeColorStateList(materialR.attr.colorControlNormal) chip.isCloseIconVisible = onChipCloseClickListener != null @@ -115,7 +113,7 @@ class ChipsView @JvmOverloads constructor( } class ChipModel( - @ColorRes val tint: Int, + @DrawableRes val icon: Int, val title: CharSequence, val isCheckable: Boolean, val isChecked: Boolean, @@ -128,7 +126,7 @@ class ChipsView @JvmOverloads constructor( other as ChipModel - if (tint != other.tint) return false + if (icon != other.icon) return false if (title != other.title) return false if (isCheckable != other.isCheckable) return false if (isChecked != other.isChecked) return false @@ -138,7 +136,7 @@ class ChipsView @JvmOverloads constructor( } override fun hashCode(): Int { - var result = tint.hashCode() + var result = icon result = 31 * result + title.hashCode() result = 31 * result + isCheckable.hashCode() result = 31 * result + isChecked.hashCode() diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt deleted file mode 100644 index 427d205b6..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/MangaTagHighlighter.kt +++ /dev/null @@ -1,26 +0,0 @@ -package org.koitharu.kotatsu.core.parser - -import android.content.Context -import androidx.annotation.ColorRes -import dagger.Reusable -import dagger.hilt.android.qualifiers.ApplicationContext -import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.parsers.model.MangaTag -import javax.inject.Inject - -@Reusable -class MangaTagHighlighter @Inject constructor( - @ApplicationContext context: Context, -) { - - private val dict = context.resources.getStringArray(R.array.genres_warnlist).toSet() - - @ColorRes - fun getTint(tag: MangaTag): Int { - return if (tag.title.lowercase() in dict) { - R.color.warning - } else { - 0 - } - } -} diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 0461182fd..237f5781c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -26,7 +26,6 @@ import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.ui.adapter.BookmarksAdapter -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.databinding.FragmentDetailsBinding import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.HistoryInfo @@ -70,9 +69,6 @@ class DetailsFragment : @Inject lateinit var coil: ImageLoader - @Inject - lateinit var tagHighlighter: MangaTagHighlighter - private val viewModel by activityViewModels() override fun onInflateView( @@ -325,7 +321,7 @@ class DetailsFragment : manga.tags.map { tag -> ChipsView.ChipModel( title = tag.title, - tint = tagHighlighter.getTint(tag), + icon = 0, data = tag, isCheckable = false, isChecked = false, diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt index f10371dc2..a73142563 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt @@ -13,7 +13,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.util.ReversibleAction -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment.Companion.NO_ID @@ -37,7 +36,6 @@ class FavouritesListViewModel @AssistedInject constructor( private val trackingRepository: TrackingRepository, private val historyRepository: HistoryRepository, private val settings: AppSettings, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings), ListExtraProvider { var categoryName: String? = null @@ -73,7 +71,7 @@ class FavouritesListViewModel @AssistedInject constructor( ), ) - else -> list.toUi(mode, this, tagHighlighter) + else -> list.toUi(mode, this) } }.catch { emit(listOf(it.toErrorState(canRetry = false))) diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index 8f38721f1..8806ea2d2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -10,7 +10,6 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.util.ReversibleAction -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.observeAsFlow @@ -39,7 +38,6 @@ class HistoryListViewModel @Inject constructor( private val repository: HistoryRepository, private val settings: AppSettings, private val trackingRepository: TrackingRepository, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { val isGroupingEnabled = MutableLiveData() @@ -120,7 +118,7 @@ class HistoryListViewModel @Inject constructor( val percent = if (showPercent) history.percent else PROGRESS_NONE result += when (mode) { ListMode.LIST -> manga.toListModel(counter, percent) - ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent, tagHighlighter) + ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent) ListMode.GRID -> manga.toGridModel(counter, percent) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt index 20fba3c37..215b0c9d9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt @@ -4,7 +4,6 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.domain.ListExtraProvider @@ -14,10 +13,7 @@ import org.koitharu.kotatsu.utils.ext.ifZero import java.net.SocketTimeoutException import java.net.UnknownHostException -fun Manga.toListModel( - counter: Int, - progress: Float, -) = MangaListModel( +fun Manga.toListModel(counter: Int, progress: Float) = MangaListModel( id = id, title = title, subtitle = tags.joinToString(", ") { it.title }, @@ -27,11 +23,7 @@ fun Manga.toListModel( progress = progress, ) -fun Manga.toListDetailedModel( - counter: Int, - progress: Float, - tagHighlighter: MangaTagHighlighter?, -) = MangaListDetailedModel( +fun Manga.toListDetailedModel(counter: Int, progress: Float) = MangaListDetailedModel( id = id, title = title, subtitle = altTitle, @@ -39,15 +31,7 @@ fun Manga.toListDetailedModel( manga = this, counter = counter, progress = progress, - tags = tags.map { - ChipsView.ChipModel( - tint = tagHighlighter?.getTint(it) ?: 0, - title = it.title, - isCheckable = false, - isChecked = false, - data = it, - ) - }, + tags = tags.map { ChipsView.ChipModel(0, it.title, false, false, it) }, ) fun Manga.toGridModel(counter: Int, progress: Float) = MangaGridModel( @@ -62,21 +46,18 @@ fun Manga.toGridModel(counter: Int, progress: Float) = MangaGridModel( suspend fun List.toUi( mode: ListMode, extraProvider: ListExtraProvider, - tagHighlighter: MangaTagHighlighter?, -): List = toUi(ArrayList(size), mode, extraProvider, tagHighlighter) +): List = toUi(ArrayList(size), mode, extraProvider) fun List.toUi( mode: ListMode, - tagHighlighter: MangaTagHighlighter?, -): List = toUi(ArrayList(size), mode, tagHighlighter) +): List = toUi(ArrayList(size), mode) fun > List.toUi( destination: C, mode: ListMode, - tagHighlighter: MangaTagHighlighter?, ): C = when (mode) { ListMode.LIST -> mapTo(destination) { it.toListModel(0, PROGRESS_NONE) } - ListMode.DETAILED_LIST -> mapTo(destination) { it.toListDetailedModel(0, PROGRESS_NONE, tagHighlighter) } + ListMode.DETAILED_LIST -> mapTo(destination) { it.toListDetailedModel(0, PROGRESS_NONE) } ListMode.GRID -> mapTo(destination) { it.toGridModel(0, PROGRESS_NONE) } } @@ -84,14 +65,13 @@ suspend fun > List.toUi( destination: C, mode: ListMode, extraProvider: ListExtraProvider, - tagHighlighter: MangaTagHighlighter?, ): C = when (mode) { ListMode.LIST -> mapTo(destination) { it.toListModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) } ListMode.DETAILED_LIST -> mapTo(destination) { - it.toListDetailedModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id), tagHighlighter) + it.toListDetailedModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) } ListMode.GRID -> mapTo(destination) { diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index 240c3649f..499ed4b6d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -16,7 +16,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.widgets.ChipsView -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.history.domain.HistoryRepository @@ -47,7 +46,6 @@ class LocalListViewModel @Inject constructor( private val historyRepository: HistoryRepository, private val trackingRepository: TrackingRepository, private val settings: AppSettings, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings), ListExtraProvider { val onMangaRemoved = SingleLiveEvent() @@ -78,7 +76,7 @@ class LocalListViewModel @Inject constructor( else -> buildList(list.size + 1) { add(createHeader(list, tags, order)) - list.toUi(this, mode, this@LocalListViewModel, tagHighlighter) + list.toUi(this, mode, this@LocalListViewModel) } } }.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState)) @@ -172,7 +170,7 @@ class LocalListViewModel @Inject constructor( val chips = LinkedList() for ((tag, _) in topTags) { val model = ChipsView.ChipModel( - tint = 0, + icon = 0, title = tag.title, isCheckable = true, isChecked = tag in selectedTags, diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index ce2d3edb9..aef575033 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -19,7 +19,6 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.parser.MangaRepository -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.parser.RemoteMangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.list.ui.MangaListViewModel @@ -50,7 +49,6 @@ class RemoteListViewModel @AssistedInject constructor( private val searchRepository: MangaSearchRepository, settings: AppSettings, dataRepository: MangaDataRepository, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings), OnFilterChangedListener { private val repository = mangaRepositoryFactory.create(source) as RemoteMangaRepository @@ -77,7 +75,7 @@ class RemoteListViewModel @AssistedInject constructor( list == null -> add(LoadingState) list.isEmpty() -> add(createEmptyState(header.hasSelectedTags)) else -> { - list.toUi(this, mode, tagHighlighter) + list.toUi(this, mode) when { error != null -> add(error.toErrorFooter()) hasNext -> add(LoadingFooter) @@ -194,7 +192,7 @@ class RemoteListViewModel @AssistedInject constructor( val result = LinkedList() for (tag in tags) { val model = ChipsView.ChipModel( - tint = 0, + icon = 0, title = tag.title, isCheckable = true, isChecked = selectedTags.remove(tag), @@ -208,7 +206,7 @@ class RemoteListViewModel @AssistedInject constructor( } for (tag in selectedTags) { val model = ChipsView.ChipModel( - tint = 0, + icon = 0, title = tag.title, isCheckable = true, isChecked = true, diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt index a7976bfe8..b959f65a7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt @@ -11,7 +11,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.parser.MangaRepository -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -30,7 +29,6 @@ class SearchViewModel @AssistedInject constructor( @Assisted private val query: String, repositoryFactory: MangaRepository.Factory, settings: AppSettings, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { private val repository = repositoryFactory.create(source) @@ -59,7 +57,7 @@ class SearchViewModel @AssistedInject constructor( else -> { val result = ArrayList(list.size + 1) - list.toUi(result, mode, tagHighlighter) + list.toUi(result, mode) when { error != null -> result += error.toErrorFooter() hasNext -> result += LoadingFooter diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt index c0eaeaa4d..2a9455e08 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchViewModel.kt @@ -6,12 +6,7 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.async -import kotlinx.coroutines.cancelAndJoin -import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update @@ -21,12 +16,7 @@ import org.koitharu.kotatsu.core.exceptions.CompositeException import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.list.ui.model.EmptyState -import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.list.ui.model.LoadingFooter -import org.koitharu.kotatsu.list.ui.model.LoadingState -import org.koitharu.kotatsu.list.ui.model.toErrorState -import org.koitharu.kotatsu.list.ui.model.toUi +import org.koitharu.kotatsu.list.ui.model.* import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.printStackTraceDebug @@ -114,7 +104,7 @@ class MultiSearchViewModel @AssistedInject constructor( async(dispatcher) { runCatchingCancellable { val list = mangaRepositoryFactory.create(source).getList(offset = 0, query = q) - .toUi(ListMode.GRID, null) + .toUi(ListMode.GRID) if (list.isNotEmpty()) { MultiSearchListModel(source, list.size > MIN_HAS_MORE_ITEMS, list) } else { diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt index 361969911..31edd3481 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt @@ -134,7 +134,7 @@ class SearchSuggestionViewModel @Inject constructor( private fun mapTags(tags: List): List = tags.map { tag -> ChipsView.ChipModel( - tint = 0, + icon = 0, title = tag.title, data = tag, isCheckable = false, diff --git a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt index b8d203f85..ef806d69c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/shelf/ui/ShelfViewModel.kt @@ -236,7 +236,7 @@ class ShelfViewModel @Inject constructor( return } destination += ShelfSectionModel.Local( - items = local.toUi(ListMode.GRID, this, null), + items = local.toUi(ListMode.GRID, this), showAllButtonText = R.string.show_all, ) } @@ -251,7 +251,7 @@ class ShelfViewModel @Inject constructor( for ((category, list) in favourites) { if (list.isNotEmpty()) { destination += ShelfSectionModel.Favourites( - items = list.toUi(ListMode.GRID, this, null), + items = list.toUi(ListMode.GRID, this), category = category, showAllButtonText = R.string.show_all, ) diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt index 1741936f2..2eca00df8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.list.ui.model.EmptyState @@ -23,7 +22,6 @@ import javax.inject.Inject class SuggestionsViewModel @Inject constructor( repository: SuggestionRepository, settings: AppSettings, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { override val content = combine( @@ -40,7 +38,7 @@ class SuggestionsViewModel @Inject constructor( ), ) - else -> list.toUi(mode, tagHighlighter) + else -> list.toUi(mode) } }.onStart { loadingCounter.increment() diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt index 1ebe7b8cd..6a649cd38 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onStart import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.parser.MangaTagHighlighter import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.history.domain.HistoryRepository @@ -31,7 +30,6 @@ class UpdatesViewModel @Inject constructor( private val repository: TrackingRepository, private val settings: AppSettings, private val historyRepository: HistoryRepository, - private val tagHighlighter: MangaTagHighlighter, ) : MangaListViewModel(settings) { override val content = combine( @@ -71,7 +69,7 @@ class UpdatesViewModel @Inject constructor( val percent = if (showPercent) historyRepository.getProgress(manga.id) else PROGRESS_NONE when (mode) { ListMode.LIST -> manga.toListModel(counter, percent) - ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent, tagHighlighter) + ListMode.DETAILED_LIST -> manga.toListDetailedModel(counter, percent) ListMode.GRID -> manga.toGridModel(counter, percent) } } diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 9529f4d9d..ef901bd78 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -9,5 +9,5 @@ #29FFFFFF #1FFFFFFF #260052 - #EF6C00 + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c05d7cf91..bd13e4c65 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -22,5 +22,4 @@ #29000000 #1F000000 #334800E0 - #FFA726 diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index 44bc52eed..a7f1cd3ff 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -38,10 +38,4 @@ 2 0 - - yaoi - яой - yuri - юри - From 4ec50f83d28c56bbec1f5ab220fba698b461668c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 25 Feb 2023 18:44:31 +0200 Subject: [PATCH 4/6] Update parsers --- app/build.gradle | 14 +++++++------- .../koitharu/kotatsu/core/prefs/SourceSettings.kt | 1 + .../kotatsu/settings/SourceSettingsExt.kt | 15 +++++++++++++++ app/src/main/res/values/strings.xml | 1 + build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 6 +++--- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 306555035..37c28fe9f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 33 - versionCode 517 - versionName '4.4.1' + versionCode 518 + versionName '4.4.2' generatedDensities = [] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -87,7 +87,7 @@ afterEvaluate { } } dependencies { - implementation('com.github.KotatsuApp:kotatsu-parsers:f4c47b5b84') { + implementation('com.github.KotatsuApp:kotatsu-parsers:1093584202') { exclude group: 'org.json', module: 'json' } @@ -124,8 +124,8 @@ dependencies { implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl:4.3.2' implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.2' - implementation 'com.google.dagger:hilt-android:2.44.2' - kapt 'com.google.dagger:hilt-compiler:2.44.2' + implementation 'com.google.dagger:hilt-android:2.45' + kapt 'com.google.dagger:hilt-compiler:2.45' implementation 'androidx.hilt:hilt-work:1.0.0' kapt 'androidx.hilt:hilt-compiler:1.0.0' @@ -154,6 +154,6 @@ dependencies { androidTestImplementation 'androidx.room:room-testing:2.5.0' androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.14.0' - androidTestImplementation 'com.google.dagger:hilt-android-testing:2.44.2' - kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.44.2' + androidTestImplementation 'com.google.dagger:hilt-android-testing:2.45' + kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.45' } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt index b93cb6f5f..5f74b3b2d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceSettings.kt @@ -23,6 +23,7 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig @Suppress("UNCHECKED_CAST") override fun get(key: ConfigKey): T { return when (key) { + is ConfigKey.UserAgent -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue } is ConfigKey.Domain -> prefs.getString(key.key, key.defaultValue).ifNullOrEmpty { key.defaultValue } is ConfigKey.ShowSuspiciousContent -> prefs.getBoolean(key.key, key.defaultValue) } as T diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsExt.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsExt.kt index 41a2639a9..5137fe95e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SourceSettingsExt.kt @@ -37,6 +37,21 @@ fun PreferenceFragmentCompat.addPreferencesFromRepository(repository: RemoteMang } } + is ConfigKey.UserAgent -> { + EditTextPreference(requireContext()).apply { + summaryProvider = EditTextDefaultSummaryProvider(key.defaultValue) + setOnBindEditTextListener( + EditTextBindListener( + inputType = EditorInfo.TYPE_CLASS_TEXT, + hint = key.defaultValue, + validator = null, + ), + ) + setTitle(R.string.user_agent) + setDialogTitle(R.string.user_agent) + } + } + is ConfigKey.ShowSuspiciousContent -> { SwitchPreferenceCompat(requireContext()).apply { setDefaultValue(key.defaultValue) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 579d88ae6..8f4f5e1ee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -424,4 +424,5 @@ Allow unstable updates Propose updates to beta versions of the app Download started + UserAgent header diff --git a/build.gradle b/build.gradle index f38bda893..db65af4c4 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.4.1' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10' - classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44.2' + classpath 'com.google.dagger:hilt-android-gradle-plugin:2.45' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3d86b3e83..dd15212a9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ -#Fri Jan 20 14:35:39 EET 2023 +#Sat Feb 25 17:16:02 EET 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionSha256Sum=6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From e15934bdc62fe0b7251bda8c1f9524de0c2420dd Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 2 Mar 2023 18:36:46 +0200 Subject: [PATCH 5/6] Option to inore SSL errors --- .../org/koitharu/kotatsu/core/AppModule.kt | 3 ++ .../kotatsu/core/network/SSLBypass.kt | 30 +++++++++++++++++++ .../kotatsu/core/prefs/AppSettings.kt | 4 +++ .../settings/ContentSettingsFragment.kt | 5 ++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_content.xml | 17 +++++++---- 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt index 565f5f653..a02e42b42 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt @@ -96,6 +96,9 @@ interface AppModule { writeTimeout(20, TimeUnit.SECONDS) cookieJar(cookieJar) dns(DoHManager(cache, settings)) + if (settings.isSSLBypassEnabled) { + bypassSSLErrors() + } cache(cache) addInterceptor(GZipInterceptor()) addInterceptor(commonHeadersInterceptor) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt new file mode 100644 index 000000000..ed1221613 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt @@ -0,0 +1,30 @@ +package org.koitharu.kotatsu.core.network + +import android.annotation.SuppressLint +import okhttp3.OkHttpClient +import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import java.security.SecureRandom +import java.security.cert.X509Certificate +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLSocketFactory +import javax.net.ssl.X509TrustManager + +@SuppressLint("CustomX509TrustManager") +fun OkHttpClient.Builder.bypassSSLErrors() = also { builder -> + runCatching { + val trustAllCerts = object : X509TrustManager { + override fun checkClientTrusted(chain: Array, authType: String) = Unit + + override fun checkServerTrusted(chain: Array, authType: String) = Unit + + override fun getAcceptedIssuers(): Array = emptyArray() + } + val sslContext = SSLContext.getInstance("SSL") + sslContext.init(null, arrayOf(trustAllCerts), SecureRandom()) + val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory + builder.sslSocketFactory(sslSocketFactory, trustAllCerts) + builder.hostnameVerifier { _, _ -> true } + }.onFailure { + it.printStackTraceDebug() + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index c63db4e66..2964b75ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -255,6 +255,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val dnsOverHttps: DoHProvider get() = prefs.getEnumValue(KEY_DOH, DoHProvider.NONE) + val isSSLBypassEnabled: Boolean + get() = prefs.getBoolean(KEY_SSL_BYPASS, false) + var localListOrder: SortOrder get() = prefs.getEnumValue(KEY_LOCAL_LIST_ORDER, SortOrder.NEWEST) set(value) = prefs.edit { putEnumValue(KEY_LOCAL_LIST_ORDER, value) } @@ -380,6 +383,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_LOGS_SHARE = "logs_share" const val KEY_SOURCES_GRID = "sources_grid" const val KEY_UPDATES_UNSTABLE = "updates_unstable" + const val KEY_SSL_BYPASS = "ssl_bypass" // About const val KEY_APP_UPDATE = "app_update" diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt index 61da14d36..872caac79 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.View import androidx.preference.ListPreference import androidx.preference.Preference +import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.koitharu.kotatsu.R @@ -85,6 +86,10 @@ class ContentSettingsFragment : AppSettings.KEY_SOURCES_HIDDEN -> { bindRemoteSourcesSummary() } + + AppSettings.KEY_SSL_BYPASS -> { + Snackbar.make(listView, R.string.settings_apply_restart_required, Snackbar.LENGTH_INDEFINITE).show() + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8f4f5e1ee..3c5494892 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -425,4 +425,5 @@ Propose updates to beta versions of the app Download started UserAgent header + Please restart the application to apply these changes diff --git a/app/src/main/res/xml/pref_content.xml b/app/src/main/res/xml/pref_content.xml index bf617ab66..cc679251b 100644 --- a/app/src/main/res/xml/pref_content.xml +++ b/app/src/main/res/xml/pref_content.xml @@ -20,12 +20,6 @@ android:title="@string/suggestions" app:allowDividerAbove="true" /> - - + + + + Date: Thu, 2 Mar 2023 18:42:36 +0200 Subject: [PATCH 6/6] Fix ThemeChooserPreference memory leak --- .../kotatsu/settings/utils/ThemeChooserPreference.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt index 2775014b0..d2ef58f50 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt @@ -19,6 +19,7 @@ import androidx.preference.PreferenceViewHolder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.ColorScheme import org.koitharu.kotatsu.databinding.ItemColorSchemeBinding +import java.lang.ref.WeakReference class ThemeChooserPreference @JvmOverloads constructor( context: Context, @@ -68,7 +69,7 @@ class ThemeChooserPreference @JvmOverloads constructor( } scrollView.viewTreeObserver.run { scrollPersistListener?.let { removeOnScrollChangedListener(it) } - scrollPersistListener = ScrollPersistListener(scrollView, lastScrollPosition) + scrollPersistListener = ScrollPersistListener(WeakReference(scrollView), lastScrollPosition) addOnScrollChangedListener(scrollPersistListener) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { @@ -106,7 +107,6 @@ class ThemeChooserPreference @JvmOverloads constructor( } super.onRestoreInstanceState(state.superState) lastScrollPosition[0] = state.scrollPosition - // notifyChanged() } private fun setValueInternal(enumName: String, notifyChanged: Boolean) { @@ -152,11 +152,12 @@ class ThemeChooserPreference @JvmOverloads constructor( } private class ScrollPersistListener( - private val scrollView: HorizontalScrollView, + private val scrollViewRef: WeakReference, private val lastScrollPosition: IntArray, ) : ViewTreeObserver.OnScrollChangedListener { override fun onScrollChanged() { + val scrollView = scrollViewRef.get() ?: return lastScrollPosition[0] = scrollView.scrollX } }