Add query filter on MangaListFilter.Advanced
Add query.filer Advanced on MangaDexParser
This commit is contained in:
@@ -52,6 +52,11 @@ abstract class MangaParser @InternalParsersApi constructor(
|
||||
*/
|
||||
open val isSearchSupported: Boolean = true
|
||||
|
||||
/**
|
||||
* Whether parser supports searching by string query using [MangaListFilter.Advanced]
|
||||
*/
|
||||
open val searchSupportedWithMultipleFilters: Boolean = false
|
||||
|
||||
@Deprecated(
|
||||
message = "Use availableSortOrders instead",
|
||||
replaceWith = ReplaceWith("availableSortOrders"),
|
||||
@@ -163,6 +168,7 @@ abstract class MangaParser @InternalParsersApi constructor(
|
||||
locale = null,
|
||||
states = emptySet(),
|
||||
contentRating = emptySet(),
|
||||
query = null,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ sealed interface MangaListFilter {
|
||||
(tags.size <= 1 || parser.isMultipleTagsSupported) &&
|
||||
(tagsExclude.isEmpty() || parser.isTagsExclusionSupported) &&
|
||||
(contentRating.isEmpty() || parser.availableContentRating.containsAll(contentRating)) &&
|
||||
(states.isEmpty() || parser.availableStates.containsAll(states))
|
||||
(states.isEmpty() || parser.availableStates.containsAll(states) &&
|
||||
(query.isNullOrEmpty() || parser.searchSupportedWithMultipleFilters))
|
||||
|
||||
is Search -> parser.isSearchSupported
|
||||
}
|
||||
@@ -35,10 +36,11 @@ sealed interface MangaListFilter {
|
||||
@JvmField val locale: Locale?,
|
||||
@JvmField val states: Set<MangaState>,
|
||||
@JvmField val contentRating: Set<ContentRating>,
|
||||
@JvmField val query: String?,
|
||||
) : MangaListFilter {
|
||||
|
||||
override fun isEmpty(): Boolean =
|
||||
tags.isEmpty() && tagsExclude.isEmpty() && locale == null && states.isEmpty() && contentRating.isEmpty()
|
||||
tags.isEmpty() && tagsExclude.isEmpty() && locale == null && states.isEmpty() && contentRating.isEmpty() && query == null
|
||||
|
||||
fun newBuilder() = Builder(sortOrder)
|
||||
.tags(tags)
|
||||
@@ -46,6 +48,7 @@ sealed interface MangaListFilter {
|
||||
.locale(locale)
|
||||
.states(states)
|
||||
.contentRatings(contentRating)
|
||||
.query(query)
|
||||
|
||||
class Builder(sortOrder: SortOrder) {
|
||||
|
||||
@@ -55,6 +58,7 @@ sealed interface MangaListFilter {
|
||||
private var _locale: Locale? = null
|
||||
private var _states: Set<MangaState>? = null
|
||||
private var _contentRating: Set<ContentRating>? = null
|
||||
private var _query: String? = null
|
||||
|
||||
fun sortOrder(order: SortOrder) = apply {
|
||||
_sortOrder = order
|
||||
@@ -80,6 +84,10 @@ sealed interface MangaListFilter {
|
||||
_contentRating = rating
|
||||
}
|
||||
|
||||
fun query(query: String?) {
|
||||
_query = query
|
||||
}
|
||||
|
||||
fun build() = Advanced(
|
||||
sortOrder = _sortOrder,
|
||||
tags = _tags.orEmpty(),
|
||||
@@ -87,6 +95,7 @@ sealed interface MangaListFilter {
|
||||
locale = _locale,
|
||||
states = _states.orEmpty(),
|
||||
contentRating = _contentRating.orEmpty(),
|
||||
query = _query,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,6 +61,12 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
|
||||
}
|
||||
|
||||
is MangaListFilter.Advanced -> {
|
||||
|
||||
filter.query.let {
|
||||
append("&title=")
|
||||
append(filter.query)
|
||||
}
|
||||
|
||||
filter.tags.forEach {
|
||||
append("&includedTags[]=")
|
||||
append(it.key)
|
||||
|
||||
@@ -59,6 +59,7 @@ internal class MangaParserTest {
|
||||
states = emptySet(),
|
||||
tagsExclude = emptySet(),
|
||||
contentRating = emptySet(),
|
||||
query = null,
|
||||
),
|
||||
).minByOrNull {
|
||||
it.title.length
|
||||
@@ -133,6 +134,7 @@ internal class MangaParserTest {
|
||||
locale = locales.random(),
|
||||
states = setOf(),
|
||||
contentRating = setOf(),
|
||||
query = null,
|
||||
)
|
||||
val list = parser.getList(offset = 0, filter)
|
||||
checkMangaList(list, filter.locale.toString())
|
||||
|
||||
Reference in New Issue
Block a user