diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index d6da300ef..f0756154c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -40,13 +40,13 @@ import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.gone -import eu.kanade.tachiyomi.util.view.setChips import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.visible import eu.kanade.tachiyomi.util.view.visibleIf import exh.EH_SOURCE_ID import exh.EXH_SOURCE_ID import exh.MERGED_SOURCE_ID +import exh.util.setChipsExtended import java.text.DateFormat import java.text.DecimalFormat import java.util.Date @@ -395,8 +395,8 @@ class MangaInfoController(private val fromSource: Boolean = false) : // Update genres list if (!manga.genre.isNullOrBlank()) { - binding.mangaGenresTagsCompactChips.setChips(manga.getGenres(), this::performSearch, this::performGlobalSearch) - binding.mangaGenresTagsFullChips.setChips(manga.getGenres(), this::performSearch, this::performGlobalSearch) + binding.mangaGenresTagsCompactChips.setChipsExtended(manga.getGenres(), this::performSearch, this::performGlobalSearch, manga.source) + binding.mangaGenresTagsFullChips.setChipsExtended(manga.getGenres(), this::performSearch, this::performGlobalSearch, manga.source) } else { binding.mangaGenresTagsWrapper.gone() } diff --git a/app/src/main/java/exh/util/ViewExtensions.kt b/app/src/main/java/exh/util/ViewExtensions.kt index 10eda11b2..92a6e816a 100644 --- a/app/src/main/java/exh/util/ViewExtensions.kt +++ b/app/src/main/java/exh/util/ViewExtensions.kt @@ -5,6 +5,12 @@ import android.view.ViewGroup import android.view.WindowInsets import android.widget.FrameLayout import androidx.annotation.Px +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup +import exh.EH_SOURCE_ID +import exh.EXH_SOURCE_ID +import exh.HITOMI_SOURCE_ID +import exh.NHENTAI_SOURCE_ID inline val View.marginTop: Int get() = (layoutParams as? ViewGroup.MarginLayoutParams)?.topMargin ?: 0 @@ -99,3 +105,41 @@ object RecyclerWindowInsetsListener : View.OnApplyWindowInsetsListener { return insets } } + +/** + * Replaces chips in a ChipGroup. + * + * @param items List of strings that are shown as individual chips. + * @param onClick Optional on click listener for each chip. + * @param onLongClick Optional long click listener for each chip. + * @param sourceId Optional source check to determine if we need special search functions for each chip. + */ +fun ChipGroup.setChipsExtended(items: List?, onClick: (item: String) -> Unit = {}, onLongClick: (item: String) -> Unit = {}, sourceId: Long = 0L) { + removeAllViews() + + items?.forEach { item -> + val chip = Chip(context).apply { + text = item + var search = item + if (sourceId == EXH_SOURCE_ID || sourceId == EH_SOURCE_ID || sourceId == NHENTAI_SOURCE_ID || sourceId == HITOMI_SOURCE_ID) { + val parsed = parseTag(search) + search = wrapTag(parsed.first, parsed.second.substringBefore('|').trim()) + } + setOnClickListener { onClick(search) } + setOnLongClickListener { + onLongClick(search) + false + } + } + + addView(chip) + } +} + +private fun parseTag(tag: String) = tag.substringBefore(':').trim() to tag.substringAfter(':').trim() + +private fun wrapTag(namespace: String, tag: String) = if (tag.contains(' ')) { + "$namespace:\"$tag$\"" +} else { + "$namespace:$tag$" +}