diff options
| author | 2022-07-14 16:07:56 +0000 | |
|---|---|---|
| committer | 2022-07-14 16:07:56 +0000 | |
| commit | fab68663949fe9331c3df133926a78d59572553c (patch) | |
| tree | 51853df7e13e22783c00d82c4409c6085e6c5ba8 | |
| parent | fb4fdcee9c53b64b3b27c5e70ffa4f5f6dba638d (diff) | |
| parent | 76be5a478a2c7d64f332bb865fb7b57fc77aaab6 (diff) | |
Merge "Fix new back arrow's "over eager" appearance" into tm-qpr-dev
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt index a83367059736..28ab83c83a42 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt @@ -30,6 +30,7 @@ import android.view.Gravity import android.view.MotionEvent import android.view.VelocityTracker import android.view.View +import android.view.ViewConfiguration import android.view.WindowManager import android.view.animation.DecelerateInterpolator import android.view.animation.PathInterpolator @@ -98,6 +99,7 @@ class BackPanelController private constructor( context: Context, private var backAnimation: BackAnimation?, private val windowManager: WindowManager, + private val viewConfiguration: ViewConfiguration, @Main private val mainHandler: Handler, private val vibratorHelper: VibratorHelper, private val configurationController: ConfigurationController, @@ -112,6 +114,7 @@ class BackPanelController private constructor( */ class Factory @Inject constructor( private val windowManager: WindowManager, + private val viewConfiguration: ViewConfiguration, @Main private val mainHandler: Handler, private val vibratorHelper: VibratorHelper, private val configurationController: ConfigurationController, @@ -123,6 +126,7 @@ class BackPanelController private constructor( context, backAnimation, windowManager, + viewConfiguration, mainHandler, vibratorHelper, configurationController, @@ -164,6 +168,10 @@ class BackPanelController private constructor( private var gestureStartTime = 0L + // Whether the current gesture has moved a sufficiently large amount, + // so that we can unambiguously start showing the ENTRY animation + private var hasPassedDragSlop = false + private val failsafeRunnable = Runnable { onFailsafe() } private enum class GestureState { @@ -304,18 +312,17 @@ class BackPanelController private constructor( startX = event.x startY = event.y gestureStartTime = SystemClock.uptimeMillis() - - // Reset the arrow to the side - updateArrowState(GestureState.ENTRY) - - windowManager.updateViewLayout(mView, layoutParams) - mView.startTrackingShowBackArrowLatency() } - MotionEvent.ACTION_MOVE -> handleMoveEvent(event) + MotionEvent.ACTION_MOVE -> { + // only go to the ENTRY state after some minimum motion has occurred + if (dragSlopExceeded(event.x, startX)) { + handleMoveEvent(event) + } + } MotionEvent.ACTION_UP -> { if (currentState == GestureState.ACTIVE) { updateArrowState(if (isFlung()) GestureState.FLUNG else GestureState.COMMITTED) - } else { + } else if (currentState != GestureState.GONE) { // if invisible, skip animation updateArrowState(GestureState.CANCELLED) } velocityTracker = null @@ -330,6 +337,28 @@ class BackPanelController private constructor( } } + /** + * Returns false until the current gesture exceeds the touch slop threshold, + * and returns true thereafter (we reset on the subsequent back gesture). + * The moment it switches from false -> true is important, + * because that's when we switch state, from GONE -> ENTRY. + * @return whether the current gesture has moved past a minimum threshold. + */ + private fun dragSlopExceeded(curX: Float, startX: Float): Boolean { + if (hasPassedDragSlop) return true + + if (abs(curX - startX) > viewConfiguration.scaledTouchSlop) { + // Reset the arrow to the side + updateArrowState(GestureState.ENTRY) + + windowManager.updateViewLayout(mView, layoutParams) + mView.startTrackingShowBackArrowLatency() + + hasPassedDragSlop = true + } + return hasPassedDragSlop + } + private fun updateArrowStateOnMove(yTranslation: Float, xTranslation: Float) { if (!currentState.isInteractive()) return @@ -533,6 +562,7 @@ class BackPanelController private constructor( } private fun resetOnDown() { + hasPassedDragSlop = false hasHapticPlayed = false totalTouchDelta = 0f vibrationTime = 0 |