summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Rahul Banerjee <rahulbanerjee@google.com> 2022-07-14 16:07:56 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-07-14 16:07:56 +0000
commitfab68663949fe9331c3df133926a78d59572553c (patch)
tree51853df7e13e22783c00d82c4409c6085e6c5ba8
parentfb4fdcee9c53b64b3b27c5e70ffa4f5f6dba638d (diff)
parent76be5a478a2c7d64f332bb865fb7b57fc77aaab6 (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.kt46
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