diff --git a/core/api/current.txt b/core/api/current.txt index 3d76b66880537..2425a0c057070 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52150,6 +52150,7 @@ package android.view { public static interface View.OnLongClickListener { method public boolean onLongClick(android.view.View); + method public default boolean onLongClickUseDefaultHapticFeedback(@NonNull android.view.View); } public static interface View.OnScrollChangeListener { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 508c6bd64a4c1..7b53843db568b 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -7698,8 +7698,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, boolean handled = false; final ListenerInfo li = mListenerInfo; + boolean shouldPerformHapticFeedback = true; if (li != null && li.mOnLongClickListener != null) { handled = li.mOnLongClickListener.onLongClick(View.this); + if (handled) { + shouldPerformHapticFeedback = + li.mOnLongClickListener.onLongClickUseDefaultHapticFeedback(View.this); + } } if (!handled) { final boolean isAnchored = !Float.isNaN(x) && !Float.isNaN(y); @@ -7710,7 +7715,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, handled = showLongClickTooltip((int) x, (int) y); } } - if (handled) { + if (handled && shouldPerformHapticFeedback) { performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); } return handled; @@ -29922,6 +29927,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return true if the callback consumed the long click, false otherwise. */ boolean onLongClick(View v); + + /** + * Returns whether the default {@link HapticFeedbackConstants#LONG_PRESS} haptic feedback + * is performed when this listener has consumed the long click. This method is called + * immediately after {@link #onLongClick} has returned true. + * + * @param v The view that was clicked and held. + * @return true to perform the default {@link HapticFeedbackConstants#LONG_PRESS} haptic + * feedback, or false if the handler manages all haptics itself. + */ + default boolean onLongClickUseDefaultHapticFeedback(@NonNull View v) { + return true; + } } /**