Allow trackpad to tune RAPID_DECELERATION_FACTOR for gesture nav
- RAPID_DECELERATION_FACTOR determines whether swipe up from app takes the user to overview vs. home
Bug: 355457714
Test: adb shell setprop trackpad_in_app_swipe_up_deceleration_factor 0.6f
Flag: EXEMPT bugfix
Change-Id: I205e72c82dc08b9e542420ca1adc8f7c0eb0953d
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java
index 5377983..d1aa472 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java
@@ -88,6 +88,7 @@
private ObjectAnimator mNormalToHintOverviewScrimAnimator;
private final QuickstepLauncher mLauncher;
+ private boolean mIsTrackpadSwipe;
/**
* @param cancelSplitRunnable Called when split placeholder view needs to be cancelled.
@@ -106,9 +107,9 @@
@Override
protected boolean canInterceptTouch(MotionEvent ev) {
- boolean isTrackpadEvent = isTrackpadMotionEvent(ev);
- mLauncher.setCanShowAllAppsEducationView(!isTrackpadEvent);
- if (!isTrackpadEvent && DisplayController.getNavigationMode(mLauncher)
+ mIsTrackpadSwipe = isTrackpadMotionEvent(ev);
+ mLauncher.setCanShowAllAppsEducationView(!mIsTrackpadSwipe);
+ if (!mIsTrackpadSwipe && DisplayController.getNavigationMode(mLauncher)
== THREE_BUTTONS) {
return false;
}
@@ -152,6 +153,7 @@
super.onDragStart(start, startDisplacement);
mMotionPauseDetector.clear();
+ mMotionPauseDetector.setIsTrackpadGesture(mIsTrackpadSwipe);
if (handlingOverviewAnim()) {
InteractionJankMonitorWrapper.begin(mRecentsView, Cuj.CUJ_LAUNCHER_APP_SWIPE_TO_RECENTS,
@@ -195,6 +197,7 @@
}
mMotionPauseDetector.clear();
+ mIsTrackpadSwipe = false;
mNormalToHintOverviewScrimAnimator = null;
if (mLauncher.isInState(OVERVIEW)) {
// Normally we would cleanup the state based on mCurrentAnimation, but since we stop
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index ab277b6..0da7b2d 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -121,6 +121,7 @@
private AnimatorPlaybackController mNonOverviewAnim;
private AnimatorPlaybackController mXOverviewAnim;
private AnimatedFloat mYOverviewAnim;
+ private boolean mIsTrackpadSwipe;
public NoButtonQuickSwitchTouchController(QuickstepLauncher launcher) {
mLauncher = launcher;
@@ -177,7 +178,8 @@
return false;
}
if (isTrackpadMultiFingerSwipe(ev)) {
- return isTrackpadFourFingerSwipe(ev);
+ mIsTrackpadSwipe = isTrackpadFourFingerSwipe(ev);
+ return mIsTrackpadSwipe;
}
return true;
}
@@ -185,6 +187,7 @@
@Override
public void onDragStart(boolean start) {
mMotionPauseDetector.clear();
+ mMotionPauseDetector.setIsTrackpadGesture(mIsTrackpadSwipe);
if (start) {
InteractionJankMonitorWrapper.begin(mRecentsView, Cuj.CUJ_LAUNCHER_QUICK_SWITCH);
InteractionJankMonitorWrapper.begin(mRecentsView, Cuj.CUJ_LAUNCHER_APP_SWIPE_TO_RECENTS,
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
index 13b6447..69d3bc9 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
@@ -409,6 +409,7 @@
mInteractionHandler = mHandlerFactory.newHandler(mGestureState, touchTimeMs);
mInteractionHandler.setGestureEndCallback(this::onInteractionGestureFinished);
mMotionPauseDetector.setOnMotionPauseListener(mInteractionHandler.getMotionPauseListener());
+ mMotionPauseDetector.setIsTrackpadGesture(mGestureState.isTrackpadGesture());
mInteractionHandler.initWhenReady(
"OtherActivityInputConsumer.startTouchTrackingForWindowAnimation");
diff --git a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java
index b8bc828..15081da 100644
--- a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java
+++ b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java
@@ -66,6 +66,7 @@
private Float mPreviousVelocity = null;
private OnMotionPauseListener mOnMotionPauseListener;
+ private boolean mIsTrackpadGesture;
private boolean mIsPaused;
// Bias more for the first pause to make it feel extra responsive.
private boolean mHasEverBeenPaused;
@@ -115,6 +116,10 @@
mOnMotionPauseListener = listener;
}
+ public void setIsTrackpadGesture(boolean isTrackpadGesture) {
+ mIsTrackpadGesture = isTrackpadGesture;
+ }
+
/**
* @param disallowPause If true, we will not detect any pauses until this is set to false again.
*/
@@ -179,7 +184,8 @@
// We want to be more aggressive about detecting the first pause to ensure it
// feels as responsive as possible; getting two very slow speeds back to back
// takes too long, so also check for a rapid deceleration.
- boolean isRapidDeceleration = speed < previousSpeed * RAPID_DECELERATION_FACTOR;
+ boolean isRapidDeceleration =
+ speed < previousSpeed * getRapidDecelerationFactor();
isPaused = isRapidDeceleration && speed < mSpeedSomewhatFast;
isPausedReason = new ActiveGestureLog.CompoundString(
"Didn't have back to back slow speeds, checking for rapid ")
@@ -253,6 +259,7 @@
mVelocityProvider.clear();
mPreviousVelocity = null;
setOnMotionPauseListener(null);
+ mIsTrackpadGesture = false;
mIsPaused = mHasEverBeenPaused = false;
mSlowStartTime = 0;
mForcePauseTimeout.cancelAlarm();
@@ -262,6 +269,12 @@
return mIsPaused;
}
+ private float getRapidDecelerationFactor() {
+ return mIsTrackpadGesture ? Float.parseFloat(
+ Utilities.getSystemProperty("trackpad_in_app_swipe_up_deceleration_factor",
+ String.valueOf(RAPID_DECELERATION_FACTOR))) : RAPID_DECELERATION_FACTOR;
+ }
+
public interface OnMotionPauseListener {
/** Called only the first time motion pause is detected. */
void onMotionPauseDetected();