Expandable manga description

This commit is contained in:
Koitharu
2023-07-20 13:33:48 +03:00
parent 80149b1ce7
commit 82a3b93214
6 changed files with 39 additions and 73 deletions

View File

@@ -1,32 +0,0 @@
package org.koitharu.kotatsu.details.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.fragment.app.FragmentManager
import org.koitharu.kotatsu.core.ui.sheet.BaseAdaptiveSheet
import org.koitharu.kotatsu.core.util.ext.showDistinct
import org.koitharu.kotatsu.core.util.ext.withArgs
import org.koitharu.kotatsu.databinding.SheetDescriptionBinding
class DescriptionSheet : BaseAdaptiveSheet<SheetDescriptionBinding>() {
override fun onCreateViewBinding(inflater: LayoutInflater, container: ViewGroup?): SheetDescriptionBinding {
return SheetDescriptionBinding.inflate(inflater, container, false)
}
override fun onViewBindingCreated(binding: SheetDescriptionBinding, savedInstanceState: Bundle?) {
super.onViewBindingCreated(binding, savedInstanceState)
binding.textViewDescription.text = arguments?.getCharSequence(ARG_CONTENT)
}
companion object {
private const val ARG_CONTENT = "content"
private const val TAG = "DescriptionSheet"
fun show(fm: FragmentManager, content: CharSequence) = DescriptionSheet().withArgs(1) {
putCharSequence(ARG_CONTENT, content)
}.showDistinct(fm, TAG)
}
}

View File

@@ -2,9 +2,11 @@ package org.koitharu.kotatsu.details.ui
import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.transition.TransitionManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.Toast
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat
@@ -36,7 +38,9 @@ import org.koitharu.kotatsu.core.util.ext.crossfade
import org.koitharu.kotatsu.core.util.ext.drawableTop
import org.koitharu.kotatsu.core.util.ext.enqueueWith
import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty
import org.koitharu.kotatsu.core.util.ext.isTextTruncated
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.parentView
import org.koitharu.kotatsu.core.util.ext.resolveDp
import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf
import org.koitharu.kotatsu.core.util.ext.textAndVisible
@@ -70,7 +74,7 @@ class DetailsFragment :
BaseFragment<FragmentDetailsBinding>(),
View.OnClickListener,
ChipsView.OnChipClickListener,
OnListItemClickListener<Bookmark> {
OnListItemClickListener<Bookmark>, ViewTreeObserver.OnDrawListener {
@Inject
lateinit var coil: ImageLoader
@@ -94,6 +98,7 @@ class DetailsFragment :
binding.buttonScrobblingMore.setOnClickListener(this)
binding.buttonRelatedMore.setOnClickListener(this)
binding.infoLayout.textViewSource.setOnClickListener(this)
binding.textViewDescription.viewTreeObserver.addOnDrawListener(this)
binding.textViewDescription.movementMethod = LinkMovementMethod.getInstance()
binding.chipsTags.onChipClickListener = this
binding.recyclerViewRelated.addItemDecoration(
@@ -132,6 +137,13 @@ class DetailsFragment :
return true
}
override fun onDraw() {
viewBinding?.run {
buttonDescriptionMore.isVisible = textViewDescription.maxLines == Int.MAX_VALUE ||
textViewDescription.isTextTruncated
}
}
private fun onMangaUpdated(manga: Manga) {
with(requireViewBinding()) {
// Main
@@ -189,12 +201,13 @@ class DetailsFragment :
}
private fun onDescriptionChanged(description: CharSequence?) {
val tv = requireViewBinding().textViewDescription
if (description.isNullOrBlank()) {
requireViewBinding().textViewDescription.setText(R.string.no_description)
tv.setText(R.string.no_description)
} else {
requireViewBinding().textViewDescription.text = description
tv.text = description
}
requireViewBinding().buttonDescriptionMore.isGone = description.isNullOrBlank()
requireViewBinding().buttonDescriptionMore.isVisible = tv.isTextTruncated
}
private fun onLocalSizeChanged(size: Long) {
@@ -300,7 +313,13 @@ class DetailsFragment :
}
R.id.button_description_more -> {
DescriptionSheet.show(parentFragmentManager, viewModel.description.value ?: return)
val tv = requireViewBinding().textViewDescription
TransitionManager.beginDelayedTransition(tv.parentView)
if (tv.maxLines in 1 until Integer.MAX_VALUE) {
tv.maxLines = Integer.MAX_VALUE
} else {
tv.maxLines = resources.getInteger(R.integer.details_description_lines)
}
}
R.id.button_scrobbling_more -> {