From ae0629004ad699a9a10992c97109268f5cb26485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 4 Jul 2024 14:54:32 +0200 Subject: [PATCH 1/7] Fix rotation and pinch gesture on android --- .../core/PinchGestureHandler.kt | 2 +- .../core/RotationGestureDetector.kt | 21 +++++++++++++++---- .../core/RotationGestureHandler.kt | 3 ++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt index 28e8589382..8450f5c8af 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt @@ -74,7 +74,7 @@ class PinchGestureHandler : GestureHandler() { if (sourceEvent.actionMasked == MotionEvent.ACTION_POINTER_UP) { activePointers -= 1 } - if (state == STATE_ACTIVE && activePointers < 2) { + if (state == STATE_ACTIVE && activePointers == 0) { end() } else if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { fail() diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt index 48cdccd60e..b9f27e2935 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt @@ -51,6 +51,8 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList private var isInProgress = false private val pointerIds = IntArray(2) + private var frozenPointerIndex = 0 + private var activePointerCount = 0 private fun updateCurrent(event: MotionEvent) { previousTime = currentTime @@ -111,11 +113,22 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList updateCurrent(event) gestureListener?.onRotation(this) } - MotionEvent.ACTION_POINTER_UP -> if (isInProgress) { + MotionEvent.ACTION_POINTER_UP -> { val pointerId = event.getPointerId(event.actionIndex) - if (pointerId == pointerIds[0] || pointerId == pointerIds[1]) { - // One of the key pointer has been lifted up, we have to end the gesture - finish() + + if (isInProgress) { + if (pointerId == pointerIds[0] || pointerId == pointerIds[1]) { + if (pointerId == pointerIds[0]) { + pointerIds[0] = pointerIds[1] + } + pointerIds[1] = MotionEvent.INVALID_POINTER_ID + isInProgress = false + } + } else { + // all key pointers are up + if (pointerId == pointerIds[0]) { + gestureListener?.onRotationEnd(this) + } } } MotionEvent.ACTION_UP -> finish() diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt index d3d12f4601..e8c0868729 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt @@ -59,7 +59,8 @@ class RotationGestureHandler : GestureHandler() { anchorY = point.y } if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { - if (state == STATE_ACTIVE) { + var activePointers = sourceEvent.pointerCount + if (state == STATE_ACTIVE && activePointers == 0) { end() } else { fail() From 5b30e8c61b72bed739e51d413eff0a1ae65bee76 Mon Sep 17 00:00:00 2001 From: Dawid Date: Thu, 4 Jul 2024 15:42:05 +0200 Subject: [PATCH 2/7] remove unused vars --- .../swmansion/gesturehandler/core/RotationGestureDetector.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt index b9f27e2935..824854a269 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt @@ -51,8 +51,6 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList private var isInProgress = false private val pointerIds = IntArray(2) - private var frozenPointerIndex = 0 - private var activePointerCount = 0 private fun updateCurrent(event: MotionEvent) { previousTime = currentTime From cbf3771661d179066aa139312ee4968575bbc639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 5 Jul 2024 10:23:41 +0200 Subject: [PATCH 3/7] Update android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MichaƂ Bert <63123542+m-bert@users.noreply.github.com> --- .../swmansion/gesturehandler/core/RotationGestureHandler.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt index e8c0868729..acac0b263d 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt @@ -59,8 +59,7 @@ class RotationGestureHandler : GestureHandler() { anchorY = point.y } if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { - var activePointers = sourceEvent.pointerCount - if (state == STATE_ACTIVE && activePointers == 0) { + if (state == STATE_ACTIVE && sourceEvent.pointerCount == 0) { end() } else { fail() From 5e820d653b3d0b863ef793610aeb7454f42e1ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 5 Jul 2024 10:25:17 +0200 Subject: [PATCH 4/7] Update android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt Co-authored-by: Jakub Piasecki --- .../core/RotationGestureDetector.kt | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt index 824854a269..5804f8ca24 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt @@ -114,19 +114,19 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList MotionEvent.ACTION_POINTER_UP -> { val pointerId = event.getPointerId(event.actionIndex) - if (isInProgress) { - if (pointerId == pointerIds[0] || pointerId == pointerIds[1]) { - if (pointerId == pointerIds[0]) { - pointerIds[0] = pointerIds[1] - } - pointerIds[1] = MotionEvent.INVALID_POINTER_ID - isInProgress = false - } - } else { - // all key pointers are up + // All key pointers are up + if (!isInProgress && pointerId == pointerIds[0]) { + gestureListener?.onRotationEnd(this) + } + + // One of the key pointers is up + if (isInProgress && pointerIds.contains(pointerId)) { if (pointerId == pointerIds[0]) { - gestureListener?.onRotationEnd(this) + pointerIds[0] = pointerIds[1] } + pointerIds[1] = MotionEvent.INVALID_POINTER_ID + isInProgress = false + } } } MotionEvent.ACTION_UP -> finish() From 2df344c2a8cdb50c19cf52b30715bd7553e56a25 Mon Sep 17 00:00:00 2001 From: Dawid Date: Fri, 5 Jul 2024 10:29:12 +0200 Subject: [PATCH 5/7] removing useless code --- .../gesturehandler/core/PinchGestureHandler.kt | 13 ++++++++++--- .../gesturehandler/core/RotationGestureDetector.kt | 3 +-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt index 8450f5c8af..5dc8c4bdd2 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt @@ -74,9 +74,16 @@ class PinchGestureHandler : GestureHandler() { if (sourceEvent.actionMasked == MotionEvent.ACTION_POINTER_UP) { activePointers -= 1 } - if (state == STATE_ACTIVE && activePointers == 0) { - end() - } else if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { + + if (action == MotionEvent.ACTION_UP) { + if (state == STATE_ACTIVE) { + end() + } else { + fail() + } + } + + if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { fail() } } diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt index 5804f8ca24..e1867813e7 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt @@ -118,7 +118,7 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList if (!isInProgress && pointerId == pointerIds[0]) { gestureListener?.onRotationEnd(this) } - + // One of the key pointers is up if (isInProgress && pointerIds.contains(pointerId)) { if (pointerId == pointerIds[0]) { @@ -127,7 +127,6 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList pointerIds[1] = MotionEvent.INVALID_POINTER_ID isInProgress = false } - } } MotionEvent.ACTION_UP -> finish() } From c8716e3dcb54427ad7b786d8d0e0abe0a835d812 Mon Sep 17 00:00:00 2001 From: Dawid Date: Fri, 5 Jul 2024 11:08:20 +0200 Subject: [PATCH 6/7] resolving build issues --- .../swmansion/gesturehandler/core/PinchGestureHandler.kt | 6 +----- .../gesturehandler/core/RotationGestureDetector.kt | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt index 5dc8c4bdd2..664179e6b3 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt @@ -75,17 +75,13 @@ class PinchGestureHandler : GestureHandler() { activePointers -= 1 } - if (action == MotionEvent.ACTION_UP) { + if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { if (state == STATE_ACTIVE) { end() } else { fail() } } - - if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { - fail() - } } override fun activate(force: Boolean) { diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt index e1867813e7..553d24168e 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureDetector.kt @@ -118,7 +118,7 @@ class RotationGestureDetector(private val gestureListener: OnRotationGestureList if (!isInProgress && pointerId == pointerIds[0]) { gestureListener?.onRotationEnd(this) } - + // One of the key pointers is up if (isInProgress && pointerIds.contains(pointerId)) { if (pointerId == pointerIds[0]) { From c98b9b361621b0c7d3443e6d50489ad33c0b7488 Mon Sep 17 00:00:00 2001 From: Dawid Date: Tue, 9 Jul 2024 11:41:02 +0200 Subject: [PATCH 7/7] minor pinch and rotation gesture handler fixes --- .../com/swmansion/gesturehandler/core/PinchGestureHandler.kt | 4 ---- .../swmansion/gesturehandler/core/RotationGestureHandler.kt | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt index 664179e6b3..55bd282eda 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt @@ -70,10 +70,6 @@ class PinchGestureHandler : GestureHandler() { this.focalPointX = point.x this.focalPointY = point.y } - var activePointers = sourceEvent.pointerCount - if (sourceEvent.actionMasked == MotionEvent.ACTION_POINTER_UP) { - activePointers -= 1 - } if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { if (state == STATE_ACTIVE) { diff --git a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt index acac0b263d..d3d12f4601 100644 --- a/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt +++ b/android/src/main/java/com/swmansion/gesturehandler/core/RotationGestureHandler.kt @@ -59,7 +59,7 @@ class RotationGestureHandler : GestureHandler() { anchorY = point.y } if (sourceEvent.actionMasked == MotionEvent.ACTION_UP) { - if (state == STATE_ACTIVE && sourceEvent.pointerCount == 0) { + if (state == STATE_ACTIVE) { end() } else { fail()