Skip to content

Commit 56ec5f6

Browse files
committed
Make base GestureHandler non generic
1 parent ce41b6f commit 56ec5f6

24 files changed

Lines changed: 104 additions & 117 deletions

android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import android.view.VelocityTracker
88
import com.facebook.react.bridge.ReadableMap
99
import com.swmansion.gesturehandler.react.eventbuilders.FlingGestureHandlerEventDataBuilder
1010

11-
class FlingGestureHandler : GestureHandler<FlingGestureHandler>() {
11+
class FlingGestureHandler : GestureHandler() {
1212
var numberOfPointersRequired = DEFAULT_NUMBER_OF_TOUCHES_REQUIRED
1313
var direction = DEFAULT_DIRECTION
1414

android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import com.swmansion.gesturehandler.react.eventbuilders.GestureHandlerEventDataB
2323
import java.lang.IllegalStateException
2424
import java.util.*
2525

26-
open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestureHandlerT>> {
26+
open class GestureHandler {
2727
private val trackedPointerIDs = IntArray(MAX_POINTERS_COUNT)
2828
private var trackedPointersIDsCount = 0
2929
private val windowOffset = IntArray(2) { 0 }
@@ -79,36 +79,30 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
7979
protected set
8080
protected var shouldCancelWhenOutside = false
8181
protected var orchestrator: GestureHandlerOrchestrator? = null
82-
private var onTouchEventListener: OnTouchEventListener? = null
82+
var onTouchEventListener: OnTouchEventListener? = null
8383
private var interactionController: GestureHandlerInteractionController? = null
8484
var pointerType: Int = POINTER_TYPE_OTHER
8585
private set
8686

8787
protected var mouseButton = 0
8888

89-
@Suppress("UNCHECKED_CAST")
90-
protected fun self(): ConcreteGestureHandlerT = this as ConcreteGestureHandlerT
91-
92-
protected inline fun applySelf(block: ConcreteGestureHandlerT.() -> Unit): ConcreteGestureHandlerT =
93-
self().apply { block() }
94-
9589
// properties set and accessed only by the orchestrator
9690
var activationIndex = 0
9791
var isActive = false
9892
var isAwaiting = false
9993
var shouldResetProgress = false
10094

10195
open fun dispatchStateChange(newState: Int, prevState: Int) {
102-
onTouchEventListener?.onStateChange(self(), newState, prevState)
96+
onTouchEventListener?.onStateChange(this, newState, prevState)
10397
}
10498

10599
open fun dispatchHandlerUpdate(event: MotionEvent) {
106-
onTouchEventListener?.onHandlerUpdate(self(), event)
100+
onTouchEventListener?.onHandlerUpdate(this, event)
107101
}
108102

109103
open fun dispatchTouchEvent() {
110104
if (changedTouchesPayload != null) {
111-
onTouchEventListener?.onTouchEvent(self())
105+
onTouchEventListener?.onTouchEvent(this)
112106
}
113107
}
114108

@@ -121,7 +115,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
121115
mouseButton = DEFAULT_MOUSE_BUTTON
122116
}
123117

124-
fun hasCommonPointers(other: GestureHandler<*>): Boolean {
118+
fun hasCommonPointers(other: GestureHandler): Boolean {
125119
for (i in trackedPointerIDs.indices) {
126120
if (trackedPointerIDs[i] != -1 && other.trackedPointerIDs[i] != -1) {
127121
return true
@@ -137,7 +131,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
137131
bottomPad: Float,
138132
width: Float,
139133
height: Float,
140-
): ConcreteGestureHandlerT = applySelf {
134+
) {
141135
if (hitSlop == null) {
142136
hitSlop = FloatArray(6)
143137
}
@@ -153,12 +147,11 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
153147
require(!(hitSlopSet(height) && !hitSlopSet(bottomPad) && !hitSlopSet(topPad))) { "When height is set one of top or bottom pads need to be defined" }
154148
}
155149

156-
fun setHitSlop(padding: Float): ConcreteGestureHandlerT {
150+
fun setHitSlop(padding: Float) {
157151
return setHitSlop(padding, padding, padding, padding, HIT_SLOP_NONE, HIT_SLOP_NONE)
158152
}
159153

160-
fun setInteractionController(controller: GestureHandlerInteractionController?): ConcreteGestureHandlerT =
161-
applySelf { interactionController = controller }
154+
fun setInteractionController(controller: GestureHandlerInteractionController?) { interactionController = controller }
162155

163156
fun prepare(view: View?, orchestrator: GestureHandlerOrchestrator?) {
164157
check(!(this.view != null || this.orchestrator != null)) { "Already prepared or hasn't been reset" }
@@ -312,7 +305,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
312305

313306
// exception to help debug https://github.com/software-mansion/react-native-gesture-handler/issues/1188
314307
class AdaptEventException(
315-
handler: GestureHandler<*>,
308+
handler: GestureHandler,
316309
event: MotionEvent,
317310
e: IllegalArgumentException
318311
) : Exception(
@@ -570,31 +563,31 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
570563
trackedPointersIDsCount > 0
571564
}
572565

573-
open fun shouldRequireToWaitForFailure(handler: GestureHandler<*>): Boolean {
566+
open fun shouldRequireToWaitForFailure(handler: GestureHandler): Boolean {
574567
if (handler === this) {
575568
return false
576569
}
577570

578571
return interactionController?.shouldRequireHandlerToWaitForFailure(this, handler) ?: false
579572
}
580573

581-
fun shouldWaitForHandlerFailure(handler: GestureHandler<*>): Boolean {
574+
fun shouldWaitForHandlerFailure(handler: GestureHandler): Boolean {
582575
if (handler === this) {
583576
return false
584577
}
585578

586579
return interactionController?.shouldWaitForHandlerFailure(this, handler) ?: false
587580
}
588581

589-
open fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
582+
open fun shouldRecognizeSimultaneously(handler: GestureHandler): Boolean {
590583
if (handler === this) {
591584
return true
592585
}
593586

594587
return interactionController?.shouldRecognizeSimultaneously(this, handler) ?: false
595588
}
596589

597-
open fun shouldBeCancelledBy(handler: GestureHandler<*>): Boolean {
590+
open fun shouldBeCancelledBy(handler: GestureHandler): Boolean {
598591
if (handler === this) {
599592
return false
600593
}
@@ -685,7 +678,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
685678
* Returns true if the view this handler is attached to is a descendant of the view the other handler
686679
* is attached to and false otherwise.
687680
*/
688-
fun isDescendantOf(of: GestureHandler<*>): Boolean {
681+
fun isDescendantOf(of: GestureHandler): Boolean {
689682
var view = this.view?.parent as? View
690683
while (view != null) {
691684
if (view == of.view) {
@@ -794,11 +787,6 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
794787
}
795788
}
796789

797-
fun setOnTouchEventListener(listener: OnTouchEventListener?): GestureHandler<*> {
798-
onTouchEventListener = listener
799-
return this
800-
}
801-
802790
override fun toString(): String {
803791
val viewString = if (view == null) null else view!!.javaClass.simpleName
804792
return this.javaClass.simpleName + "@[" + tag + "]:" + viewString
@@ -814,7 +802,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
814802
val lastPositionInWindowY: Float
815803
get() = lastAbsolutePositionY + lastEventOffsetY - windowOffset[1]
816804

817-
abstract class Factory<T : GestureHandler<T>> {
805+
abstract class Factory<T : GestureHandler> {
818806
abstract val type: Class<T>
819807
abstract val name: String
820808

@@ -862,7 +850,7 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
862850
private const val KEY_HIT_SLOP_WIDTH = "width"
863851
private const val KEY_HIT_SLOP_HEIGHT = "height"
864852

865-
private fun handleHitSlopProperty(handler: GestureHandler<*>, config: ReadableMap) {
853+
private fun handleHitSlopProperty(handler: GestureHandler, config: ReadableMap) {
866854
if (config.getType(KEY_HIT_SLOP) == ReadableType.Number) {
867855
val hitSlop = PixelUtil.toPixelFromDIP(config.getDouble(KEY_HIT_SLOP))
868856
handler.setHitSlop(hitSlop, hitSlop, hitSlop, hitSlop, GestureHandler.HIT_SLOP_NONE, GestureHandler.HIT_SLOP_NONE)
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.swmansion.gesturehandler.core
22

33
interface GestureHandlerInteractionController {
4-
fun shouldWaitForHandlerFailure(handler: GestureHandler<*>, otherHandler: GestureHandler<*>): Boolean
5-
fun shouldRequireHandlerToWaitForFailure(handler: GestureHandler<*>, otherHandler: GestureHandler<*>): Boolean
6-
fun shouldRecognizeSimultaneously(handler: GestureHandler<*>, otherHandler: GestureHandler<*>): Boolean
7-
fun shouldHandlerBeCancelledBy(handler: GestureHandler<*>, otherHandler: GestureHandler<*>): Boolean
4+
fun shouldWaitForHandlerFailure(handler: GestureHandler, otherHandler: GestureHandler): Boolean
5+
fun shouldRequireHandlerToWaitForFailure(handler: GestureHandler, otherHandler: GestureHandler): Boolean
6+
fun shouldRecognizeSimultaneously(handler: GestureHandler, otherHandler: GestureHandler): Boolean
7+
fun shouldHandlerBeCancelledBy(handler: GestureHandler, otherHandler: GestureHandler): Boolean
88
}

android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ class GestureHandlerOrchestrator(
2020
* traversing view hierarchy and looking for gesture handlers.
2121
*/
2222
var minimumAlphaForTraversal = DEFAULT_MIN_ALPHA_FOR_TRAVERSAL
23-
private val gestureHandlers = arrayListOf<GestureHandler<*>>()
24-
private val awaitingHandlers = arrayListOf<GestureHandler<*>>()
25-
private val preparedHandlers = arrayListOf<GestureHandler<*>>()
23+
private val gestureHandlers = arrayListOf<GestureHandler>()
24+
private val awaitingHandlers = arrayListOf<GestureHandler>()
25+
private val preparedHandlers = arrayListOf<GestureHandler>()
2626

2727
// In `onHandlerStateChange` method we iterate through `awaitingHandlers`, but calling `tryActivate` may modify this list.
2828
// To avoid `ConcurrentModificationException` we iterate through copy. There is one more problem though - if handler was
@@ -82,16 +82,16 @@ class GestureHandlerOrchestrator(
8282
finishedHandlersCleanupScheduled = false
8383
}
8484

85-
private fun hasOtherHandlerToWaitFor(handler: GestureHandler<*>) =
85+
private fun hasOtherHandlerToWaitFor(handler: GestureHandler) =
8686
gestureHandlers.any { !isFinished(it.state) && shouldHandlerWaitForOther(handler, it) }
8787

88-
private fun shouldBeCancelledByFinishedHandler(handler: GestureHandler<*>) =
88+
private fun shouldBeCancelledByFinishedHandler(handler: GestureHandler) =
8989
gestureHandlers.any { shouldHandlerWaitForOther(handler, it) && it.state == GestureHandler.STATE_END }
9090

91-
private fun shouldBeCancelledByActiveHandler(handler: GestureHandler<*>) =
91+
private fun shouldBeCancelledByActiveHandler(handler: GestureHandler) =
9292
gestureHandlers.any { handler.hasCommonPointers(it) && it.state == GestureHandler.STATE_ACTIVE && !canRunSimultaneously(handler, it) && handler.isDescendantOf(it) }
9393

94-
private fun tryActivate(handler: GestureHandler<*>) {
94+
private fun tryActivate(handler: GestureHandler) {
9595
// If we are waiting for a gesture that has successfully finished, we should cancel handler
9696
if (shouldBeCancelledByFinishedHandler(handler) || shouldBeCancelledByActiveHandler(handler)) {
9797
handler.cancel()
@@ -120,7 +120,7 @@ class GestureHandlerOrchestrator(
120120
}
121121

122122
/*package*/
123-
fun onHandlerStateChange(handler: GestureHandler<*>, newState: Int, prevState: Int) {
123+
fun onHandlerStateChange(handler: GestureHandler, newState: Int, prevState: Int) {
124124
handlingChangeSemaphore += 1
125125
if (isFinished(newState)) {
126126
// We have to loop through copy in order to avoid modifying collection
@@ -178,7 +178,7 @@ class GestureHandlerOrchestrator(
178178
scheduleFinishedHandlersCleanup()
179179
}
180180

181-
private fun makeActive(handler: GestureHandler<*>) {
181+
private fun makeActive(handler: GestureHandler) {
182182
val currentState = handler.state
183183
with(handler) {
184184
isAwaiting = false
@@ -253,7 +253,7 @@ class GestureHandlerOrchestrator(
253253
}
254254
}
255255

256-
private fun deliverEventToGestureHandler(handler: GestureHandler<*>, sourceEvent: MotionEvent) {
256+
private fun deliverEventToGestureHandler(handler: GestureHandler, sourceEvent: MotionEvent) {
257257
if (!isViewAttachedUnderWrapper(handler.view)) {
258258
handler.cancel()
259259
return
@@ -404,7 +404,7 @@ class GestureHandlerOrchestrator(
404404
return point
405405
}
406406

407-
private fun addAwaitingHandler(handler: GestureHandler<*>) {
407+
private fun addAwaitingHandler(handler: GestureHandler) {
408408
if (awaitingHandlers.contains(handler)) {
409409
return
410410
}
@@ -418,7 +418,7 @@ class GestureHandlerOrchestrator(
418418
}
419419
}
420420

421-
private fun recordHandlerIfNotPresent(handler: GestureHandler<*>, view: View) {
421+
private fun recordHandlerIfNotPresent(handler: GestureHandler, view: View) {
422422
if (gestureHandlers.contains(handler)) {
423423
return
424424
}
@@ -474,7 +474,7 @@ class GestureHandlerOrchestrator(
474474
// There's only one exception - RootViewGestureHandler. TalkBack uses hover events,
475475
// so we need to pass them into RootViewGestureHandler, otherwise press and hold
476476
// gesture stops working correctly (see https://github.com/software-mansion/react-native-gesture-handler/issues/3407)
477-
private fun shouldHandlerSkipHoverEvents(handler: GestureHandler<*>, action: Int): Boolean {
477+
private fun shouldHandlerSkipHoverEvents(handler: GestureHandler, action: Int): Boolean {
478478
val shouldSkipHoverEvents =
479479
handler !is HoverGestureHandler && handler !is RNGestureHandlerRootHelper.RootViewGestureHandler
480480

@@ -629,7 +629,7 @@ class GestureHandlerOrchestrator(
629629
private val matrixTransformCoords = FloatArray(2)
630630
private val inverseMatrix = Matrix()
631631
private val tempCoords = FloatArray(2)
632-
private val handlersComparator = Comparator<GestureHandler<*>> { a, b ->
632+
private val handlersComparator = Comparator<GestureHandler> { a, b ->
633633
return@Comparator if (a.isActive && b.isActive || a.isAwaiting && b.isAwaiting) {
634634
// both A and B are either active or awaiting activation, in which case we prefer one that
635635
// has activated (or turned into "awaiting" state) earlier
@@ -683,17 +683,17 @@ class GestureHandlerOrchestrator(
683683
private fun isTransformedTouchPointInView(x: Float, y: Float, child: View) =
684684
x in 0f..child.width.toFloat() && y in 0f..child.height.toFloat()
685685

686-
private fun shouldHandlerWaitForOther(handler: GestureHandler<*>, other: GestureHandler<*>): Boolean {
686+
private fun shouldHandlerWaitForOther(handler: GestureHandler, other: GestureHandler): Boolean {
687687
return handler !== other && (
688688
handler.shouldWaitForHandlerFailure(other) ||
689689
other.shouldRequireToWaitForFailure(handler)
690690
)
691691
}
692692

693-
private fun canRunSimultaneously(a: GestureHandler<*>, b: GestureHandler<*>) =
693+
private fun canRunSimultaneously(a: GestureHandler, b: GestureHandler) =
694694
a === b || a.shouldRecognizeSimultaneously(b) || b.shouldRecognizeSimultaneously(a)
695695

696-
private fun shouldHandlerBeCancelledBy(handler: GestureHandler<*>, other: GestureHandler<*>): Boolean {
696+
private fun shouldHandlerBeCancelledBy(handler: GestureHandler, other: GestureHandler): Boolean {
697697
if (!handler.hasCommonPointers(other)) {
698698
// if two handlers share no common pointer one can never trigger cancel for the other
699699
return false

android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerRegistry.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import android.view.View
44
import java.util.*
55

66
interface GestureHandlerRegistry {
7-
fun getHandlersForView(view: View): ArrayList<GestureHandler<*>>?
7+
fun getHandlersForView(view: View): ArrayList<GestureHandler>?
88
}

android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import com.swmansion.gesturehandler.react.RNGestureHandlerRootHelper
1010
import com.swmansion.gesturehandler.react.RNViewConfigurationHelper
1111
import com.swmansion.gesturehandler.react.eventbuilders.HoverGestureHandlerEventDataBuilder
1212

13-
class HoverGestureHandler : GestureHandler<HoverGestureHandler>() {
13+
class HoverGestureHandler : GestureHandler() {
1414
private var handler: Handler? = null
1515
private var finishRunnable = Runnable { finish() }
1616
var stylusData: StylusData = StylusData()
1717
private set
1818

19-
private infix fun isAncestorOf(other: GestureHandler<*>): Boolean {
19+
private infix fun isAncestorOf(other: GestureHandler): Boolean {
2020
var current: View? = other.view
2121

2222
while (current != null) {
@@ -50,15 +50,15 @@ class HoverGestureHandler : GestureHandler<HoverGestureHandler>() {
5050
return null
5151
}
5252

53-
override fun shouldBeCancelledBy(handler: GestureHandler<*>): Boolean {
53+
override fun shouldBeCancelledBy(handler: GestureHandler): Boolean {
5454
if (handler is HoverGestureHandler && !(handler isAncestorOf this)) {
5555
return isViewDisplayedOverAnother(handler.view!!, this.view!!)!!
5656
}
5757

5858
return super.shouldBeCancelledBy(handler)
5959
}
6060

61-
override fun shouldRequireToWaitForFailure(handler: GestureHandler<*>): Boolean {
61+
override fun shouldRequireToWaitForFailure(handler: GestureHandler): Boolean {
6262
if (handler is HoverGestureHandler) {
6363
if (!(this isAncestorOf handler) && !(handler isAncestorOf this)) {
6464
isViewDisplayedOverAnother(this.view!!, handler.view!!)?.let {
@@ -70,7 +70,7 @@ class HoverGestureHandler : GestureHandler<HoverGestureHandler>() {
7070
return super.shouldRequireToWaitForFailure(handler)
7171
}
7272

73-
override fun shouldRecognizeSimultaneously(handler: GestureHandler<*>): Boolean {
73+
override fun shouldRecognizeSimultaneously(handler: GestureHandler): Boolean {
7474
if (handler is HoverGestureHandler && (this isAncestorOf handler || handler isAncestorOf this)) {
7575
return true
7676
}

android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.facebook.react.bridge.ReadableMap
99
import com.facebook.react.uimanager.PixelUtil
1010
import com.swmansion.gesturehandler.react.eventbuilders.LongPressGestureHandlerEventDataBuilder
1111

12-
class LongPressGestureHandler(context: Context) : GestureHandler<LongPressGestureHandler>() {
12+
class LongPressGestureHandler(context: Context) : GestureHandler() {
1313
var minDurationMs = DEFAULT_MIN_DURATION_MS
1414
val duration: Int
1515
get() = (previousTime - startTime).toInt()

android/src/main/java/com/swmansion/gesturehandler/core/ManualGestureHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import android.content.Context
44
import android.view.MotionEvent
55
import com.swmansion.gesturehandler.react.eventbuilders.ManualGestureHandlerEventDataBuilder
66

7-
class ManualGestureHandler : GestureHandler<ManualGestureHandler>() {
7+
class ManualGestureHandler : GestureHandler() {
88
override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) {
99
if (state == STATE_UNDETERMINED) {
1010
begin()

0 commit comments

Comments
 (0)