@react-native-oh-tpl/react-native-gesture-handler 2.12.9 → 2.14.4-1
Sign up to get free protection for your applications and to get access to all the features.
- package/DrawerLayout/index.ts +2 -0
- package/Swipeable/index.ts +2 -0
- package/harmony/gesture_handler.har +0 -0
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/index.js +91 -137
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- 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.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 +69 -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
|
-
}
|