From 6c98c9ccf229387dd8d340f94da06c69ef6f92ab Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 19 Dec 2022 16:32:45 +0100 Subject: [PATCH] fix broken long click --- .../displayitems/FooterStatusDisplayItem.java | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java index e65cd4bfc..1f239f704 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java @@ -6,12 +6,11 @@ import android.os.Build; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; -import android.view.animation.AnimationSet; -import android.view.animation.ScaleAnimation; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -50,6 +49,9 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{ private final ImageView share; private static final Animation opacityOut, opacityIn; + private View touchingView = null; + private final Runnable longClickRunnable = () -> { if (touchingView != null) touchingView.performLongClick(); }; + private final View.AccessibilityDelegate buttonAccessibilityDelegate=new View.AccessibilityDelegate(){ @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info){ @@ -119,6 +121,26 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{ } } + private boolean onButtonTouch(View v, MotionEvent event){ + int action = event.getAction(); + // 20dp to center in middle of icon, because: (icon width = 24dp) / 2 + (paddingStart = 8dp) + v.setPivotX(V.dp(20)); + long eventDuration = event.getEventTime() - event.getDownTime(); + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + touchingView = null; + v.removeCallbacks(longClickRunnable); + v.animate().scaleX(1).scaleY(1).setInterpolator(CubicBezierInterpolator.DEFAULT).setDuration(150).start(); + if (action == MotionEvent.ACTION_UP && eventDuration < ViewConfiguration.getLongPressTimeout()) v.performClick(); + else v.startAnimation(opacityIn); + } else if (action == MotionEvent.ACTION_DOWN) { + touchingView = v; + v.postDelayed(longClickRunnable, ViewConfiguration.getLongPressTimeout()); + v.startAnimation(opacityOut); + v.animate().scaleX(0.85f).scaleY(0.85f).setInterpolator(CubicBezierInterpolator.DEFAULT).setDuration(75).start(); + } + return true; + } + private void onReplyClick(View v){ v.startAnimation(opacityIn); Bundle args=new Bundle(); @@ -127,21 +149,6 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{ Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args); } - private boolean onButtonTouch(View v, MotionEvent event){ - int action = event.getAction(); - // 20dp to center in middle of icon, because: (icon width = 24dp) / 2 + (paddingStart = 8dp) - v.setPivotX(V.dp(20)); - if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { - v.animate().scaleX(1).scaleY(1).setInterpolator(CubicBezierInterpolator.DEFAULT).setDuration(150).start(); - if (action == MotionEvent.ACTION_UP) v.performClick(); - else v.startAnimation(opacityIn); - } else if (action == MotionEvent.ACTION_DOWN) { - v.startAnimation(opacityOut); - v.animate().scaleX(0.85f).scaleY(0.85f).setInterpolator(CubicBezierInterpolator.DEFAULT).setDuration(75).start(); - } - return true; - } - private void onBoostClick(View v){ boost.setSelected(!item.status.reblogged); AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setReblogged(item.status, !item.status.reblogged, r->{