From 94604921f96050c3765ddb5e75db4b37cf5ffc9b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 5 Jan 2020 21:58:48 -0500 Subject: [PATCH] Fix issue with swipe-to-reply triggering incorrectly. Fixes #9227 --- .../ConversationItemSwipeCallback.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback.java b/src/org/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback.java index 748fd99a8f..dfe34a18f7 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.conversation; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.os.Vibrator; @@ -20,7 +21,8 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback { private static long SWIPE_SUCCESS_VIBE_TIME_MS = 10; private boolean swipeBack; - private boolean shouldTriggerSwipeFeedback = true; + private boolean shouldTriggerSwipeFeedback; + private boolean canTriggerSwipe; private float latestDownX; private float latestDownY; @@ -32,9 +34,11 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback { @NonNull OnSwipeListener onSwipeListener) { super(0, ItemTouchHelper.END); - this.itemTouchListener = new ConversationItemTouchListener(this::updateLatestDownCoordinate); - this.swipeAvailabilityProvider = swipeAvailabilityProvider; - this.onSwipeListener = onSwipeListener; + this.itemTouchListener = new ConversationItemTouchListener(this::updateLatestDownCoordinate); + this.swipeAvailabilityProvider = swipeAvailabilityProvider; + this.onSwipeListener = onSwipeListener; + this.shouldTriggerSwipeFeedback = true; + this.canTriggerSwipe = true; } void attachToRecyclerView(@NonNull RecyclerView recyclerView) { @@ -86,12 +90,17 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE && isCorrectSwipeDir) { ConversationSwipeAnimationHelper.update((ConversationItem) viewHolder.itemView, Math.abs(dx), sign); handleSwipeFeedback((ConversationItem) viewHolder.itemView, Math.abs(dx)); - setTouchListener(recyclerView, viewHolder, Math.abs(dx)); + if (canTriggerSwipe) { + setTouchListener(recyclerView, viewHolder, Math.abs(dx)); + } } else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE || dx == 0) { ConversationSwipeAnimationHelper.update((ConversationItem) viewHolder.itemView, 0, 1); } - if (dx == 0) shouldTriggerSwipeFeedback = true; + if (dx == 0) { + shouldTriggerSwipeFeedback = true; + canTriggerSwipe = true; + } } private void handleSwipeFeedback(@NonNull ConversationItem item, float dx) { @@ -111,6 +120,7 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback { onSwipeListener.onSwipe(messageRecord); } + @SuppressLint("ClickableViewAccessibility") private void setTouchListener(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dx) @@ -137,6 +147,7 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback { float dx) { if (dx > SWIPE_SUCCESS_DX) { + canTriggerSwipe = false; onSwiped(viewHolder); if (shouldTriggerSwipeFeedback) { vibrate(viewHolder.itemView.getContext());