From ff6800b9a90277a232be6a32af657deded073a2e Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 6 Mar 2023 23:47:42 -0800 Subject: [PATCH] Support 3-finger swipe on the trackpad to unlock - Don't handle ACTION_POINTER_DOWN and ACTION_POINTER_UP for trackpad gestures (We cancel multi finger gestures on the screen. We don't want to do that for trackpad gestures since on the trackpad, one finger gesture is reserved for cursor) Fixes: 270605500 Test: 3-finger swipe up on the lockscreen, and see that it's unlocked Change-Id: Ida8d9e3d5c543ec7e5619a0df8ce58d8ea02c831 --- .../NotificationPanelViewController.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index b1987c151e5fb..5a8dec1865f98 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -17,6 +17,7 @@ package com.android.systemui.shade; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; +import static android.view.MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -305,6 +306,7 @@ public final class NotificationPanelViewController implements Dumpable { */ public final boolean mAnimateBack; + private final boolean mTrackpadGestureBack; /** * The minimum scale to "squish" the Shade and associated elements down to, for Back gesture */ @@ -849,6 +851,7 @@ public final class NotificationPanelViewController implements Dumpable { mLayoutInflater = layoutInflater; mFeatureFlags = featureFlags; mAnimateBack = mFeatureFlags.isEnabled(Flags.WM_SHADE_ANIMATE_BACK_GESTURE); + mTrackpadGestureBack = mFeatureFlags.isEnabled(Flags.TRACKPAD_GESTURE_BACK); mFalsingCollector = falsingCollector; mPowerManager = powerManager; mWakeUpCoordinator = coordinator; @@ -4758,6 +4761,9 @@ public final class NotificationPanelViewController implements Dumpable { addMovement(event); break; case MotionEvent.ACTION_POINTER_UP: + if (isTrackpadMotionEvent(event)) { + break; + } final int upPointer = event.getPointerId(event.getActionIndex()); if (mTrackingPointer == upPointer) { // gesture is ongoing, find a new pointer to track @@ -4771,7 +4777,8 @@ public final class NotificationPanelViewController implements Dumpable { mShadeLog.logMotionEventStatusBarState(event, mStatusBarStateController.getState(), "onInterceptTouchEvent: pointer down action"); - if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { + if (!isTrackpadMotionEvent(event) + && mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { mMotionAborted = true; mVelocityTracker.clear(); } @@ -4974,6 +4981,9 @@ public final class NotificationPanelViewController implements Dumpable { break; case MotionEvent.ACTION_POINTER_UP: + if (isTrackpadMotionEvent(event)) { + break; + } final int upPointer = event.getPointerId(event.getActionIndex()); if (mTrackingPointer == upPointer) { // gesture is ongoing, find a new pointer to track @@ -4990,7 +5000,8 @@ public final class NotificationPanelViewController implements Dumpable { mShadeLog.logMotionEventStatusBarState(event, mStatusBarStateController.getState(), "handleTouch: pointer down action"); - if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { + if (!isTrackpadMotionEvent(event) + && mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { mMotionAborted = true; endMotionEvent(event, x, y, true /* forceCancel */); return false; @@ -5064,6 +5075,11 @@ public final class NotificationPanelViewController implements Dumpable { } return !mGestureWaitForTouchSlop || mTracking; } + + private boolean isTrackpadMotionEvent(MotionEvent ev) { + return mTrackpadGestureBack + && ev.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE; + } } static class SplitShadeTransitionAdapter extends Transition {