From acc217e297172e9680d216659e7354fce89b93af Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Tue, 6 Jun 2023 03:40:01 +0000 Subject: [PATCH] Support showing transient bars upon 3-finger swipe from trackpad Fixes: 285727229 Test: make sure 3-finger swipes from all directions can pull up task bar and status bar Change-Id: Ic0179f1eac7334d6c17a6697b22de167e0b75f80 --- .../SystemGesturesPointerEventListener.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java index 878b33fa55ef7..100735784fb1c 100644 --- a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +++ b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java @@ -20,6 +20,8 @@ import static android.view.DisplayCutout.BOUNDS_POSITION_BOTTOM; import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT; import static android.view.DisplayCutout.BOUNDS_POSITION_RIGHT; import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; +import static android.view.MotionEvent.AXIS_GESTURE_SWIPE_FINGER_COUNT; +import static android.view.MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE; import android.annotation.NonNull; import android.content.Context; @@ -59,6 +61,12 @@ class SystemGesturesPointerEventListener implements PointerEventListener { private static final int SWIPE_FROM_RIGHT = 3; private static final int SWIPE_FROM_LEFT = 4; + private static final int TRACKPAD_SWIPE_NONE = 0; + private static final int TRACKPAD_SWIPE_FROM_TOP = 1; + private static final int TRACKPAD_SWIPE_FROM_BOTTOM = 2; + private static final int TRACKPAD_SWIPE_FROM_RIGHT = 3; + private static final int TRACKPAD_SWIPE_FROM_LEFT = 4; + private final Context mContext; private final Handler mHandler; private int mDisplayCutoutTouchableRegionSize; @@ -207,6 +215,25 @@ class SystemGesturesPointerEventListener implements PointerEventListener { break; case MotionEvent.ACTION_MOVE: if (mSwipeFireable) { + int trackpadSwipe = detectTrackpadThreeFingerSwipe(event); + mSwipeFireable = trackpadSwipe == TRACKPAD_SWIPE_NONE; + if (!mSwipeFireable) { + if (trackpadSwipe == TRACKPAD_SWIPE_FROM_TOP) { + if (DEBUG) Slog.d(TAG, "Firing onSwipeFromTop from trackpad"); + mCallbacks.onSwipeFromTop(); + } else if (trackpadSwipe == TRACKPAD_SWIPE_FROM_BOTTOM) { + if (DEBUG) Slog.d(TAG, "Firing onSwipeFromBottom from trackpad"); + mCallbacks.onSwipeFromBottom(); + } else if (trackpadSwipe == TRACKPAD_SWIPE_FROM_RIGHT) { + if (DEBUG) Slog.d(TAG, "Firing onSwipeFromRight from trackpad"); + mCallbacks.onSwipeFromRight(); + } else if (trackpadSwipe == TRACKPAD_SWIPE_FROM_LEFT) { + if (DEBUG) Slog.d(TAG, "Firing onSwipeFromLeft from trackpad"); + mCallbacks.onSwipeFromLeft(); + } + break; + } + final int swipe = detectSwipe(event); mSwipeFireable = swipe == SWIPE_NONE; if (swipe == SWIPE_FROM_TOP) { @@ -300,6 +327,31 @@ class SystemGesturesPointerEventListener implements PointerEventListener { return mDownPointers - 1; } + private int detectTrackpadThreeFingerSwipe(MotionEvent move) { + if (!isTrackpadThreeFingerSwipe(move)) { + return TRACKPAD_SWIPE_NONE; + } + + float dx = move.getX() - mDownX[0]; + float dy = move.getY() - mDownY[0]; + if (Math.abs(dx) < Math.abs(dy)) { + if (Math.abs(dy) > mSwipeDistanceThreshold) { + return dy > 0 ? TRACKPAD_SWIPE_FROM_TOP : TRACKPAD_SWIPE_FROM_BOTTOM; + } + } else { + if (Math.abs(dx) > mSwipeDistanceThreshold) { + return dx > 0 ? TRACKPAD_SWIPE_FROM_LEFT : TRACKPAD_SWIPE_FROM_RIGHT; + } + } + + return TRACKPAD_SWIPE_NONE; + } + + private static boolean isTrackpadThreeFingerSwipe(MotionEvent event) { + return event.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE + && event.getAxisValue(AXIS_GESTURE_SWIPE_FINGER_COUNT) == 3; + } + private int detectSwipe(MotionEvent move) { final int historySize = move.getHistorySize(); final int pointerCount = move.getPointerCount();