@react-native-oh-tpl/react-native-gesture-handler 2.12.9 → 2.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/DrawerLayout/index.ts +2 -0
  2. package/Swipeable/index.ts +2 -0
  3. package/harmony/gesture_handler.har +0 -0
  4. package/lib/commonjs/RNGestureHandlerModule.js +2 -3
  5. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  6. package/lib/commonjs/components/GestureHandlerRootView.js +3 -3
  7. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  8. package/lib/commonjs/handlers/createHandler.js +15 -18
  9. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  10. package/lib/commonjs/index.js +94 -137
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js +1 -2
  13. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
  14. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js +2 -3
  15. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  16. package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js +2 -3
  17. package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  18. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  19. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  20. package/lib/module/handlers/createHandler.js +12 -15
  21. package/lib/module/handlers/createHandler.js.map +1 -1
  22. package/lib/module/index.js +10 -141
  23. package/lib/module/index.js.map +1 -1
  24. package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
  25. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  26. package/lib/module/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  27. package/lib/typescript/RNGestureHandlerModule.d.ts +2 -2
  28. package/lib/typescript/components/GestureHandlerRootView.d.ts +6 -6
  29. package/lib/typescript/handlers/createHandler.d.ts +11 -11
  30. package/lib/typescript/index.d.ts +42 -9
  31. package/lib/typescript/index.d.ts.map +1 -1
  32. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +14 -14
  33. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +14 -14
  34. package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.d.ts +6 -6
  35. package/package.json +74 -66
  36. package/src/RNGestureHandlerModule.ts +4 -4
  37. package/src/components/GestureHandlerRootView.tsx +23 -23
  38. package/src/handlers/createHandler.tsx +534 -534
  39. package/src/index.ts +172 -172
  40. package/src/specs/NativeRNGestureHandlerModule.ts +26 -26
  41. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +18 -18
  42. package/src/specs/RNGestureHandlerRootViewNativeComponent.ts +6 -6
  43. package/harmony/gesture_handler/BuildProfile.ets +0 -5
  44. package/harmony/gesture_handler/build-profile.json5 +0 -19
  45. package/harmony/gesture_handler/hvigorfile.ts +0 -2
  46. package/harmony/gesture_handler/index.ets +0 -3
  47. package/harmony/gesture_handler/oh-package-lock.json5 +0 -17
  48. package/harmony/gesture_handler/oh-package.json5 +0 -12
  49. package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +0 -8
  50. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +0 -103
  51. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +0 -21
  52. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentDescriptor.h +0 -36
  53. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentInstance.h +0 -27
  54. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonJSIBinder.h +0 -32
  55. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.cpp +0 -22
  56. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.h +0 -15
  57. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerPackage.h +0 -72
  58. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentDescriptor.h +0 -36
  59. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentInstance.h +0 -78
  60. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewJSIBinder.h +0 -25
  61. package/harmony/gesture_handler/src/main/ets/CircularBuffer.ts +0 -42
  62. package/harmony/gesture_handler/src/main/ets/Event.ts +0 -68
  63. package/harmony/gesture_handler/src/main/ets/EventDispatcher.ts +0 -53
  64. package/harmony/gesture_handler/src/main/ets/GestureHandler.ts +0 -663
  65. package/harmony/gesture_handler/src/main/ets/GestureHandlerArkUIAdapter.ts +0 -203
  66. package/harmony/gesture_handler/src/main/ets/GestureHandlerFactory.ts +0 -45
  67. package/harmony/gesture_handler/src/main/ets/GestureHandlerOrchestrator.ts +0 -280
  68. package/harmony/gesture_handler/src/main/ets/GestureHandlerPackage.ts +0 -22
  69. package/harmony/gesture_handler/src/main/ets/GestureHandlerRegistry.ts +0 -28
  70. package/harmony/gesture_handler/src/main/ets/InteractionManager.ts +0 -109
  71. package/harmony/gesture_handler/src/main/ets/LeastSquareSolver.ts +0 -182
  72. package/harmony/gesture_handler/src/main/ets/NativeViewGestureHandler.ts +0 -115
  73. package/harmony/gesture_handler/src/main/ets/OutgoingEvent.ts +0 -34
  74. package/harmony/gesture_handler/src/main/ets/PanGestureHandler.ts +0 -328
  75. package/harmony/gesture_handler/src/main/ets/PointerTracker.ts +0 -239
  76. package/harmony/gesture_handler/src/main/ets/RNGHError.ts +0 -5
  77. package/harmony/gesture_handler/src/main/ets/RNGHLogger.ts +0 -48
  78. package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandlerArkTS.ts +0 -60
  79. package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandlerCAPI.ts +0 -87
  80. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerButton.ets +0 -38
  81. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerModule.ts +0 -183
  82. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerRootView.ets +0 -53
  83. package/harmony/gesture_handler/src/main/ets/RNOHScrollLocker.ts +0 -23
  84. package/harmony/gesture_handler/src/main/ets/State.ts +0 -47
  85. package/harmony/gesture_handler/src/main/ets/TapGestureHandler.ts +0 -206
  86. package/harmony/gesture_handler/src/main/ets/Vector2D.ts +0 -36
  87. package/harmony/gesture_handler/src/main/ets/VelocityTracker.ts +0 -98
  88. package/harmony/gesture_handler/src/main/ets/View.ts +0 -71
  89. package/harmony/gesture_handler/src/main/ets/ViewRegistry.ts +0 -43
  90. package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerButton.ts +0 -140
  91. package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerModule.ts +0 -25
  92. package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerRootView.ts +0 -101
  93. package/harmony/gesture_handler/src/main/ets/namespace/ts.ts +0 -3
  94. package/harmony/gesture_handler/src/main/ets/pages/Index.ets +0 -17
  95. package/harmony/gesture_handler/src/main/ets/types.ts +0 -25
  96. package/harmony/gesture_handler/src/main/ets/webviewability/WebviewAbility.ts +0 -41
  97. package/harmony/gesture_handler/src/main/module.json5 +0 -7
  98. package/harmony/gesture_handler/src/main/resources/base/element/color.json +0 -8
  99. package/harmony/gesture_handler/src/main/resources/base/element/string.json +0 -16
  100. package/harmony/gesture_handler/src/main/resources/base/media/icon.png +0 -0
  101. package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +0 -5
  102. package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +0 -16
  103. package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +0 -16
  104. package/harmony/gesture_handler/ts.ts +0 -2
