mirror of
https://github.com/oxen-io/session-android.git
synced 2025-06-09 16:08:33 +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.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.util.Log
|
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.VelocityTracker
|
import android.view.VelocityTracker
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.thoughtcrime.securesms.loki.utilities.disableClipping
|
import org.thoughtcrime.securesms.loki.utilities.disableClipping
|
||||||
|
import org.thoughtcrime.securesms.loki.utilities.toPx
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
class ConversationRecyclerView : RecyclerView {
|
class ConversationRecyclerView : RecyclerView {
|
||||||
|
private val maxLongPressVelocityY = toPx(10, resources)
|
||||||
|
private val minSwipeVelocityX = toPx(10, resources)
|
||||||
private var velocityTracker: VelocityTracker? = null
|
private var velocityTracker: VelocityTracker? = null
|
||||||
|
|
||||||
constructor(context: Context) : super(context) { initialize() }
|
constructor(context: Context) : super(context) { initialize() }
|
||||||
@ -27,6 +29,8 @@ class ConversationRecyclerView : RecyclerView {
|
|||||||
val vy = velocityTracker.yVelocity
|
val vy = velocityTracker.yVelocity
|
||||||
// Only allow swipes to the left; allowing swipes to the right interferes with some back gestures
|
// Only allow swipes to the left; allowing swipes to the right interferes with some back gestures
|
||||||
if (vx > 0) { return super.onInterceptTouchEvent(e) }
|
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
|
// 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
|
// get passed on to the message view
|
||||||
if (abs(vx) > abs(vy)) {
|
if (abs(vx) > abs(vy)) {
|
||||||
|
@ -189,7 +189,8 @@ class VisibleMessageView : LinearLayout {
|
|||||||
when (event.action) {
|
when (event.action) {
|
||||||
MotionEvent.ACTION_DOWN -> onDown(event)
|
MotionEvent.ACTION_DOWN -> onDown(event)
|
||||||
MotionEvent.ACTION_MOVE -> onMove(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
|
return true
|
||||||
}
|
}
|
||||||
@ -227,7 +228,23 @@ class VisibleMessageView : LinearLayout {
|
|||||||
previousTranslationX = x
|
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) {
|
if (abs(translationX) > VisibleMessageView.swipeToReplyThreshold) {
|
||||||
onSwipeToReply?.invoke()
|
onSwipeToReply?.invoke()
|
||||||
} else if ((Date().time - onDownTimestamp) < VisibleMessageView.longPressDurationThreshold) {
|
} else if ((Date().time - onDownTimestamp) < VisibleMessageView.longPressDurationThreshold) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user