@react-native-oh-tpl/react-native-gesture-handler 2.12.9 → 2.14.1-2.14.9
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/BuildProfile.ets +15 -3
- package/harmony/gesture_handler/hvigorfile.ts +1 -1
- package/harmony/gesture_handler/index.ets +2 -2
- package/harmony/gesture_handler/oh-package-lock.json5 +4 -3
- package/harmony/gesture_handler/oh-package.json5 +4 -4
- package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +63 -17
- package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +3 -3
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewJSIBinder.h +2 -2
- package/harmony/gesture_handler/src/main/cpp/{RNGestureHandlerButtonComponentInstance.h → componentInstances/RNGestureHandlerButtonComponentInstance.h} +2 -2
- package/harmony/gesture_handler/src/main/cpp/componentInstances/RNGestureHandlerRootViewComponentInstance.h +234 -0
- package/harmony/gesture_handler/src/main/ets/{GestureHandler.ts → core/GestureHandler.ts} +46 -25
- package/harmony/gesture_handler/src/main/ets/{GestureHandlerOrchestrator.ts → core/GestureHandlerOrchestrator.ts} +122 -67
- package/harmony/gesture_handler/src/main/ets/{GestureHandlerRegistry.ts → core/GestureHandlerRegistry.ts} +7 -0
- package/harmony/gesture_handler/src/main/ets/{Event.ts → core/IncomingEvent.ts} +30 -20
- package/harmony/gesture_handler/src/main/ets/core/InteractionManager.ts +144 -0
- package/harmony/gesture_handler/src/main/ets/{OutgoingEvent.ts → core/OutgoingEvent.ts} +1 -1
- package/harmony/gesture_handler/src/main/ets/core/OutgoingEventDispatcher.ts +12 -0
- package/harmony/gesture_handler/src/main/ets/{PointerTracker.ts → core/PointerTracker.ts} +4 -4
- package/harmony/gesture_handler/src/main/ets/core/RNGHLogger.ts +12 -0
- package/harmony/gesture_handler/src/main/ets/core/Vector2D.ts +80 -0
- package/harmony/gesture_handler/src/main/ets/{VelocityTracker.ts → core/VelocityTracker.ts} +13 -5
- package/harmony/gesture_handler/src/main/ets/core/View.ts +19 -0
- package/harmony/gesture_handler/src/main/ets/core/index.ts +13 -0
- package/harmony/gesture_handler/src/main/ets/detectors/ScaleGestureDetector.ts +169 -0
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/FlingGestureHandler.ts +211 -0
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/GestureHandlerFactory.ts +64 -0
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/LongPressGestureHandler.ts +127 -0
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/ManualGestureHandler.ts +42 -0
- package/harmony/gesture_handler/src/main/ets/{NativeViewGestureHandler.ts → gesture-handlers/NativeViewGestureHandler.ts} +10 -12
- package/harmony/gesture_handler/src/main/ets/{PanGestureHandler.ts → gesture-handlers/PanGestureHandler.ts} +27 -13
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/PinchGestureHandler.ts +159 -0
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/RotationGestureHandler.ts +164 -0
- package/harmony/gesture_handler/src/main/ets/{TapGestureHandler.ts → gesture-handlers/TapGestureHandler.ts} +11 -11
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/detectors/RotationGestureDetector.ts +167 -0
- package/harmony/gesture_handler/src/main/ets/gesture-handlers/index.ts +1 -0
- package/harmony/gesture_handler/src/main/ets/namespace/RNGestureHandlerModule.ts +8 -9
- package/harmony/gesture_handler/src/main/ets/namespace/{RNGestureHandlerButton.ts → components/RNGestureHandlerButton.ts} +35 -36
- package/harmony/gesture_handler/src/main/ets/namespace/{RNGestureHandlerRootView.ts → components/RNGestureHandlerRootView.ts} +23 -23
- package/harmony/gesture_handler/src/main/ets/namespace/components/ts.ts +2 -0
- package/harmony/gesture_handler/src/main/ets/namespace/ts.ts +2 -3
- package/harmony/gesture_handler/src/main/ets/rnoh/GestureHandlerArkUIAdapter.ts +240 -0
- package/harmony/gesture_handler/src/main/ets/{GestureHandlerPackage.ts → rnoh/GestureHandlerPackage.ts} +4 -4
- package/harmony/gesture_handler/src/main/ets/rnoh/Logger.ts +49 -0
- package/harmony/gesture_handler/src/main/ets/rnoh/OutgoingEventDispatchers.ts +71 -0
- package/harmony/gesture_handler/src/main/ets/rnoh/RNGHRootTouchHandlerArkTS.ts +104 -0
- package/harmony/gesture_handler/src/main/ets/rnoh/RNGHRootTouchHandlerCAPI.ts +110 -0
- package/harmony/gesture_handler/src/main/ets/{RNGestureHandlerButton.ets → rnoh/RNGestureHandlerButton.ets} +3 -3
- package/harmony/gesture_handler/src/main/ets/{RNGestureHandlerModule.ts → rnoh/RNGestureHandlerModule.ts} +74 -27
- package/harmony/gesture_handler/src/main/ets/{RNGestureHandlerRootView.ets → rnoh/RNGestureHandlerRootView.ets} +3 -3
- package/harmony/gesture_handler/src/main/ets/rnoh/RNOHGestureResponder.ts +24 -0
- package/harmony/gesture_handler/src/main/ets/rnoh/RNOHScrollLocker.ts +32 -0
- package/harmony/gesture_handler/src/main/ets/rnoh/View.ts +119 -0
- package/harmony/gesture_handler/src/main/ets/rnoh/ViewRegistry.ts +95 -0
- package/harmony/gesture_handler/src/main/module.json5 +8 -6
- package/harmony/gesture_handler/ts.ts +2 -2
- package/harmony/gesture_handler.har +0 -0
- package/lib/commonjs/index.js +98 -138
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +9 -142
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +35 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +13 -10
- package/src/index.ts +136 -136
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerPackage.h +0 -72
- package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentInstance.h +0 -78
- package/harmony/gesture_handler/src/main/ets/EventDispatcher.ts +0 -53
- 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/InteractionManager.ts +0 -109
- 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/RNOHScrollLocker.ts +0 -23
- package/harmony/gesture_handler/src/main/ets/Vector2D.ts +0 -36
- 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/pages/Index.ets +0 -17
- package/harmony/gesture_handler/src/main/ets/webviewability/WebviewAbility.ts +0 -41
- /package/harmony/gesture_handler/src/main/ets/{CircularBuffer.ts → core/CircularBuffer.ts} +0 -0
- /package/harmony/gesture_handler/src/main/ets/{LeastSquareSolver.ts → core/LeastSquareSolver.ts} +0 -0
- /package/harmony/gesture_handler/src/main/ets/{RNGHError.ts → core/RNGHError.ts} +0 -0
- /package/harmony/gesture_handler/src/main/ets/{State.ts → core/State.ts} +0 -0
- /package/harmony/gesture_handler/src/main/ets/{types.ts → rnoh/types.ts} +0 -0
|
@@ -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,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
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { RNOHContext } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
|
|
3
|
-
export interface RNGHLogger {
|
|
4
|
-
info(msg: string): void
|
|
5
|
-
|
|
6
|
-
cloneWithPrefix(prefix: string): RNGHLogger
|
|
7
|
-
|
|
8
|
-
debug(msg: string)
|
|
9
|
-
|
|
10
|
-
error(msg: string)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class StandardRNGHLogger implements RNGHLogger {
|
|
14
|
-
constructor(private rnohLogger: RNOHContext["logger"], private prefix: string) {
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
error(msg: string) {
|
|
18
|
-
this.rnohLogger.error(`${this.prefix}::${msg}`)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
info(msg: string) {
|
|
22
|
-
this.rnohLogger.info(`${this.prefix}::${msg}`)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
debug(msg: string) {
|
|
26
|
-
this.rnohLogger.debug(`${this.prefix}::${msg}`)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
cloneWithPrefix(prefix: string) {
|
|
30
|
-
return new StandardRNGHLogger(this.rnohLogger, `${this.prefix}::${prefix}`)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class FakeRNGHLogger implements RNGHLogger {
|
|
35
|
-
info(msg: string) {
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
debug(msg: string) {
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
error(msg: string): void {
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
cloneWithPrefix(prefix: string) {
|
|
46
|
-
return new FakeRNGHLogger()
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { Tag } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
import { GestureHandlerRegistry } from "./GestureHandlerRegistry"
|
|
3
|
-
import { GestureHandlerArkUIAdapter } from "./GestureHandlerArkUIAdapter"
|
|
4
|
-
import { ViewRegistry } from "./ViewRegistry"
|
|
5
|
-
import { RNGHLogger } from './RNGHLogger'
|
|
6
|
-
import { TouchEvent, TouchType } from "./types"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export class RNGHRootTouchHandlerArkTS {
|
|
10
|
-
private adapterByViewTag: Map<number, GestureHandlerArkUIAdapter> = new Map() // TODO: remove an adapter when a view or gesture handler is removed
|
|
11
|
-
private activeViewTags: number[] = []
|
|
12
|
-
private viewRegistry: ViewRegistry
|
|
13
|
-
private gestureHandlerRegistry: GestureHandlerRegistry
|
|
14
|
-
private logger: RNGHLogger
|
|
15
|
-
private rootTag: Tag
|
|
16
|
-
|
|
17
|
-
constructor(rootTag: Tag, viewRegistry: ViewRegistry, gestureHandlerRegistry: GestureHandlerRegistry, logger: RNGHLogger) {
|
|
18
|
-
this.rootTag = rootTag
|
|
19
|
-
this.viewRegistry = viewRegistry
|
|
20
|
-
this.gestureHandlerRegistry = gestureHandlerRegistry
|
|
21
|
-
this.logger = logger
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public handleTouch(touchEvent: any) {
|
|
25
|
-
const e = touchEvent as TouchEvent
|
|
26
|
-
if (e.type === TouchType.Down) {
|
|
27
|
-
this.activeViewTags = []
|
|
28
|
-
}
|
|
29
|
-
for (const changedTouch of e.changedTouches) {
|
|
30
|
-
const views = this.viewRegistry.getTouchableViewsAt({
|
|
31
|
-
x: changedTouch.windowX,
|
|
32
|
-
y: changedTouch.windowY
|
|
33
|
-
}, this.rootTag)
|
|
34
|
-
for (const view of views) {
|
|
35
|
-
for (const handler of this.gestureHandlerRegistry.getGestureHandlersByViewTag(view.getTag())) {
|
|
36
|
-
this.logger.info(`Found GestureHandler ${handler.getTag()} for view ${view.getTag()}`)
|
|
37
|
-
if (!this.adapterByViewTag.has(view.getTag()))
|
|
38
|
-
this.adapterByViewTag.set(view.getTag(), new GestureHandlerArkUIAdapter(handler, view, this.logger.cloneWithPrefix("ArkUIAdapter")))
|
|
39
|
-
if (!this.activeViewTags.includes(view.getTag())) {
|
|
40
|
-
const adapter = this.adapterByViewTag.get(view.getTag())
|
|
41
|
-
if (adapter) {
|
|
42
|
-
adapter.handleTouch(e)
|
|
43
|
-
} else {
|
|
44
|
-
console.warn("RNGH: Couldn't find adapter")
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
if (e.type === TouchType.Down) {
|
|
48
|
-
this.activeViewTags.push(view.getTag())
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
for (const viewTag of this.activeViewTags) {
|
|
53
|
-
const adapter = this.adapterByViewTag.get(viewTag)
|
|
54
|
-
if (adapter) {
|
|
55
|
-
adapter.handleTouch(e)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { RNGHRootTouchHandlerArkTS } from "./RNGHRootTouchHandlerArkTS"
|
|
2
|
-
import { TouchEvent as TouchEventArkTS, TouchType, TouchObject } from "./types"
|
|
3
|
-
import { RNGHLogger } from "./RNGHLogger"
|
|
4
|
-
|
|
5
|
-
type RawTouchPoint = {
|
|
6
|
-
contactAreaHeight: number
|
|
7
|
-
contactAreaWidth: number
|
|
8
|
-
id: number
|
|
9
|
-
nodeX: number
|
|
10
|
-
nodeY: number
|
|
11
|
-
pressedTime: number
|
|
12
|
-
pressure: number
|
|
13
|
-
rawX: number
|
|
14
|
-
rawY: number
|
|
15
|
-
screenX: number
|
|
16
|
-
screenY: number
|
|
17
|
-
tiltX: number
|
|
18
|
-
tiltY: number
|
|
19
|
-
toolHeight: number
|
|
20
|
-
toolType: number
|
|
21
|
-
toolWidth: number
|
|
22
|
-
toolX: number
|
|
23
|
-
toolY: number
|
|
24
|
-
windowX: number
|
|
25
|
-
windowY: number
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type RawTouchEvent = {
|
|
29
|
-
action: number,
|
|
30
|
-
actionTouch: RawTouchPoint,
|
|
31
|
-
touchPoints: RawTouchPoint[],
|
|
32
|
-
sourceType: number,
|
|
33
|
-
timestamp: number
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
class TouchEvent {
|
|
37
|
-
constructor(private raw: RawTouchEvent) {
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
asTouchEventArkTS(): TouchEventArkTS {
|
|
41
|
-
const touchType = this.touchTypeFromAction(this.raw.action)
|
|
42
|
-
return {
|
|
43
|
-
type: this.touchTypeFromAction(this.raw.action),
|
|
44
|
-
touches: this.raw.touchPoints.map(tp => this.touchObjectFromTouchPoint(tp, touchType)),
|
|
45
|
-
changedTouches: [this.touchObjectFromTouchPoint(this.raw.actionTouch, touchType)],
|
|
46
|
-
timestamp: this.raw.timestamp
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
private touchTypeFromAction(action: number): TouchType {
|
|
51
|
-
switch (action) {
|
|
52
|
-
case 1:
|
|
53
|
-
return TouchType.Down
|
|
54
|
-
case 2:
|
|
55
|
-
return TouchType.Move
|
|
56
|
-
case 3:
|
|
57
|
-
return TouchType.Up
|
|
58
|
-
default:
|
|
59
|
-
return TouchType.Cancel
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private touchObjectFromTouchPoint(touchPoint: RawTouchPoint, touchType: TouchType): TouchObject {
|
|
64
|
-
return {
|
|
65
|
-
id: touchPoint.id,
|
|
66
|
-
windowX: touchPoint.windowX,
|
|
67
|
-
windowY: touchPoint.windowY,
|
|
68
|
-
x: touchPoint.windowX,
|
|
69
|
-
y: touchPoint.windowY,
|
|
70
|
-
type: touchType
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export class RNGHRootTouchHandlerCAPI {
|
|
76
|
-
private logger: RNGHLogger
|
|
77
|
-
|
|
78
|
-
constructor(logger: RNGHLogger, private touchHandlerArkTS: RNGHRootTouchHandlerArkTS) {
|
|
79
|
-
this.logger = logger.cloneWithPrefix("RNGHRootTouchHandlerCAPI")
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
handleTouch(rawTouchEvent: RawTouchEvent) {
|
|
83
|
-
this.logger.cloneWithPrefix("handleTouch").debug(JSON.stringify(rawTouchEvent))
|
|
84
|
-
this.touchHandlerArkTS.handleTouch(new TouchEvent(rawTouchEvent).asTouchEventArkTS())
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { RNInstance } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
import { ScrollLocker } from "./GestureHandler"
|
|
3
|
-
|
|
4
|
-
export class RNOHScrollLockerArkTS implements ScrollLocker {
|
|
5
|
-
constructor(private rnInstance: RNInstance) {
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
lockScrollContainingViewTag(viewTag: number) {
|
|
9
|
-
return this.rnInstance.blockComponentsGestures(viewTag)
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class RNOHScrollLockerCAPI implements ScrollLocker {
|
|
14
|
-
constructor(private rnInstance: RNInstance) {
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
lockScrollContainingViewTag(viewTag: number) {
|
|
18
|
-
this.rnInstance.postMessageToCpp("RNGH::SET_NATIVE_RESPONDERS_BLOCK", { targetTag: viewTag, shouldBlock: true });
|
|
19
|
-
return () => {
|
|
20
|
-
this.rnInstance.postMessageToCpp("RNGH::SET_NATIVE_RESPONDERS_BLOCK", { targetTag: viewTag, shouldBlock: false });
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export class Vector2D {
|
|
2
|
-
constructor(
|
|
3
|
-
private val: {
|
|
4
|
-
x: number;
|
|
5
|
-
y: number;
|
|
6
|
-
} = {x: 0, y: 0},
|
|
7
|
-
) {}
|
|
8
|
-
|
|
9
|
-
get x() {
|
|
10
|
-
return this.val.x;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
get y() {
|
|
14
|
-
return this.val.y;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get value() {
|
|
18
|
-
return {...this.val};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public clone() {
|
|
22
|
-
return new Vector2D({...this.val});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public subtract(vec: Vector2D) {
|
|
26
|
-
this.val.x -= vec.x;
|
|
27
|
-
this.val.y -= vec.y;
|
|
28
|
-
return this;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public add(vec: Vector2D) {
|
|
32
|
-
this.val.x += vec.x;
|
|
33
|
-
this.val.y += vec.y;
|
|
34
|
-
return this;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { DescriptorRegistry, Descriptor, Tag } from "@rnoh/react-native-openharmony/ts"
|
|
2
|
-
import { Vector2D } from "./Vector2D"
|
|
3
|
-
|
|
4
|
-
export type BoundingBox = {
|
|
5
|
-
x: number,
|
|
6
|
-
y: number,
|
|
7
|
-
width: number,
|
|
8
|
-
height: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class View {
|
|
12
|
-
constructor(private descriptorRegistry: DescriptorRegistry, private viewTag: number) {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public getChildren() {
|
|
16
|
-
return this.getDescriptor().childrenTags.map(childrenTag => {
|
|
17
|
-
return new View(this.descriptorRegistry, childrenTag)
|
|
18
|
-
})
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public getTag(): Tag {
|
|
22
|
-
return this.viewTag
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public isPositionInBounds({x, y}: {
|
|
26
|
-
x: number,
|
|
27
|
-
y: number
|
|
28
|
-
}): boolean {
|
|
29
|
-
const rect = this.getBoundingRect()
|
|
30
|
-
return x >= rect.x && x <= (rect.x + rect.width) && y >= rect.y && y <= (rect.y + rect.height);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public getBoundingRect(): BoundingBox {
|
|
34
|
-
const d = this.getDescriptor()
|
|
35
|
-
if (!d) {
|
|
36
|
-
return { x: 0, y: 0, width: 0, height: 0 }
|
|
37
|
-
}
|
|
38
|
-
const offsetToAbsolutePosition = this.getOffsetToAbsolutePosition()
|
|
39
|
-
return {
|
|
40
|
-
x: d.layoutMetrics.frame.origin.x - offsetToAbsolutePosition.x,
|
|
41
|
-
y: d.layoutMetrics.frame.origin.y - offsetToAbsolutePosition.y,
|
|
42
|
-
width: d.layoutMetrics.frame.size.width,
|
|
43
|
-
height: d.layoutMetrics.frame.size.height
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
private getDescriptor() {
|
|
48
|
-
return this.descriptorRegistry.getDescriptor(this.viewTag)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
private getOffsetToAbsolutePosition(): Vector2D {
|
|
53
|
-
const currentOffset = new Vector2D()
|
|
54
|
-
let parentTag = this.getDescriptor()?.parentTag
|
|
55
|
-
while (parentTag !== undefined) {
|
|
56
|
-
const d = this.descriptorRegistry.getDescriptor(parentTag)
|
|
57
|
-
currentOffset.add(this.extractScrollOffsetFromDescriptor(d))
|
|
58
|
-
currentOffset.subtract(new Vector2D(d.layoutMetrics.frame.origin))
|
|
59
|
-
parentTag = d.parentTag
|
|
60
|
-
}
|
|
61
|
-
return currentOffset
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
private extractScrollOffsetFromDescriptor(descriptor: Descriptor<any>) {
|
|
65
|
-
if (descriptor.type !== "ScrollView") {
|
|
66
|
-
return new Vector2D();
|
|
67
|
-
}
|
|
68
|
-
const scrollViewState: any = descriptor.state;
|
|
69
|
-
return new Vector2D({ x: scrollViewState.contentOffsetX, y: scrollViewState.contentOffsetY })
|
|
70
|
-
}
|
|
71
|
-
}
|