@@ -1,203 +0,0 @@
1
- import { Point } from "@rnoh/react-native-openharmony/ts"
2
- import { GestureHandler } from "./GestureHandler"
3
- import { AdaptedEvent, EventType, PointerType, TouchEventType, Touch } from "./Event"
4
- import { View } from "./View"
5
- import { RNGHLogger } from "./RNGHLogger"
6
- import { TouchEvent, TouchType, TouchObject } from "./types"
7
-
8
- export class GestureHandlerArkUIAdapter {
9
- private activePointerIds = new Set<number>()
10
- private pointersIdInBounds = new Set<number>()
11
- private gestureHandler: GestureHandler
12
- private view: View
13
- private logger: RNGHLogger
14
-
15
- constructor(gestureHandler: GestureHandler, view: View, logger: RNGHLogger) {
16
- logger.info("constructor")
17
- this.gestureHandler = gestureHandler
18
- this.view = view
19
- this.logger = logger
20
- }
21
-
22
- handleTouch(e: TouchEvent) {
23
- for (const changedTouch of e.changedTouches) {
24
- if (this.shouldSkipTouch(changedTouch)) continue;
25
- const wasInBounds = this.pointersIdInBounds.has(changedTouch.id)
26
- const isInBounds = this.isInBounds({ x: changedTouch.windowX, y: changedTouch.windowY })
27
- this.logger.info(`handleTouch: ${JSON.stringify({ type: changedTouch.type, wasInBounds, isInBounds })}`)
28
- const adaptedEvent = this.adaptTouchEvent(e, changedTouch)
29
- switch (adaptedEvent.eventType) {
30
- case EventType.DOWN:
31
- this.gestureHandler.onPointerDown(adaptedEvent)
32
- break;
33
- case EventType.ADDITIONAL_POINTER_DOWN:
34
- this.gestureHandler.onAdditionalPointerAdd(adaptedEvent)
35
- break;
36
- case EventType.UP:
37
- this.gestureHandler.onPointerUp(adaptedEvent)
38
- break;
39
- case EventType.ADDITIONAL_POINTER_UP:
40
- this.gestureHandler.onAdditionalPointerRemove(adaptedEvent)
41
- break;
42
- case EventType.MOVE:
43
- if (!wasInBounds && !isInBounds)
44
- this.gestureHandler.onPointerOutOfBounds(adaptedEvent)
45
- else
46
- this.gestureHandler.onPointerMove(adaptedEvent)
47
- break;
48
- case EventType.ENTER:
49
- this.gestureHandler.onPointerEnter(adaptedEvent)
50
- break;
51
- case EventType.OUT:
52
- this.gestureHandler.onPointerOut(adaptedEvent)
53
- break;
54
- case EventType.CANCEL:
55
- this.gestureHandler.onPointerCancel(adaptedEvent)
56
- break;
57
- }
58
- }
59
- }
60
-
61
- private shouldSkipTouch(changedTouch: TouchObject): boolean {
62
- return changedTouch.type === TouchType.Down && !this.isInBounds({
63
- x: changedTouch.windowX,
64
- y: changedTouch.windowY
65
- })
66
- }
67
-
68
- private adaptTouchEvent(e: TouchEvent, changedTouch: TouchObject): AdaptedEvent {
69
- const xAbsolute = changedTouch.windowX
70
- const yAbsolute = changedTouch.windowY
71
-
72
- const eventType = this.mapTouchTypeToEventType(
73
- changedTouch.type,
74
- this.activePointerIds.size,
75
- this.isInBounds({ x: xAbsolute, y: yAbsolute }),
76
- this.pointersIdInBounds.has(changedTouch.id)
77
- )
78
- this.updateIsInBoundsByPointerId(
79
- changedTouch.type,
80
- changedTouch.id,
81
- xAbsolute,
82
- yAbsolute
83
- )
84
- this.updateActivePointers(changedTouch.type, changedTouch.id)
85
- return {
86
- x: xAbsolute,
87
- y: yAbsolute,
88
- offsetX: xAbsolute - this.view.getBoundingRect().x,
89
- offsetY: yAbsolute - this.view.getBoundingRect().y,
90
- pointerId: changedTouch.id,
91
- eventType: eventType,
92
- pointerType: PointerType.TOUCH,
93
- buttons: 0,
94
- time: e.timestamp,
95
- allTouches: e.touches.map((touch) => this.mapTouchObjectToTouch(touch)),
96
- changedTouches: e.changedTouches.map((touch) => this.mapTouchObjectToTouch(touch)),
97
- touchEventType: this.mapTouchTypeToTouchEventType(changedTouch.type)
98
- }
99
- }
100
-
101
- private updateIsInBoundsByPointerId(
102
- touchType: TouchType,
103
- pointerId: number,
104
- x: number,
105
- y: number
106
- ) {
107
- switch (touchType) {
108
- case TouchType.Down:
109
- if (this.isInBounds({ x, y }))
110
- this.pointersIdInBounds.add(pointerId)
111
- break;
112
- case TouchType.Move:
113
- if (this.isInBounds({ x, y }))
114
- this.pointersIdInBounds.add(pointerId)
115
- else
116
- this.pointersIdInBounds.delete(pointerId)
117
- break;
118
- case TouchType.Up:
119
- this.pointersIdInBounds.delete(pointerId)
120
- break;
121
- case TouchType.Cancel:
122
- this.pointersIdInBounds.delete(pointerId)
123
- break;
124
- }
125
- }
126
-
127
- private isInBounds(point: Point): boolean {
128
- const x = point.x
129
- const y = point.y
130
- const rect = this.view.getBoundingRect()
131
- const result = x >= rect.x && x <= (rect.x + rect.width) && y >= rect.y && y <= (rect.y + rect.height)
132
- return result;
133
- }
134
-
135
- private updateActivePointers(touchType: TouchType, pointerId: number): void {
136
- switch (touchType) {
137
- case TouchType.Down:
138
- this.activePointerIds.add(pointerId)
139
- case TouchType.Up:
140
- this.activePointerIds.delete(pointerId)
141
- case TouchType.Cancel:
142
- this.activePointerIds.clear()
143
- default:
144
- return
145
- }
146
- }
147
-
148
- private mapTouchObjectToTouch(touchObject: TouchObject): Touch {
149
- return {
150
- id: touchObject.id,
151
- x: touchObject.x,
152
- y: touchObject.y,
153
- absoluteX: touchObject.windowX,
154
- absoluteY: touchObject.windowY
155
- }
156
- }
157
-
158
- private mapTouchTypeToEventType(
159
- touchType: TouchType,
160
- activePointersCounter: number,
161
- isCurrentlyInBounds: boolean,
162
- wasInBounds: boolean
163
- ): EventType {
164
- switch (touchType) {
165
- case TouchType.Down:
166
- if (activePointersCounter > 0)
167
- return EventType.ADDITIONAL_POINTER_DOWN
168
- else
169
- return EventType.DOWN
170
- case TouchType.Up:
171
- if (activePointersCounter > 1)
172
- return EventType.ADDITIONAL_POINTER_UP
173
- else
174
- return EventType.UP
175
- case TouchType.Move:
176
- if (isCurrentlyInBounds) {
177
- return wasInBounds ? EventType.MOVE : EventType.ENTER
178
- } else {
179
- return wasInBounds ? EventType.OUT : EventType.MOVE
180
- }
181
- case TouchType.Cancel:
182
- return EventType.CANCEL
183
- default:
184
- console.error("RNGH", "Unknown touchType:", touchType)
185
- throw new Error("Unknown touchType")
186
- }
187
- }
188
-
189
- private mapTouchTypeToTouchEventType(touchType: TouchType): TouchEventType {
190
- switch (touchType) {
191
- case TouchType.Down:
192
- return TouchEventType.DOWN
193
- case TouchType.Up:
194
- return TouchEventType.UP
195
- case TouchType.Move:
196
- return TouchEventType.MOVE
197
- case TouchType.Cancel:
198
- return TouchEventType.CANCELLED
199
- default:
200
- return TouchEventType.UNDETERMINED
201
- }
202
- }
203
- }
@@ -1,45 +0,0 @@
1
- import { GestureHandlerOrchestrator } from './GestureHandlerOrchestrator';
2
- import { GestureHandler, GestureHandlerDependencies, ScrollLocker } from "./GestureHandler"
3
- import { PointerTracker } from './PointerTracker';
4
- import { RNGHError } from "./RNGHError"
5
- import { InteractionManager } from './InteractionManager';
6
- import { RNGHLogger } from './RNGHLogger';
7
- import { TapGestureHandler } from './TapGestureHandler';
8
- import { PanGestureHandler } from "./PanGestureHandler"
9
- import { NativeViewGestureHandler } from "./NativeViewGestureHandler"
10
-
11
-
12
- export class GestureHandlerFactory {
13
- private orchestrator: GestureHandlerOrchestrator
14
- private interactionManager = new InteractionManager()
15
- private factoryLogger: RNGHLogger
16
-
17
- constructor(private logger: RNGHLogger, private scrollLocker: ScrollLocker) {
18
- this.factoryLogger = logger.cloneWithPrefix("Factory")
19
- this.orchestrator = new GestureHandlerOrchestrator(logger.cloneWithPrefix("Orchestrator"))
20
- }
21
-
22
- create(handlerName: string, handlerTag: number): GestureHandler {
23
- this.factoryLogger.info(`create ${handlerName} with handlerTag: ${handlerTag}`)
24
- const deps: GestureHandlerDependencies = {
25
- tracker: new PointerTracker(),
26
- orchestrator: this.orchestrator,
27
- handlerTag,
28
- interactionManager: this.interactionManager,
29
- logger: this.logger.cloneWithPrefix("GestureHandler"),
30
- scrollLocker: this.scrollLocker,
31
- }
32
- switch (handlerName) {
33
- case "TapGestureHandler":
34
- return new TapGestureHandler(deps)
35
- case "PanGestureHandler":
36
- return new PanGestureHandler(deps)
37
- case "NativeViewGestureHandler":
38
- return new NativeViewGestureHandler(deps)
39
- default:
40
- const msg = `Unknown handler type: ${handlerName}`
41
- this.factoryLogger.info(msg)
42
- throw new RNGHError(msg)
43
- }
44
- }
45
- }
@@ -1,280 +0,0 @@
1
- import { GestureHandler } from "./GestureHandler"
2
- import { State } from "./State"
3
- import { PointerType } from "./Event"
4
- import { RNGHLogger } from "./RNGHLogger"
5
-
6
- export class GestureHandlerOrchestrator {
7
- private awaitingHandlers: Set<GestureHandler> = new Set()
8
- private gestureHandlers: GestureHandler[] = []
9
- private handlersToCancel: GestureHandler[] = []
10
- private activationIndex: number = 0
11
-
12
- constructor(private logger: RNGHLogger) {
13
- }
14
-
15
- public onHandlerStateChange(handler: GestureHandler, newState: State, oldState: State, sendIfDisabled?: boolean) {
16
- this.logger.info("onHandlerStateChange")
17
- if (this.shouldCancelStateChange(handler, sendIfDisabled)) return;
18
- if (this.isFinishedState(newState)) {
19
- this.handleChangingToFinishedState(handler, newState)
20
- }
21
- if (newState === State.ACTIVE) {
22
- this.tryActivate(handler)
23
- } else if (oldState === State.ACTIVE || oldState === State.END) {
24
- if (handler.isActive()) {
25
- handler.sendEvent({ newState, oldState })
26
- } else if (oldState === State.ACTIVE && (newState === State.CANCELLED || newState === State.FAILED)) {
27
- // Handle edge case where handler awaiting for another one tries to activate but finishes
28
- // before the other would not send state change event upon ending. Note that we only want
29
- // to do this if the newState is either CANCELLED or FAILED, if it is END we still want to
30
- // wait for the other handler to finish as in that case synthetic events will be sent by the
31
- // makeActive method.
32
- handler.sendEvent({ newState, oldState: State.BEGAN })
33
- }
34
- } else if (newState !== State.CANCELLED || oldState !== State.UNDETERMINED) {
35
- // If handler is changing state from UNDETERMINED to CANCELLED, the state change event shouldn't
36
- // be sent. Handler hasn't yet began so it may not be initialized which results in crashes.
37
- // If it doesn't crash, there may be some weird behavior on JS side, as `onFinalize` will be
38
- // called without calling `onBegin` first.
39
- handler.sendEvent({ newState, oldState })
40
- }
41
- this.cleanUpHandlers(handler)
42
- }
43
-
44
- private isFinishedState(state: State) {
45
- return [State.END, State.FAILED, State.CANCELLED].includes(state)
46
- }
47
-
48
- private shouldCancelStateChange(handler: GestureHandler, sendIfDisabled?: boolean) {
49
- const isHandlerDisabled = !handler.isEnabled()
50
- return!sendIfDisabled && isHandlerDisabled
51
- }
52
-
53
- private handleChangingToFinishedState(handler: GestureHandler, newState: State) {
54
- this.awaitingHandlers.forEach(awaitingHandler => {
55
- if (handler.shouldWaitFor(awaitingHandler)) {
56
- if (newState === State.END) {
57
- awaitingHandler.cancel()
58
- if (awaitingHandler.getState() === State.END) {
59
- // Handle edge case, where discrete gestures end immediately after activation thus
60
- // their state is set to END and when the gesture they are waiting for activates they
61
- // should be cancelled, however `cancel` was never sent as gestures were already in the END state.
62
- // Send synthetic BEGAN -> CANCELLED to properly handle JS logic
63
- awaitingHandler.sendEvent({ newState: State.CANCELLED, oldState: State.BEGAN })
64
- }
65
- awaitingHandler.setAwaiting(false)
66
- } else {
67
- this.tryActivate(awaitingHandler)
68
- }
69
- }
70
- })
71
- }
72
-
73
- private tryActivate(handler: GestureHandler): void {
74
- if (this.hasOtherHandlerToWaitFor(handler)) {
75
- this.addAwaitingHandler(handler)
76
- } else if (handler.getState() !== State.CANCELLED && handler.getState() !== State.FAILED) {
77
- if (this.shouldActivate(handler)) {
78
- this.makeActive(handler);
79
- } else {
80
- switch (handler.getState()) {
81
- case State.ACTIVE:
82
- handler.fail();
83
- break;
84
- case State.BEGAN:
85
- handler.cancel();
86
- break;
87
- }
88
- }
89
- }
90
- }
91
-
92
- private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {
93
- for (const otherHandler of this.gestureHandlers) {
94
- if (!this.isFinishedState(otherHandler.getState()) && otherHandler.shouldWaitFor(handler)) {
95
- return true
96
- }
97
- }
98
- return false;
99
- }
100
-
101
- private addAwaitingHandler(handler: GestureHandler) {
102
- if (!this.awaitingHandlers.has(handler)) {
103
- this.awaitingHandlers.add(handler)
104
- handler.setAwaiting(true)
105
- handler.setActivationIndex(this.activationIndex++)
106
- }
107
- }
108
-
109
- private shouldActivate(handler: GestureHandler) {
110
- for (const otherHandler of this.gestureHandlers) {
111
- if (this.shouldHandlerBeCancelledByOtherHandler({ handler, otherHandler })) {
112
- return false
113
- }
114
- }
115
- return true
116
- }
117
-
118
- private shouldHandlerBeCancelledByOtherHandler({handler, otherHandler}: {
119
- handler: GestureHandler,
120
- otherHandler: GestureHandler
121
- }): boolean {
122
- if (this.canRunSimultaneously(handler, otherHandler))
123
- return false;
124
- if (handler !== otherHandler && (handler.isAwaiting() || handler.getState() === State.ACTIVE))
125
- return handler.shouldBeCancelledByOther(otherHandler)
126
- return this.checkOverlap(handler, otherHandler)
127
- }
128
-
129
- private canRunSimultaneously(handlerA: GestureHandler, handlerB: GestureHandler) {
130
- return handlerA === handlerB
131
- || handlerA.shouldRecognizeSimultaneously(handlerB)
132
- || handlerB.shouldRecognizeSimultaneously(handlerA)
133
- }
134
-
135
- private checkOverlap(
136
- handler: GestureHandler,
137
- otherHandler: GestureHandler
138
- ): boolean {
139
- // If handlers don't have common pointers, default return value is false.
140
- // However, if at least on pointer overlaps with both handlers, we return true
141
- // This solves issue in overlapping parents example
142
-
143
- // TODO: Find better way to handle that issue, for example by activation order and handler cancelling
144
-
145
- const handlerPointers: number[] = handler.getTrackedPointersID();
146
- const otherPointers: number[] = otherHandler.getTrackedPointersID();
147
- let overlap = false;
148
- handlerPointers.forEach((pointer: number) => {
149
- const handlerX: number = handler.getTracker().getLastX(pointer);
150
- const handlerY: number = handler.getTracker().getLastY(pointer);
151
- if (
152
- handler.getView().isPositionInBounds({ x: handlerX, y: handlerY }) &&
153
- otherHandler.getView().isPositionInBounds({ x: handlerX, y: handlerY })
154
- ) {
155
- overlap = true;
156
- }
157
- });
158
- otherPointers.forEach((pointer: number) => {
159
- const otherX: number = otherHandler.getTracker().getLastX(pointer);
160
- const otherY: number = otherHandler.getTracker().getLastY(pointer);
161
- if (
162
- handler.getView().isPositionInBounds({ x: otherX, y: otherY }) &&
163
- otherHandler.getView().isPositionInBounds({ x: otherX, y: otherY })
164
- ) {
165
- overlap = true;
166
- }
167
- });
168
- return overlap;
169
- }
170
-
171
- private makeActive(handler: GestureHandler): void {
172
- handler.setActive(true)
173
- handler.setShouldResetProgress(true)
174
- handler.setActivationIndex(this.activationIndex++)
175
- for (const otherHandler of this.gestureHandlers) {
176
- if (this.shouldHandlerBeCancelledByOtherHandler({ handler: otherHandler, otherHandler: handler })) {
177
- this.handlersToCancel.push(otherHandler)
178
- }
179
- }
180
- for (let i = this.handlersToCancel.length - 1; i >= 0; --i) {
181
- this.handlersToCancel[i]?.cancel();
182
- }
183
- this.handlersToCancel = []
184
- for (const awaitingHandler of this.awaitingHandlers) {
185
- if (this.shouldHandlerBeCancelledByOtherHandler({ handler: awaitingHandler, otherHandler: handler })) {
186
- awaitingHandler.cancel();
187
- awaitingHandler.setAwaiting(true);
188
- }
189
- }
190
- const currentState = handler.getState()
191
- handler.sendEvent({ newState: State.ACTIVE, oldState: State.BEGAN })
192
- if (currentState !== State.ACTIVE) {
193
- handler.sendEvent({ newState: State.END, oldState: State.ACTIVE })
194
- if (currentState !== State.END) {
195
- handler.sendEvent({ newState: State.UNDETERMINED, oldState: State.END })
196
- }
197
- }
198
- if (handler.isAwaiting()) {
199
- handler.setAwaiting(false)
200
- this.awaitingHandlers.delete(handler)
201
- }
202
- }
203
-
204
- private cleanUpHandlers(handler: GestureHandler) {
205
- this.cleanUpFinishedHandlers()
206
- if (this.awaitingHandlers.has(handler)) {
207
- this.cleanupAwaitingHandlers(handler);
208
- }
209
- }
210
-
211
- private cleanUpFinishedHandlers(): void {
212
- for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
213
- const handler = this.gestureHandlers[i];
214
- if (!handler) {
215
- continue;
216
- }
217
- if (this.isFinishedState(handler.getState()) && !handler.isAwaiting()) {
218
- this.gestureHandlers.splice(i, 1);
219
- this.cleanUpHandler(handler);
220
- }
221
- }
222
- }
223
-
224
- private cleanupAwaitingHandlers(handler: GestureHandler): void {
225
- for (const awaitingHandler of this.awaitingHandlers) {
226
- if (
227
- awaitingHandler.isAwaiting() &&
228
- awaitingHandler.shouldWaitFor(handler)
229
- ) {
230
- this.cleanUpHandler(awaitingHandler);
231
- this.awaitingHandlers.delete(awaitingHandler)
232
- }
233
- }
234
- }
235
-
236
- private cleanUpHandler(handler: GestureHandler) {
237
- handler.reset();
238
- handler.setActive(false);
239
- handler.setAwaiting(false);
240
- handler.setActivationIndex(Number.MAX_VALUE);
241
- }
242
-
243
- public registerHandlerIfNotPresent(handler: GestureHandler) {
244
- this.logger.info("registerHandlerIfNotPresent")
245
- if (this.gestureHandlers.includes(handler)) return;
246
- this.gestureHandlers.push(handler);
247
- handler.setActive(false);
248
- handler.setAwaiting(false);
249
- handler.setActivationIndex(Number.MAX_SAFE_INTEGER);
250
- }
251
-
252
- /**
253
- This function is called when handler receives touchdown event
254
- If handler is using mouse or pen as a pointer and any handler receives touch event,
255
- mouse/pen event disappears - it doesn't send onPointerCancel nor onPointerUp (and others)
256
- This became a problem because handler was left at active state without any signal to end or fail
257
- To handle this, when new touch event is received, we loop through active handlers and check which type of
258
- pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
259
- */
260
- public cancelMouseAndPenGestures(currentHandler: GestureHandler): void {
261
- this.logger.info("cancelMouseAndPenGestures")
262
- this.gestureHandlers.forEach((handler: GestureHandler) => {
263
- if (handler.getPointerType() !== PointerType.MOUSE && handler.getPointerType() !== PointerType.PEN) return;
264
-
265
- if (handler !== currentHandler) {
266
- handler.cancel();
267
- } else {
268
- // Handler that received touch event should have its pointer tracker reset
269
- // This allows handler to smoothly change from mouse/pen to touch
270
- // The drawback is, that when we try to use mouse/pen one more time, it doesn't send onPointerDown at the first time
271
- // so it is required to click two times to get handler to work
272
- //
273
- // However, handler will receive manually created onPointerEnter that is triggered in EventManager in onPointerMove method.
274
- // There may be possibility to use that fact to make handler respond properly to first mouse click
275
- handler.getTracker().resetTracker();
276
- }
277
- });
278
- }
279
- }
280
-
@@ -1,22 +0,0 @@
1
- import {RNPackage, TurboModuleContext, TurboModulesFactory} from '@rnoh/react-native-openharmony/ts';
2
- import type {TurboModule} from '@rnoh/react-native-openharmony/ts';
3
- import {RNGestureHandlerModule} from './RNGestureHandlerModule';
4
-
5
- class GestureHandlerTurboModulesFactory extends TurboModulesFactory {
6
- createTurboModule(name: string): TurboModule | null {
7
- if (name === RNGestureHandlerModule.NAME) {
8
- return new RNGestureHandlerModule(this.ctx);
9
- }
10
- return null;
11
- }
12
-
13
- hasTurboModule(name: string): boolean {
14
- return name === 'RNGestureHandlerModule';
15
- }
16
- }
17
-
18
- export class GestureHandlerPackage extends RNPackage {
19
- createTurboModulesFactory(ctx: TurboModuleContext): TurboModulesFactory {
20
- return new GestureHandlerTurboModulesFactory(ctx);
21
- }
22
- }
@@ -1,28 +0,0 @@
1
- import { GestureHandler } from "./GestureHandler"
2
- import { View } from "./View"
3
-
4
- export class GestureHandlerRegistry {
5
- private gestureHandlerByHandlerTag: Map<number, GestureHandler> = new Map()
6
- private gestureHandlersByViewTag: Map<number, Set<GestureHandler>> = new Map()
7
-
8
- public addGestureHandler(gestureHandler: GestureHandler) {
9
- this.gestureHandlerByHandlerTag.set(gestureHandler.getTag(), gestureHandler)
10
- }
11
-
12
- public bindGestureHandlerWithView(gestureHandlerTag: number, view: View) {
13
- const viewTag = view.getTag()
14
- if (!this.gestureHandlersByViewTag.has(viewTag))
15
- this.gestureHandlersByViewTag.set(viewTag, new Set())
16
- const gestureHandler = this.gestureHandlerByHandlerTag.get(gestureHandlerTag)
17
- this.gestureHandlersByViewTag.get(viewTag).add(gestureHandler)
18
- gestureHandler.onViewAttached(view)
19
- }
20
-
21
- public getGestureHandlersByViewTag(viewTag: number): GestureHandler[] {
22
- return Array.from(this.gestureHandlersByViewTag.get(viewTag) ?? [])
23
- }
24
-
25
- public getGestureHandlerByHandlerTag(handlerTag: number): GestureHandler {
26
- return this.gestureHandlerByHandlerTag.get(handlerTag)
27
- }
28
- }
@@ -1,109 +0,0 @@
1
- import { GestureHandler, Handler, GestureConfig as Config } from "./GestureHandler"
2
-
3
- export class InteractionManager {
4
- private readonly waitForRelations: Map<number, number[]> = new Map()
5
- private readonly simultaneousRelations: Map<number, number[]> = new Map()
6
-
7
- public configureInteractions(handler: GestureHandler, config: Config) {
8
- this.dropRelationsForHandlerWithTag(handler.getTag());
9
-
10
- if (config.waitFor) {
11
- const waitFor: number[] = [];
12
- config.waitFor.forEach((otherHandler: Handler): void => {
13
- // New API reference
14
- if (typeof otherHandler === 'number') {
15
- waitFor.push(otherHandler);
16
- } else {
17
- // Old API reference
18
- waitFor.push(otherHandler.handlerTag);
19
- }
20
- });
21
-
22
- this.waitForRelations.set(handler.getTag(), waitFor);
23
- }
24
-
25
- if (config.simultaneousHandlers) {
26
- const simultaneousHandlers: number[] = [];
27
- config.simultaneousHandlers.forEach((otherHandler: Handler): void => {
28
- if (typeof otherHandler === 'number') {
29
- simultaneousHandlers.push(otherHandler);
30
- } else {
31
- simultaneousHandlers.push(otherHandler.handlerTag);
32
- }
33
- });
34
-
35
- this.simultaneousRelations.set(handler.getTag(), simultaneousHandlers);
36
- }
37
- }
38
-
39
- public shouldWaitForHandlerFailure(
40
- handler: GestureHandler,
41
- otherHandler: GestureHandler
42
- ): boolean {
43
- const waitFor: number[] | undefined = this.waitForRelations.get(
44
- handler.getTag()
45
- );
46
- if (!waitFor) {
47
- return false;
48
- }
49
-
50
- let shouldWait = false;
51
-
52
- waitFor.forEach((tag: number): void => {
53
- if (tag === otherHandler.getTag()) {
54
- shouldWait = true;
55
- return; //Returns from callback
56
- }
57
- });
58
-
59
- return shouldWait;
60
- }
61
-
62
- public shouldRecognizeSimultaneously(
63
- handler: GestureHandler,
64
- otherHandler: GestureHandler
65
- ): boolean {
66
- const simultaneousHandlers: number[] | undefined =
67
- this.simultaneousRelations.get(handler.getTag());
68
- if (!simultaneousHandlers) {
69
- return false;
70
- }
71
-
72
- let shouldRecognizeSimultaneously = false;
73
-
74
- simultaneousHandlers.forEach((tag: number): void => {
75
- if (tag === otherHandler.getTag()) {
76
- shouldRecognizeSimultaneously = true;
77
- return;
78
- }
79
- });
80
-
81
- return shouldRecognizeSimultaneously;
82
- }
83
-
84
- public shouldRequireHandlerToWaitForFailure(
85
- _handler: GestureHandler,
86
- _otherHandler: GestureHandler
87
- ): boolean {
88
- //TODO: Implement logic
89
- return false;
90
- }
91
-
92
- public shouldHandlerBeCancelledBy(
93
- _handler: GestureHandler,
94
- _otherHandler: GestureHandler
95
- ): boolean {
96
- //TODO: Implement logic
97
- return false;
98
- }
99
-
100
- public dropRelationsForHandlerWithTag(handlerTag: number): void {
101
- this.waitForRelations.delete(handlerTag);
102
- this.simultaneousRelations.delete(handlerTag);
103
- }
104
-
105
- public reset() {
106
- this.waitForRelations.clear();
107
- this.simultaneousRelations.clear();
108
- }
109
- }