Merge "Fix new back arrow's "over eager" appearance" into tm-qpr-dev am: fab6866394

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19283691

Change-Id: Ib97c11d80652a8bac8bae6ec2909981f2bb5406a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Rahul Banerjee
2022-07-14 16:26:58 +00:00
committed by Automerger Merge Worker

View File

@@ -30,6 +30,7 @@ import android.view.Gravity
import android.view.MotionEvent import android.view.MotionEvent
import android.view.VelocityTracker import android.view.VelocityTracker
import android.view.View import android.view.View
import android.view.ViewConfiguration
import android.view.WindowManager import android.view.WindowManager
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.view.animation.PathInterpolator import android.view.animation.PathInterpolator
@@ -98,6 +99,7 @@ class BackPanelController private constructor(
context: Context, context: Context,
private var backAnimation: BackAnimation?, private var backAnimation: BackAnimation?,
private val windowManager: WindowManager, private val windowManager: WindowManager,
private val viewConfiguration: ViewConfiguration,
@Main private val mainHandler: Handler, @Main private val mainHandler: Handler,
private val vibratorHelper: VibratorHelper, private val vibratorHelper: VibratorHelper,
private val configurationController: ConfigurationController, private val configurationController: ConfigurationController,
@@ -112,6 +114,7 @@ class BackPanelController private constructor(
*/ */
class Factory @Inject constructor( class Factory @Inject constructor(
private val windowManager: WindowManager, private val windowManager: WindowManager,
private val viewConfiguration: ViewConfiguration,
@Main private val mainHandler: Handler, @Main private val mainHandler: Handler,
private val vibratorHelper: VibratorHelper, private val vibratorHelper: VibratorHelper,
private val configurationController: ConfigurationController, private val configurationController: ConfigurationController,
@@ -123,6 +126,7 @@ class BackPanelController private constructor(
context, context,
backAnimation, backAnimation,
windowManager, windowManager,
viewConfiguration,
mainHandler, mainHandler,
vibratorHelper, vibratorHelper,
configurationController, configurationController,
@@ -164,6 +168,10 @@ class BackPanelController private constructor(
private var gestureStartTime = 0L 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 val failsafeRunnable = Runnable { onFailsafe() }
private enum class GestureState { private enum class GestureState {
@@ -304,18 +312,17 @@ class BackPanelController private constructor(
startX = event.x startX = event.x
startY = event.y startY = event.y
gestureStartTime = SystemClock.uptimeMillis() 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 -> { MotionEvent.ACTION_UP -> {
if (currentState == GestureState.ACTIVE) { if (currentState == GestureState.ACTIVE) {
updateArrowState(if (isFlung()) GestureState.FLUNG else GestureState.COMMITTED) updateArrowState(if (isFlung()) GestureState.FLUNG else GestureState.COMMITTED)
} else { } else if (currentState != GestureState.GONE) { // if invisible, skip animation
updateArrowState(GestureState.CANCELLED) updateArrowState(GestureState.CANCELLED)
} }
velocityTracker = null 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) { private fun updateArrowStateOnMove(yTranslation: Float, xTranslation: Float) {
if (!currentState.isInteractive()) if (!currentState.isInteractive())
return return
@@ -533,6 +562,7 @@ class BackPanelController private constructor(
} }
private fun resetOnDown() { private fun resetOnDown() {
hasPassedDragSlop = false
hasHapticPlayed = false hasHapticPlayed = false
totalTouchDelta = 0f totalTouchDelta = 0f
vibrationTime = 0 vibrationTime = 0