@react-native-oh-tpl/react-native-gesture-handler 2.12.9 → 2.14.1-2.14.9
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/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
|
-
}
|