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