summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt33
1 files changed, 33 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
index 3a4ea3ec3614..e352c613ad86 100644
--- a/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/multishade/domain/interactor/MultiShadeMotionEventInteractor.kt
@@ -182,6 +182,26 @@ constructor(
interactionState = null
true
}
+ MotionEvent.ACTION_POINTER_UP -> {
+ val removedPointerId = event.getPointerId(event.actionIndex)
+ if (removedPointerId == interactionState?.pointerId && event.pointerCount > 1) {
+ // We removed the original pointer but there must be another pointer because the
+ // gesture is still ongoing. Let's switch to that pointer.
+ interactionState =
+ event.firstUnremovedPointerId(removedPointerId)?.let { replacementPointerId
+ ->
+ interactionState?.copy(
+ pointerId = replacementPointerId,
+ // We want to update the currentY of our state so that the
+ // transition to the next pointer doesn't report a big jump between
+ // the Y coordinate of the removed pointer and the Y coordinate of
+ // the replacement pointer.
+ currentY = event.getY(replacementPointerId),
+ )
+ }
+ }
+ true
+ }
MotionEvent.ACTION_CANCEL -> {
if (isDraggingShade()) {
// Our drag gesture was canceled by the system. This happens primarily in one of
@@ -219,4 +239,17 @@ constructor(
private fun isDraggingShade(): Boolean {
return interactionState?.isDraggingShade ?: false
}
+
+ /**
+ * Returns the index of the first pointer that is not [removedPointerId] or `null`, if there is
+ * no other pointer.
+ */
+ private fun MotionEvent.firstUnremovedPointerId(removedPointerId: Int): Int? {
+ return (0 until pointerCount)
+ .firstOrNull { pointerIndex ->
+ val pointerId = getPointerId(pointerIndex)
+ pointerId != removedPointerId
+ }
+ ?.let { pointerIndex -> getPointerId(pointerIndex) }
+ }
}