mirror of
https://github.com/oxen-io/session-android.git
synced 2025-01-12 10:13:39 +00:00
Tweak long press vs scroll gesture handling
This commit is contained in:
parent
eac0a87e40
commit
c6cadf8d35
@ -2,14 +2,16 @@ package org.thoughtcrime.securesms.conversation.v2
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.util.Log
|
||||
import android.view.MotionEvent
|
||||
import android.view.VelocityTracker
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.thoughtcrime.securesms.loki.utilities.disableClipping
|
||||
import org.thoughtcrime.securesms.loki.utilities.toPx
|
||||
import kotlin.math.abs
|
||||
|
||||
class ConversationRecyclerView : RecyclerView {
|
||||
private val maxLongPressVelocityY = toPx(10, resources)
|
||||
private val minSwipeVelocityX = toPx(10, resources)
|
||||
private var velocityTracker: VelocityTracker? = null
|
||||
|
||||
constructor(context: Context) : super(context) { initialize() }
|
||||
@ -27,6 +29,8 @@ class ConversationRecyclerView : RecyclerView {
|
||||
val vy = velocityTracker.yVelocity
|
||||
// Only allow swipes to the left; allowing swipes to the right interferes with some back gestures
|
||||
if (vx > 0) { return super.onInterceptTouchEvent(e) }
|
||||
// Distinguish between scrolling gestures and long presses
|
||||
if (abs(vy) > maxLongPressVelocityY && abs(vx) < minSwipeVelocityX) { return super.onInterceptTouchEvent(e) }
|
||||
// Return false if abs(v.x) > abs(v.y) so that only swipes that are more horizontal than vertical
|
||||
// get passed on to the message view
|
||||
if (abs(vx) > abs(vy)) {
|
||||
|
@ -189,7 +189,8 @@ class VisibleMessageView : LinearLayout {
|
||||
when (event.action) {
|
||||
MotionEvent.ACTION_DOWN -> onDown(event)
|
||||
MotionEvent.ACTION_MOVE -> onMove(event)
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> onFinish(event)
|
||||
MotionEvent.ACTION_CANCEL -> onCancel(event)
|
||||
MotionEvent.ACTION_UP -> onUp(event)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@ -227,7 +228,23 @@ class VisibleMessageView : LinearLayout {
|
||||
previousTranslationX = x
|
||||
}
|
||||
|
||||
private fun onFinish(event: MotionEvent) {
|
||||
private fun onCancel(event: MotionEvent) {
|
||||
longPressCallback?.let { gestureHandler.removeCallbacks(it) }
|
||||
animate()
|
||||
.translationX(0.0f)
|
||||
.setDuration(150)
|
||||
.setUpdateListener {
|
||||
postInvalidate() // Ensure onDraw(canvas:) is called
|
||||
}
|
||||
.start()
|
||||
// Bit of a hack to keep the date break text view from moving
|
||||
dateBreakTextView.animate()
|
||||
.translationX(0.0f)
|
||||
.setDuration(150)
|
||||
.start()
|
||||
}
|
||||
|
||||
private fun onUp(event: MotionEvent) {
|
||||
if (abs(translationX) > VisibleMessageView.swipeToReplyThreshold) {
|
||||
onSwipeToReply?.invoke()
|
||||
} else if ((Date().time - onDownTimestamp) < VisibleMessageView.longPressDurationThreshold) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user