@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.
- package/DrawerLayout/index.ts +2 -0
- package/Swipeable/index.ts +2 -0
- package/harmony/gesture_handler.har +0 -0
- package/lib/commonjs/RNGestureHandlerModule.js +2 -3
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerRootView.js +3 -3
- package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +15 -18
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/index.js +94 -137
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeRNGestureHandlerModule.js +1 -2
- package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js +2 -3
- package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js +2 -3
- package/lib/commonjs/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/components/GestureHandlerRootView.js.map +1 -1
- package/lib/module/handlers/createHandler.js +12 -15
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/index.js +10 -141
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/specs/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/typescript/RNGestureHandlerModule.d.ts +2 -2
- package/lib/typescript/components/GestureHandlerRootView.d.ts +6 -6
- package/lib/typescript/handlers/createHandler.d.ts +11 -11
- package/lib/typescript/index.d.ts +42 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +14 -14
- package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +14 -14
- package/lib/typescript/specs/RNGestureHandlerRootViewNativeComponent.d.ts +6 -6
- package/package.json +74 -66
- package/src/RNGestureHandlerModule.ts +4 -4
- package/src/components/GestureHandlerRootView.tsx +23 -23
- package/src/handlers/createHandler.tsx +534 -534
- package/src/index.ts +172 -172
- package/src/specs/NativeRNGestureHandlerModule.ts +26 -26
- package/src/specs/RNGestureHandlerButtonNativeComponent.ts +18 -18
- package/src/specs/RNGestureHandlerRootViewNativeComponent.ts +6 -6
- package/harmony/gesture_handler/BuildProfile.ets +0 -5
- package/harmony/gesture_handler/build-profile.json5 +0 -19
- package/harmony/gesture_handler/hvigorfile.ts +0 -2
- package/harmony/gesture_handler/index.ets +0 -3
- package/harmony/gesture_handler/oh-package-lock.json5 +0 -17
- package/harmony/gesture_handler/oh-package.json5 +0 -12
- package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +0 -8
- package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +0 -103
- package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +0 -21
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentDescriptor.h +0 -36
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentInstance.h +0 -27
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonJSIBinder.h +0 -32
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.cpp +0 -22
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.h +0 -15
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerPackage.h +0 -72
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentDescriptor.h +0 -36
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentInstance.h +0 -78
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewJSIBinder.h +0 -25
- package/harmony/gesture_handler/src/main/ets/CircularBuffer.ts +0 -42
- package/harmony/gesture_handler/src/main/ets/Event.ts +0 -68
- package/harmony/gesture_handler/src/main/ets/EventDispatcher.ts +0 -53
- package/harmony/gesture_handler/src/main/ets/GestureHandler.ts +0 -663
- package/harmony/gesture_handler/src/main/ets/GestureHandlerArkUIAdapter.ts +0 -203
- package/harmony/gesture_handler/src/main/ets/GestureHandlerFactory.ts +0 -45
- package/harmony/gesture_handler/src/main/ets/GestureHandlerOrchestrator.ts +0 -280
- package/harmony/gesture_handler/src/main/ets/GestureHandlerPackage.ts +0 -22
- package/harmony/gesture_handler/src/main/ets/GestureHandlerRegistry.ts +0 -28
- package/harmony/gesture_handler/src/main/ets/InteractionManager.ts +0 -109
- package/harmony/gesture_handler/src/main/ets/LeastSquareSolver.ts +0 -182
- package/harmony/gesture_handler/src/main/ets/NativeViewGestureHandler.ts +0 -115
- package/harmony/gesture_handler/src/main/ets/OutgoingEvent.ts +0 -34
- package/harmony/gesture_handler/src/main/ets/PanGestureHandler.ts +0 -328
- package/harmony/gesture_handler/src/main/ets/PointerTracker.ts +0 -239
- package/harmony/gesture_handler/src/main/ets/RNGHError.ts +0 -5
- package/harmony/gesture_handler/src/main/ets/RNGHLogger.ts +0 -48
- package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandlerArkTS.ts +0 -60
- package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandlerCAPI.ts +0 -87
- package/harmony/gesture_handler/src/main/ets/RNGestureHandlerButton.ets +0 -38
- package/harmony/gesture_handler/src/main/ets/RNGestureHandlerModule.ts +0 -183
- package/harmony/gesture_handler/src/main/ets/RNGestureHandlerRootView.ets +0 -53
- package/harmony/gesture_handler/src/main/ets/RNOHScrollLocker.ts +0 -23
- package/harmony/gesture_handler/src/main/ets/State.ts +0 -47
- package/harmony/gesture_handler/src/main/ets/TapGestureHandler.ts +0 -206
- package/harmony/gesture_handler/src/main/ets/Vector2D.ts +0 -36
- package/harmony/gesture_handler/src/main/ets/VelocityTracker.ts +0 -98
- package/harmony/gesture_handler/src/main/ets/View.ts +0 -71
- package/harmony/gesture_handler/src/main/ets/ViewRegistry.ts +0 -43
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerButton.ts +0 -140
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerModule.ts +0 -25
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerRootView.ts +0 -101
- package/harmony/gesture_handler/src/main/ets/namespace/ts.ts +0 -3
- package/harmony/gesture_handler/src/main/ets/pages/Index.ets +0 -17
- package/harmony/gesture_handler/src/main/ets/types.ts +0 -25
- package/harmony/gesture_handler/src/main/ets/webviewability/WebviewAbility.ts +0 -41
- package/harmony/gesture_handler/src/main/module.json5 +0 -7
- package/harmony/gesture_handler/src/main/resources/base/element/color.json +0 -8
- package/harmony/gesture_handler/src/main/resources/base/element/string.json +0 -16
- package/harmony/gesture_handler/src/main/resources/base/media/icon.png +0 -0
- package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +0 -5
- package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +0 -16
- package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +0 -16
- 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
|
-
}
|