diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt index 90dc2ef228..ea10f0176e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt @@ -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)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index cda12828a9..5d8ef91856 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -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) {