From 9f5d4ed52c1c46bc9286d04a1fed2d5a7f4ee0f8 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 7 Jul 2024 09:38:34 +0300 Subject: [PATCH] Refactor details title expansion --- .../core/ui/widgets/SelectableTextView.kt | 7 ++- .../kotatsu/details/ui/DetailsActivity.kt | 33 +------------- .../kotatsu/details/ui/TitleExpandListener.kt | 45 +++++++++++++++++++ app/src/main/res/layout/activity_details.xml | 2 +- app/src/main/res/values/integers.xml | 1 + 5 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/details/ui/TitleExpandListener.kt diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt index 1f80fb57b..41e0f2fc8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/widgets/SelectableTextView.kt @@ -23,11 +23,16 @@ class SelectableTextView @JvmOverloads constructor( private fun fixSelectionRange() { if (selectionStart < 0 || selectionEnd < 0) { val spannableText = text as? Spannable ?: return - Selection.setSelection(spannableText, text.length) + Selection.setSelection(spannableText, spannableText.length) } } override fun scrollTo(x: Int, y: Int) { super.scrollTo(0, 0) } + + fun selectAll() { + val spannableText = text as? Spannable ?: return + Selection.selectAll(spannableText) + } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 302d60824..c3e4b772d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -3,11 +3,6 @@ package org.koitharu.kotatsu.details.ui import android.content.Context import android.content.Intent import android.graphics.Color -import android.view.MotionEvent -import android.content.ClipData -import android.content.ClipboardManager -import android.view.GestureDetector -import android.view.ViewGroup import android.os.Bundle import android.text.style.DynamicDrawableSpan import android.text.style.ForegroundColorSpan @@ -128,7 +123,6 @@ class DetailsActivity : lateinit var tagHighlighter: ListExtraProvider private val viewModel: DetailsViewModel by viewModels() - private lateinit var gestureDetector: GestureDetector private lateinit var menuProvider: DetailsMenuProvider override fun onCreate(savedInstanceState: Bundle?) { @@ -162,32 +156,7 @@ class DetailsActivity : viewBinding.containerBottomSheet?.let { sheet -> onBackPressedDispatcher.addCallback(BottomSheetCollapseCallback(sheet)) } - gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() { - override fun onSingleTapConfirmed(e: MotionEvent): Boolean { - val tv = viewBinding.textViewTitle - TransitionManager.beginDelayedTransition(tv.parent as ViewGroup) - if (tv.maxLines == 5) { - tv.maxLines = 20 // Expand text - } else { - tv.maxLines = 5 // Collapse text - } - return true - } - - override fun onLongPress(e: MotionEvent) { - val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("copied text", viewBinding.textViewTitle.text) - clipboardManager.setPrimaryClip(clip) - Toast.makeText(this@DetailsActivity, "Text copied", Toast.LENGTH_SHORT).show() - } - }) - - viewBinding.textViewTitle.setOnTouchListener { _, motionEvent -> - gestureDetector.onTouchEvent(motionEvent) - true - } - - + TitleExpandListener(viewBinding.textViewTitle).attach() viewModel.details.filterNotNull().observe(this, ::onMangaUpdated) viewModel.onMangaRemoved.observeEvent(this, ::onMangaRemoved) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/TitleExpandListener.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/TitleExpandListener.kt new file mode 100644 index 000000000..5d5765100 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/TitleExpandListener.kt @@ -0,0 +1,45 @@ +package org.koitharu.kotatsu.details.ui + +import android.annotation.SuppressLint +import android.transition.TransitionManager +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.View +import android.view.View.OnTouchListener +import android.view.ViewGroup +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.ui.widgets.SelectableTextView +import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled + +@SuppressLint("ClickableViewAccessibility") +class TitleExpandListener( + private val textView: SelectableTextView, +) : GestureDetector.SimpleOnGestureListener(), OnTouchListener { + + private val gestureDetector = GestureDetector(textView.context, this) + private val linesExpanded = textView.resources.getInteger(R.integer.details_description_lines) + private val linesCollapsed = textView.resources.getInteger(R.integer.details_title_lines) + + override fun onTouch(v: View?, event: MotionEvent) = gestureDetector.onTouchEvent(event) + + override fun onSingleTapConfirmed(e: MotionEvent): Boolean { + if (textView.context.isAnimationsEnabled) { + TransitionManager.beginDelayedTransition(textView.parent as ViewGroup) + } + if (textView.maxLines in 1 until Integer.MAX_VALUE) { + textView.maxLines = Integer.MAX_VALUE + } else { + textView.maxLines = linesCollapsed + } + return true + } + + override fun onLongPress(e: MotionEvent) { + textView.maxLines = Integer.MAX_VALUE + textView.selectAll() + } + + fun attach() { + textView.setOnTouchListener(this) + } +} diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 51a35a540..9645983aa 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -84,7 +84,7 @@ android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:ellipsize="end" - android:maxLines="5" + android:maxLines="@integer/details_title_lines" android:textAppearance="?attr/textAppearanceHeadlineSmall" android:textIsSelectable="true" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index e405948e9..5c1164864 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -8,6 +8,7 @@ 3 2 4 + 4 450