diff options
author | Haamed Gheibi <haamed@google.com> | 2022-03-09 12:05:14 -0800 |
---|---|---|
committer | Weijie Wang <quic_weijiew@quicinc.com> | 2022-03-15 15:38:25 +0800 |
commit | 12bb6d3cbf05cea529a165917c7430af607056f2 (patch) | |
tree | ff322630f9716306236ca70ecae1f265ae2aa2c6 /packages/SystemUI/src/com/android/systemui/SwipeHelper.java | |
parent | a42412b7fc93a0eb852d8bf1a4d001f7df7f43b3 (diff) |
Merge SP2A.220305.013
Bug: 220074017
Change-Id: Idfdd94e902f656ac65a2a75dfdd199f6f85ba472
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/SwipeHelper.java')
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/SwipeHelper.java | 102 |
1 files changed, 76 insertions, 26 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 8c63f7bec23c..3555e8d8e193 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -25,6 +25,8 @@ import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.Notification; +import android.app.PendingIntent; import android.content.res.Resources; import android.graphics.RectF; import android.os.Handler; @@ -73,6 +75,9 @@ public class SwipeHelper implements Gefingerpoken { private final FlingAnimationUtils mFlingAnimationUtils; private float mPagingTouchSlop; private final float mSlopMultiplier; + private int mTouchSlop; + private float mTouchSlopMultiplier; + private final Callback mCallback; private final int mSwipeDirection; private final VelocityTracker mVelocityTracker; @@ -105,6 +110,10 @@ public class SwipeHelper implements Gefingerpoken { final int y = (int) mDownLocation[1] - mViewOffset[1]; mTouchedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED); ((ExpandableNotificationRow) mTouchedView).doLongClickCallback(x, y); + + if (isAvailableToDragAndDrop(mTouchedView)) { + mCallback.onLongPressSent(mTouchedView); + } } } } @@ -126,6 +135,8 @@ public class SwipeHelper implements Gefingerpoken { mVelocityTracker = VelocityTracker.obtain(); mPagingTouchSlop = viewConfiguration.getScaledPagingTouchSlop(); mSlopMultiplier = viewConfiguration.getScaledAmbiguousGestureMultiplier(); + mTouchSlop = viewConfiguration.getScaledTouchSlop(); + mTouchSlopMultiplier = viewConfiguration.getAmbiguousGestureMultiplier(); // Extra long-press! mLongPressTimeout = (long) (ViewConfiguration.getLongPressTimeout() * 1.5f); @@ -297,7 +308,9 @@ public class SwipeHelper implements Gefingerpoken { mIsSwiping = false; mSnappingChild = false; mLongPressSent = false; + mCallback.onLongPressSent(null); mVelocityTracker.clear(); + cancelLongPress(); mTouchedView = mCallback.getChildAtPosition(ev); if (mTouchedView != null) { @@ -349,6 +362,7 @@ public class SwipeHelper implements Gefingerpoken { mIsSwiping = false; mTouchedView = null; mLongPressSent = false; + mCallback.onLongPressSent(null); mMenuRowIntercepting = false; cancelLongPress(); if (captured) return true; @@ -599,11 +613,7 @@ public class SwipeHelper implements Gefingerpoken { @Override public boolean onTouchEvent(MotionEvent ev) { - if (mLongPressSent && !mMenuRowIntercepting) { - return true; - } - - if (!mIsSwiping && !mMenuRowIntercepting) { + if (!mIsSwiping && !mMenuRowIntercepting && !mLongPressSent) { if (mCallback.getChildAtPosition(ev) != null) { // We are dragging directly over a card, make sure that we also catch the gesture // even if nobody else wants the touch event. @@ -629,30 +639,40 @@ public class SwipeHelper implements Gefingerpoken { if (absDelta >= getFalsingThreshold()) { mTouchAboveFalsingThreshold = true; } - // don't let items that can't be dismissed be dragged more than - // maxScrollDistance - if (CONSTRAIN_SWIPE && !mCallback.canChildBeDismissedInDirection( - mTouchedView, - delta > 0)) { - float size = getSize(mTouchedView); - float maxScrollDistance = MAX_SCROLL_SIZE_FRACTION * size; - if (absDelta >= size) { - delta = delta > 0 ? maxScrollDistance : -maxScrollDistance; - } else { - int startPosition = mCallback.getConstrainSwipeStartPosition(); - if (absDelta > startPosition) { - int signedStartPosition = - (int) (startPosition * Math.signum(delta)); - delta = signedStartPosition - + maxScrollDistance * (float) Math.sin( - ((delta - signedStartPosition) / size) * (Math.PI / 2)); + + if (mLongPressSent) { + if (absDelta >= getTouchSlop(ev)) { + if (mTouchedView instanceof ExpandableNotificationRow) { + ((ExpandableNotificationRow) mTouchedView) + .doDragCallback(ev.getX(), ev.getY()); + } + } + } else { + // don't let items that can't be dismissed be dragged more than + // maxScrollDistance + if (CONSTRAIN_SWIPE && !mCallback.canChildBeDismissedInDirection( + mTouchedView, + delta > 0)) { + float size = getSize(mTouchedView); + float maxScrollDistance = MAX_SCROLL_SIZE_FRACTION * size; + if (absDelta >= size) { + delta = delta > 0 ? maxScrollDistance : -maxScrollDistance; + } else { + int startPosition = mCallback.getConstrainSwipeStartPosition(); + if (absDelta > startPosition) { + int signedStartPosition = + (int) (startPosition * Math.signum(delta)); + delta = signedStartPosition + + maxScrollDistance * (float) Math.sin( + ((delta - signedStartPosition) / size) * (Math.PI / 2)); + } } } - } - setTranslation(mTouchedView, mTranslation + delta); - updateSwipeProgressFromOffset(mTouchedView, mCanCurrViewBeDimissed); - onMoveUpdate(mTouchedView, ev, mTranslation + delta, delta); + setTranslation(mTouchedView, mTranslation + delta); + updateSwipeProgressFromOffset(mTouchedView, mCanCurrViewBeDimissed); + onMoveUpdate(mTouchedView, ev, mTranslation + delta, delta); + } } break; case MotionEvent.ACTION_UP: @@ -753,6 +773,29 @@ public class SwipeHelper implements Gefingerpoken { mIsSwiping = false; } + private float getTouchSlop(MotionEvent event) { + // Adjust the touch slop if another gesture may be being performed. + return event.getClassification() == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE + ? mTouchSlop * mTouchSlopMultiplier + : mTouchSlop; + } + + private boolean isAvailableToDragAndDrop(View v) { + if (v.getResources().getBoolean(R.bool.config_notificationToContents)) { + if (v instanceof ExpandableNotificationRow) { + ExpandableNotificationRow enr = (ExpandableNotificationRow) v; + boolean canBubble = enr.getEntry().canBubble(); + Notification notif = enr.getEntry().getSbn().getNotification(); + PendingIntent dragIntent = notif.contentIntent != null ? notif.contentIntent + : notif.fullScreenIntent; + if (dragIntent != null && dragIntent.isActivity() && !canBubble) { + return true; + } + } + } + return false; + } + public interface Callback { View getChildAtPosition(MotionEvent ev); @@ -777,6 +820,13 @@ public class SwipeHelper implements Gefingerpoken { void onDragCancelled(View v); /** + * Called when the child is long pressed and available to start drag and drop. + * + * @param v the view that was long pressed. + */ + void onLongPressSent(View v); + + /** * Called when the child is snapped to a position. * * @param animView the view that was snapped. |