Start preparing for Manga Info Compose

This commit is contained in:
Jobobby04
2022-06-04 14:08:39 -04:00
parent fef7808bb4
commit 706315625e
21 changed files with 661 additions and 13 deletions
@@ -4,6 +4,11 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterEhBinding
@@ -13,6 +18,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil
import exh.metadata.bindDrawable
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
class EHentaiDescriptionAdapter(
@@ -35,7 +41,7 @@ class EHentaiDescriptionAdapter(
inner class EHentaiDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is EHentaiSearchMetadata) return
binding.genre.text =
@@ -107,3 +113,90 @@ class EHentaiDescriptionAdapter(
}
}
}
@Composable
fun EHentaiDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
EHentaiDescription(controller = controller, meta = meta)
}
@Composable
private fun EHentaiDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterEhBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is EHentaiSearchMetadata) return@AndroidView
val binding = DescriptionAdapterEhBinding.bind(it)
binding.genre.text =
meta.genre?.let { MetadataUtil.getGenreAndColour(context, it) }
?.let {
binding.genre.setBackgroundColor(it.first)
it.second
}
?: meta.genre
?: context.getString(R.string.unknown)
binding.visible.text = context.getString(R.string.is_visible, meta.visible ?: context.getString(R.string.unknown))
binding.favorites.text = (meta.favorites ?: 0).toString()
binding.favorites.bindDrawable(context, R.drawable.ic_book_24dp)
binding.uploader.text = meta.uploader ?: context.getString(R.string.unknown)
binding.size.text = MetadataUtil.humanReadableByteCount(meta.size ?: 0, true)
binding.size.bindDrawable(context, R.drawable.ic_outline_sd_card_24)
val length = meta.length ?: 0
binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, length, length)
binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24)
val language = meta.language ?: context.getString(R.string.unknown)
binding.language.text = if (meta.translated == true) {
context.getString(R.string.language_translated, language)
} else {
language
}
val ratingFloat = meta.averageRating?.toFloat()
binding.ratingBar.rating = ratingFloat ?: 0F
@SuppressLint("SetTextI18n")
binding.rating.text = (ratingFloat ?: 0F).toString() + " - " + MetadataUtil.getRatingString(context, ratingFloat?.times(2))
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
listOf(
binding.favorites,
binding.genre,
binding.language,
binding.pages,
binding.rating,
binding.uploader,
binding.visible,
).forEach { textView ->
textView.setOnLongClickListener {
context.copyToClipboard(
textView.text.toString(),
textView.text.toString(),
)
true
}
}
binding.uploader.setOnClickListener {
meta.uploader?.let { controller.performSearch("uploader:\"$it\"") }
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -3,6 +3,11 @@ package exh.ui.metadata.adapters
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapter8mBinding
@@ -11,6 +16,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.bindDrawable
import exh.metadata.metadata.EightMusesSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
class EightMusesDescriptionAdapter(
@@ -33,7 +39,7 @@ class EightMusesDescriptionAdapter(
inner class EightMusesDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is EightMusesSearchMetadata) return
binding.title.text = meta.title ?: itemView.context.getString(R.string.unknown)
@@ -58,3 +64,43 @@ class EightMusesDescriptionAdapter(
}
}
}
@Composable
fun EightMusesDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
EightMusesDescription(controller = controller, meta = meta)
}
@Composable
private fun EightMusesDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapter8mBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is EightMusesSearchMetadata) return@AndroidView
val binding = DescriptionAdapter8mBinding.bind(it)
binding.title.text = meta.title ?: context.getString(R.string.unknown)
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
binding.title.setOnLongClickListener {
context.copyToClipboard(
binding.title.text.toString(),
binding.title.text.toString(),
)
true
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -3,6 +3,11 @@ package exh.ui.metadata.adapters
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterHbBinding
@@ -11,6 +16,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.bindDrawable
import exh.metadata.metadata.HBrowseSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
class HBrowseDescriptionAdapter(
@@ -33,7 +39,7 @@ class HBrowseDescriptionAdapter(
inner class HBrowseDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is HBrowseSearchMetadata) return
binding.pages.text = itemView.resources.getQuantityString(R.plurals.num_pages, meta.length ?: 0, meta.length ?: 0)
@@ -59,3 +65,44 @@ class HBrowseDescriptionAdapter(
}
}
}
@Composable
fun HBrowseDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
HBrowseDescription(controller = controller, meta = meta)
}
@Composable
private fun HBrowseDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterHbBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is HBrowseSearchMetadata) return@AndroidView
val binding = DescriptionAdapterHbBinding.bind(it)
binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.length ?: 0, meta.length ?: 0)
binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24)
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
binding.pages.setOnLongClickListener {
context.copyToClipboard(
binding.pages.text.toString(),
binding.pages.text.toString(),
)
true
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -3,6 +3,11 @@ package exh.ui.metadata.adapters
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterHiBinding
@@ -12,6 +17,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil
import exh.metadata.bindDrawable
import exh.metadata.metadata.HitomiSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
import java.util.Date
@@ -35,7 +41,7 @@ class HitomiDescriptionAdapter(
inner class HitomiDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is HitomiSearchMetadata) return
binding.genre.text = meta.genre?.let { MetadataUtil.getGenreAndColour(itemView.context, it) }?.let {
@@ -72,3 +78,55 @@ class HitomiDescriptionAdapter(
}
}
}
@Composable
fun HitomiDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
HitomiDescription(controller = controller, meta = meta)
}
@Composable
private fun HitomiDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterHiBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is HitomiSearchMetadata) return@AndroidView
val binding = DescriptionAdapterHiBinding.bind(it)
binding.genre.text = meta.genre?.let { MetadataUtil.getGenreAndColour(context, it) }?.let {
binding.genre.setBackgroundColor(it.first)
it.second
} ?: meta.genre ?: context.getString(R.string.unknown)
binding.whenPosted.text = MetadataUtil.EX_DATE_FORMAT.format(Date(meta.uploadDate ?: 0))
binding.language.text = meta.language ?: context.getString(R.string.unknown)
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
listOf(
binding.genre,
binding.language,
binding.whenPosted,
).forEach { textView ->
textView.setOnLongClickListener {
context.copyToClipboard(
textView.text.toString(),
textView.text.toString(),
)
true
}
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -4,6 +4,11 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
@@ -14,6 +19,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil.getRatingString
import exh.metadata.bindDrawable
import exh.metadata.metadata.MangaDexSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
import kotlin.math.round
@@ -38,7 +44,7 @@ class MangaDexDescriptionAdapter(
inner class MangaDexDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is MangaDexSearchMetadata) return
// todo
@@ -69,3 +75,49 @@ class MangaDexDescriptionAdapter(
}
}
}
@Composable
fun MangaDexDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
MangaDexDescription(controller = controller, meta = meta)
}
@Composable
private fun MangaDexDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterMdBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is MangaDexSearchMetadata) return@AndroidView
val binding = DescriptionAdapterMdBinding.bind(it)
// todo
val ratingFloat = meta.rating
binding.ratingBar.rating = ratingFloat?.div(2F) ?: 0F
@SuppressLint("SetTextI18n")
binding.rating.text = (round((ratingFloat ?: 0F) * 100.0) / 100.0).toString() + " - " + getRatingString(context, ratingFloat)
binding.rating.isVisible = ratingFloat != null
binding.ratingBar.isVisible = ratingFloat != null
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
binding.rating.setOnLongClickListener {
context.copyToClipboard(
binding.rating.text.toString(),
binding.rating.text.toString(),
)
true
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -4,6 +4,11 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterNhBinding
@@ -13,6 +18,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil
import exh.metadata.bindDrawable
import exh.metadata.metadata.NHentaiSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
import java.util.Date
@@ -37,7 +43,7 @@ class NHentaiDescriptionAdapter(
inner class NHentaiDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is NHentaiSearchMetadata) return
binding.genre.text = meta.tags.filter { it.namespace == NHentaiSearchMetadata.NHENTAI_CATEGORIES_NAMESPACE }.let { tags ->
@@ -91,3 +97,72 @@ class NHentaiDescriptionAdapter(
}
}
}
@Composable
fun NHentaiDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
NHentaiDescription(controller = controller, meta = meta)
}
@Composable
private fun NHentaiDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterNhBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is NHentaiSearchMetadata) return@AndroidView
val binding = DescriptionAdapterNhBinding.bind(it)
binding.genre.text = meta.tags.filter { it.namespace == NHentaiSearchMetadata.NHENTAI_CATEGORIES_NAMESPACE }.let { tags ->
if (tags.isNotEmpty()) tags.joinToString(transform = { it.name }) else null
}.let { categoriesString ->
categoriesString?.let { MetadataUtil.getGenreAndColour(context, it) }?.let {
binding.genre.setBackgroundColor(it.first)
it.second
} ?: categoriesString ?: context.getString(R.string.unknown)
}
meta.favoritesCount?.let {
if (it == 0L) return@let
binding.favorites.text = it.toString()
binding.favorites.bindDrawable(context, R.drawable.ic_book_24dp)
}
binding.whenPosted.text = MetadataUtil.EX_DATE_FORMAT.format(Date((meta.uploadDate ?: 0) * 1000))
binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.pageImageTypes.size, meta.pageImageTypes.size)
binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24)
@SuppressLint("SetTextI18n")
binding.id.text = "#" + (meta.nhId ?: 0)
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
listOf(
binding.favorites,
binding.genre,
binding.id,
binding.pages,
binding.whenPosted,
).forEach { textView ->
textView.setOnLongClickListener {
context.copyToClipboard(
textView.text.toString(),
textView.text.toString(),
)
true
}
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -4,6 +4,11 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterPeBinding
@@ -13,6 +18,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil
import exh.metadata.bindDrawable
import exh.metadata.metadata.PervEdenSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
import java.util.Locale
import kotlin.math.round
@@ -37,7 +43,7 @@ class PervEdenDescriptionAdapter(
inner class PervEdenDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is PervEdenSearchMetadata) return
binding.genre.text = meta.genre?.let { MetadataUtil.getGenreAndColour(itemView.context, it) }?.let {
@@ -81,3 +87,62 @@ class PervEdenDescriptionAdapter(
}
}
}
@Composable
fun PervEdenDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
PervEdenDescription(controller = controller, meta = meta)
}
@Composable
private fun PervEdenDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterPeBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is PervEdenSearchMetadata) return@AndroidView
val binding = DescriptionAdapterPeBinding.bind(it)
binding.genre.text = meta.genre?.let { MetadataUtil.getGenreAndColour(context, it) }?.let {
binding.genre.setBackgroundColor(it.first)
it.second
} ?: meta.genre ?: context.getString(R.string.unknown)
val language = meta.lang
binding.language.text = if (language != null) {
val local = Locale(language)
local.displayName
} else context.getString(R.string.unknown)
binding.ratingBar.rating = meta.rating ?: 0F
@SuppressLint("SetTextI18n")
binding.rating.text = (round((meta.rating ?: 0F) * 100.0) / 100.0).toString() + " - " + MetadataUtil.getRatingString(context, meta.rating?.times(2))
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
listOf(
binding.genre,
binding.language,
binding.rating,
).forEach { textView ->
textView.setOnLongClickListener {
context.copyToClipboard(
textView.text.toString(),
textView.text.toString(),
)
true
}
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -4,6 +4,11 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterPuBinding
@@ -13,6 +18,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil
import exh.metadata.bindDrawable
import exh.metadata.metadata.PururinSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
import kotlin.math.round
@@ -36,7 +42,7 @@ class PururinDescriptionAdapter(
inner class PururinDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is PururinSearchMetadata) return
binding.genre.text = meta.tags.find { it.namespace == PururinSearchMetadata.TAG_NAMESPACE_CATEGORY }.let { genre ->
@@ -87,3 +93,69 @@ class PururinDescriptionAdapter(
}
}
}
@Composable
fun PururinDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
PururinDescription(controller = controller, meta = meta)
}
@Composable
private fun PururinDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterPuBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is PururinSearchMetadata) return@AndroidView
val binding = DescriptionAdapterPuBinding.bind(it)
binding.genre.text = meta.tags.find { it.namespace == PururinSearchMetadata.TAG_NAMESPACE_CATEGORY }.let { genre ->
genre?.let { MetadataUtil.getGenreAndColour(context, it.name) }?.let {
binding.genre.setBackgroundColor(it.first)
it.second
} ?: genre?.name ?: context.getString(R.string.unknown)
}
binding.uploader.text = meta.uploaderDisp ?: meta.uploader.orEmpty()
binding.size.text = meta.fileSize ?: context.getString(R.string.unknown)
binding.size.bindDrawable(context, R.drawable.ic_outline_sd_card_24)
binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.pages ?: 0, meta.pages ?: 0)
binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24)
val ratingFloat = meta.averageRating?.toFloat()
binding.ratingBar.rating = ratingFloat ?: 0F
@SuppressLint("SetTextI18n")
binding.rating.text = (round((ratingFloat ?: 0F) * 100.0) / 100.0).toString() + " - " + MetadataUtil.getRatingString(context, ratingFloat?.times(2))
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
listOf(
binding.genre,
binding.pages,
binding.rating,
binding.size,
binding.uploader,
).forEach { textView ->
textView.setOnLongClickListener {
context.copyToClipboard(
textView.text.toString(),
textView.text.toString(),
)
true
}
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}
@@ -4,6 +4,11 @@ import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.DescriptionAdapterTsBinding
@@ -13,6 +18,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard
import exh.metadata.MetadataUtil
import exh.metadata.bindDrawable
import exh.metadata.metadata.TsuminoSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.ui.metadata.MetadataViewController
import java.util.Date
import kotlin.math.round
@@ -37,7 +43,7 @@ class TsuminoDescriptionAdapter(
inner class TsuminoDescriptionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind() {
val meta = controller.presenter.meta
val meta = controller.presenter.meta.value
if (meta == null || meta !is TsuminoSearchMetadata) return
binding.genre.text = meta.category?.let { MetadataUtil.getGenreAndColour(itemView.context, it) }?.let {
@@ -88,3 +94,69 @@ class TsuminoDescriptionAdapter(
}
}
}
@Composable
fun TsuminoDescription(controller: MangaController) {
val meta by controller.presenter.meta.collectAsState()
TsuminoDescription(controller = controller, meta = meta)
}
@Composable
private fun TsuminoDescription(controller: MangaController, meta: RaisedSearchMetadata?) {
val context = LocalContext.current
AndroidView(
factory = { factoryContext ->
DescriptionAdapterTsBinding.inflate(LayoutInflater.from(factoryContext)).root
},
update = {
if (meta == null || meta !is TsuminoSearchMetadata) return@AndroidView
val binding = DescriptionAdapterTsBinding.bind(it)
binding.genre.text = meta.category?.let { MetadataUtil.getGenreAndColour(context, it) }?.let {
binding.genre.setBackgroundColor(it.first)
it.second
} ?: meta.category ?: context.getString(R.string.unknown)
binding.favorites.text = (meta.favorites ?: 0).toString()
binding.favorites.bindDrawable(context, R.drawable.ic_book_24dp)
binding.whenPosted.text = TsuminoSearchMetadata.TSUMINO_DATE_FORMAT.format(Date(meta.uploadDate ?: 0))
binding.uploader.text = meta.uploader ?: context.getString(R.string.unknown)
binding.pages.text = context.resources.getQuantityString(R.plurals.num_pages, meta.length ?: 0, meta.length ?: 0)
binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24)
binding.ratingBar.rating = meta.averageRating ?: 0F
@SuppressLint("SetTextI18n")
binding.rating.text = (round((meta.averageRating ?: 0F) * 100.0) / 100.0).toString() + " - " + MetadataUtil.getRatingString(context, meta.averageRating?.times(2))
binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
listOf(
binding.favorites,
binding.genre,
binding.pages,
binding.rating,
binding.uploader,
binding.whenPosted,
).forEach { textView ->
textView.setOnLongClickListener {
context.copyToClipboard(
textView.text.toString(),
textView.text.toString(),
)
true
}
}
binding.moreInfo.setOnClickListener {
controller.router?.pushController(
MetadataViewController(
controller.manga,
),
)
}
},
)
}