From f55a513d724e78718b3d10e2e09f8576cc1b752d Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 19 Dec 2022 20:03:02 -0800 Subject: [PATCH] Fix trackpad gesture not able to pull down notification TouchInteractionService monitors motion events on the homescreen too. While we allow the motion event anywhere on the homescreen, they should not be intercepted by input consumers. As a byproduct, this fixes pulling up the all apps panel too. Bug: 255602235 Bug: 263200728 Test: manual Change-Id: I3e74c4476505d530ff6d3443342a5c36c6faa9e5 --- .../src/com/android/quickstep/RotationTouchHelper.java | 9 +++++---- .../com/android/quickstep/TouchInteractionService.java | 6 ++++-- .../inputconsumers/AccessibilityInputConsumer.java | 9 ++++++--- .../inputconsumers/DeviceLockedInputConsumer.java | 3 ++- .../inputconsumers/OtherActivityInputConsumer.java | 3 ++- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java index a071b760b2..aab5703ae9 100644 --- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java +++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java @@ -232,9 +232,9 @@ public class RotationTouchHelper implements DisplayInfoChangeListener { /** * @return whether the coordinates of the {@param event} is in the swipe up gesture region. */ - public boolean isInSwipeUpTouchRegion(MotionEvent event) { + public boolean isInSwipeUpTouchRegion(MotionEvent event, BaseActivityInterface activity) { if (isTrackpadMotionEvent(event)) { - return true; + return !activity.isResumed(); } return mOrientationTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()); } @@ -243,9 +243,10 @@ public class RotationTouchHelper implements DisplayInfoChangeListener { * @return whether the coordinates of the {@param event} with the given {@param pointerIndex} * is in the swipe up gesture region. */ - public boolean isInSwipeUpTouchRegion(MotionEvent event, int pointerIndex) { + public boolean isInSwipeUpTouchRegion(MotionEvent event, int pointerIndex, + BaseActivityInterface activity) { if (isTrackpadMotionEvent(event)) { - return true; + return !activity.isResumed(); } return mOrientationTouchTransformer.touchInValidSwipeRegions(event.getX(pointerIndex), event.getY(pointerIndex)); diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 256569787c..e21a44c5e1 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -20,6 +20,7 @@ import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_UP; +import static com.android.launcher3.Utilities.isTrackpadMotionEvent; import static com.android.launcher3.config.FeatureFlags.ASSISTANT_GIVES_LAUNCHER_FOCUS; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.quickstep.GestureState.DEFAULT_STATE; @@ -619,7 +620,8 @@ public class TouchInteractionService extends Service mRotationTouchHelper.setOrientationTransformIfNeeded(event); if (!mDeviceState.isOneHandedModeActive() - && mRotationTouchHelper.isInSwipeUpTouchRegion(event)) { + && mRotationTouchHelper.isInSwipeUpTouchRegion(event, + mOverviewComponentObserver.getActivityInterface())) { // Clone the previous gesture state since onConsumerAboutToBeSwitched might trigger // onConsumerInactive and wipe the previous gesture state GestureState prevGestureState = new GestureState(mGestureState); @@ -850,7 +852,7 @@ public class TouchInteractionService extends Service .append("accessibility menu is available") .append(", using AccessibilityInputConsumer"); base = new AccessibilityInputConsumer( - this, mDeviceState, base, mInputMonitorCompat); + this, mDeviceState, mGestureState, base, mInputMonitorCompat); } } else { String reasonPrefix = "device is not in gesture navigation mode"; diff --git a/quickstep/src/com/android/quickstep/inputconsumers/AccessibilityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/AccessibilityInputConsumer.java index 0c2c92cfb0..6a36d9fd64 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/AccessibilityInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/AccessibilityInputConsumer.java @@ -29,6 +29,7 @@ import android.view.VelocityTracker; import android.view.ViewConfiguration; import com.android.launcher3.R; +import com.android.quickstep.GestureState; import com.android.quickstep.InputConsumer; import com.android.quickstep.RecentsAnimationDeviceState; import com.android.quickstep.SystemUiProxy; @@ -46,6 +47,7 @@ public class AccessibilityInputConsumer extends DelegateInputConsumer { private final VelocityTracker mVelocityTracker; private final MotionPauseDetector mMotionPauseDetector; private final RecentsAnimationDeviceState mDeviceState; + private final GestureState mGestureState; private final float mMinGestureDistance; private final float mMinFlingVelocity; @@ -55,7 +57,7 @@ public class AccessibilityInputConsumer extends DelegateInputConsumer { private float mTotalY; public AccessibilityInputConsumer(Context context, RecentsAnimationDeviceState deviceState, - InputConsumer delegate, InputMonitorCompat inputMonitor) { + GestureState gestureState, InputConsumer delegate, InputMonitorCompat inputMonitor) { super(delegate, inputMonitor); mContext = context; mVelocityTracker = VelocityTracker.obtain(); @@ -63,6 +65,7 @@ public class AccessibilityInputConsumer extends DelegateInputConsumer { .getDimension(R.dimen.accessibility_gesture_min_swipe_distance); mMinFlingVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity(); mDeviceState = deviceState; + mGestureState = gestureState; mMotionPauseDetector = new MotionPauseDetector(context); } @@ -99,8 +102,8 @@ public class AccessibilityInputConsumer extends DelegateInputConsumer { case ACTION_POINTER_DOWN: { if (mState == STATE_INACTIVE) { int pointerIndex = ev.getActionIndex(); - if (mDeviceState.getRotationTouchHelper() - .isInSwipeUpTouchRegion(ev, pointerIndex) + if (mDeviceState.getRotationTouchHelper().isInSwipeUpTouchRegion(ev, + pointerIndex, mGestureState.getActivityInterface()) && mDelegate.allowInterceptByParent()) { setActive(ev); diff --git a/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java index 5374ff0405..42a74d9251 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java @@ -154,7 +154,8 @@ public class DeviceLockedInputConsumer implements InputConsumer, if (!mThresholdCrossed) { // Cancel interaction in case of multi-touch interaction int ptrIdx = ev.getActionIndex(); - if (!mDeviceState.getRotationTouchHelper().isInSwipeUpTouchRegion(ev, ptrIdx)) { + if (!mDeviceState.getRotationTouchHelper().isInSwipeUpTouchRegion(ev, ptrIdx, + mGestureState.getActivityInterface())) { int action = ev.getAction(); ev.setAction(ACTION_CANCEL); finishTouchTracking(ev); diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java index b33d24fd0e..51c6621e0a 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java @@ -236,7 +236,8 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC if (!mPassedPilferInputSlop) { // Cancel interaction in case of multi-touch interaction int ptrIdx = ev.getActionIndex(); - if (!mRotationTouchHelper.isInSwipeUpTouchRegion(ev, ptrIdx)) { + if (!mRotationTouchHelper.isInSwipeUpTouchRegion(ev, ptrIdx, + mActivityInterface)) { forceCancelGesture(ev); } }