react-native-gesture-handler 2.7.0 → 2.8.0
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/android/build.gradle +10 -5
- package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +3 -3
- package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +7 -7
- package/android/src/fabric/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +3 -3
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/FlingGestureHandler.kt +12 -9
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandler.kt +39 -31
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandlerInteractionController.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandlerOrchestrator.kt +28 -19
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandlerRegistry.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureUtils.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/LongPressGestureHandler.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/ManualGestureHandler.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/NativeViewGestureHandler.kt +5 -5
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/OnTouchEventListener.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/PanGestureHandler.kt +7 -5
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/PinchGestureHandler.kt +11 -4
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/PointerEventsConfig.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/RotationGestureDetector.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/RotationGestureHandler.kt +7 -2
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/ScaleGestureDetector.java +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/TapGestureHandler.kt +3 -3
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/ViewConfigurationHelper.kt +1 -1
- package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/react}/Extensions.kt +3 -3
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +7 -6
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +1 -5
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +6 -6
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +3 -3
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +35 -14
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +8 -6
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +0 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +4 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +7 -7
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +5 -5
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +2 -2
- package/android/src/paper/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +5 -5
- package/ios/Handlers/RNManualHandler.m +24 -8
- package/ios/RNGestureHandlerButtonComponentView.mm +7 -8
- package/ios/RNGestureHandlerManager.mm +176 -178
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.windows.js +156 -0
- package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -0
- package/lib/commonjs/components/DrawerLayout.js +1 -0
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/commonjs/getShadowNodeFromRef.js +2 -2
- package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js +5 -2
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerTypesCompat.js +4 -0
- package/lib/commonjs/handlers/gestures/GestureDetector.js +26 -12
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureComposition.js +15 -4
- package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -1
- package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
- package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +18 -15
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +36 -7
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +2 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/ManualGestureHandler.js +15 -0
- package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +0 -5
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +0 -5
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PinchGestureHandler.js +0 -1
- package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/RotationGestureHandler.js +0 -1
- package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -1
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
- package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -1
- package/lib/commonjs/web_hammer/NodeManager.js +4 -1
- package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
- package/lib/commonjs/web_hammer/PanGestureHandler.js +25 -6
- package/lib/commonjs/web_hammer/PanGestureHandler.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.windows.js +117 -0
- package/lib/module/RNGestureHandlerModule.windows.js.map +1 -0
- package/lib/module/components/DrawerLayout.js +1 -0
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
- package/lib/module/getShadowNodeFromRef.js +2 -2
- package/lib/module/getShadowNodeFromRef.js.map +1 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js +5 -2
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestureHandlerTypesCompat.js +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +26 -12
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/gestureComposition.js +15 -4
- package/lib/module/handlers/gestures/gestureComposition.js.map +1 -1
- package/lib/module/jestUtils/jestUtils.js.map +1 -1
- package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
- package/lib/module/web/handlers/FlingGestureHandler.js +18 -15
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +36 -6
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js +2 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/ManualGestureHandler.js +15 -0
- package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/NativeViewGestureHandler.js +0 -5
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +0 -5
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PinchGestureHandler.js +0 -1
- package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/RotationGestureHandler.js +0 -1
- package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/TapGestureHandler.js +0 -1
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/InteractionManager.js.map +1 -1
- package/lib/module/web_hammer/GestureHandler.js.map +1 -1
- package/lib/module/web_hammer/NodeManager.js +4 -1
- package/lib/module/web_hammer/NodeManager.js.map +1 -1
- package/lib/module/web_hammer/PanGestureHandler.js +25 -6
- package/lib/module/web_hammer/PanGestureHandler.js.map +1 -1
- package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
- package/lib/typescript/RNGestureHandlerModule.windows.d.ts +48 -0
- package/lib/typescript/components/DrawerLayout.d.ts +7 -0
- package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
- package/lib/typescript/handlers/PanGestureHandler.d.ts +1 -1
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +3 -1
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +3 -1
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +1 -0
- package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -0
- package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +3 -1
- package/lib/typescript/web/interfaces.d.ts +3 -1
- package/lib/typescript/web/tools/NodeManager.d.ts +2 -2
- package/package.json +14 -10
- package/src/RNGestureHandlerModule.macos.ts +2 -2
- package/src/RNGestureHandlerModule.web.ts +2 -2
- package/src/RNGestureHandlerModule.windows.ts +140 -0
- package/src/components/DrawerLayout.tsx +14 -8
- package/src/components/Swipeable.tsx +2 -4
- package/src/components/touchables/TouchableOpacity.tsx +1 -1
- package/src/getShadowNodeFromRef.ts +3 -3
- package/src/handlers/createHandler.tsx +13 -15
- package/src/handlers/gestureHandlerCommon.ts +9 -4
- package/src/handlers/gestureHandlerTypesCompat.ts +34 -17
- package/src/handlers/gestures/GestureDetector.tsx +46 -19
- package/src/handlers/gestures/eventReceiver.ts +2 -1
- package/src/handlers/gestures/gesture.ts +8 -12
- package/src/handlers/gestures/gestureComposition.ts +19 -6
- package/src/jestUtils/jestUtils.ts +3 -4
- package/src/web/detectors/RotationGestureDetector.ts +2 -1
- package/src/web/handlers/FlingGestureHandler.ts +28 -20
- package/src/web/handlers/GestureHandler.ts +42 -17
- package/src/web/handlers/LongPressGestureHandler.ts +2 -2
- package/src/web/handlers/ManualGestureHandler.ts +10 -1
- package/src/web/handlers/NativeViewGestureHandler.ts +0 -5
- package/src/web/handlers/PanGestureHandler.ts +0 -6
- package/src/web/handlers/PinchGestureHandler.ts +0 -2
- package/src/web/handlers/RotationGestureHandler.ts +2 -5
- package/src/web/handlers/TapGestureHandler.ts +0 -2
- package/src/web/interfaces.ts +3 -0
- package/src/web/tools/InteractionManager.ts +2 -3
- package/src/web_hammer/GestureHandler.ts +6 -8
- package/src/web_hammer/NodeManager.ts +3 -1
- package/src/web_hammer/PanGestureHandler.ts +12 -6
- package/android/lib/build.gradle +0 -28
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +0 -19
|
@@ -69,14 +69,24 @@ export class ComposedGesture extends Gesture {
|
|
|
69
69
|
|
|
70
70
|
export class SimultaneousGesture extends ComposedGesture {
|
|
71
71
|
prepare() {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
// this piece of magic works something like this:
|
|
73
|
+
// for every gesture in the array
|
|
74
|
+
const simultaneousArrays = this.gestures.map((gesture) =>
|
|
75
|
+
// we take the array it's in
|
|
76
|
+
this.gestures
|
|
77
|
+
// and make a copy without it
|
|
78
|
+
.filter((x) => x !== gesture)
|
|
79
|
+
// then we flatmap the result to get list of raw (not composed) gestures
|
|
80
|
+
// this way we don't make the gestures simultaneous with themselves, which is
|
|
81
|
+
// important when the gesture is `ExclusiveGesture` - we don't want to make
|
|
82
|
+
// exclusive gestures simultaneous
|
|
83
|
+
.flatMap((x) => x.toGestureArray())
|
|
84
|
+
);
|
|
75
85
|
|
|
76
|
-
for (
|
|
86
|
+
for (let i = 0; i < this.gestures.length; i++) {
|
|
77
87
|
this.prepareSingleGesture(
|
|
78
|
-
|
|
79
|
-
|
|
88
|
+
this.gestures[i],
|
|
89
|
+
simultaneousArrays[i],
|
|
80
90
|
this.requireGesturesToFail
|
|
81
91
|
);
|
|
82
92
|
}
|
|
@@ -85,6 +95,8 @@ export class SimultaneousGesture extends ComposedGesture {
|
|
|
85
95
|
|
|
86
96
|
export class ExclusiveGesture extends ComposedGesture {
|
|
87
97
|
prepare() {
|
|
98
|
+
// transforms the array of gestures into array of grouped raw (not composed) gestures
|
|
99
|
+
// i.e. [gesture1, gesture2, ComposedGesture(gesture3, gesture4)] -> [[gesture1], [gesture2], [gesture3, gesture4]]
|
|
88
100
|
const gestureArrays = this.gestures.map((gesture) =>
|
|
89
101
|
gesture.toGestureArray()
|
|
90
102
|
);
|
|
@@ -98,6 +110,7 @@ export class ExclusiveGesture extends ComposedGesture {
|
|
|
98
110
|
this.requireGesturesToFail.concat(requireToFail)
|
|
99
111
|
);
|
|
100
112
|
|
|
113
|
+
// every group gets to wait for all groups before it
|
|
101
114
|
requireToFail = requireToFail.concat(gestureArrays[i]);
|
|
102
115
|
}
|
|
103
116
|
}
|
|
@@ -464,9 +464,8 @@ export function fireGestureHandler<THandler extends AllGestures | AllHandlers>(
|
|
|
464
464
|
componentOrGesture: ReactTestInstance | GestureType,
|
|
465
465
|
eventList: Partial<GestureHandlerTestEvent<ExtractConfig<THandler>>>[] = []
|
|
466
466
|
): void {
|
|
467
|
-
const { emitEvent, handlerType, handlerTag } =
|
|
468
|
-
componentOrGesture
|
|
469
|
-
);
|
|
467
|
+
const { emitEvent, handlerType, handlerTag } =
|
|
468
|
+
getHandlerData(componentOrGesture);
|
|
470
469
|
|
|
471
470
|
let _ = fillMissingStatesTransitions(
|
|
472
471
|
eventList,
|
|
@@ -478,7 +477,7 @@ export function fireGestureHandler<THandler extends AllGestures | AllHandlers>(
|
|
|
478
477
|
// @ts-ignore TODO
|
|
479
478
|
_ = _.map(wrapWithNativeEvent);
|
|
480
479
|
|
|
481
|
-
const events =
|
|
480
|
+
const events = _ as unknown as WrappedGestureHandlerTestEvent[];
|
|
482
481
|
|
|
483
482
|
const firstEvent = events.shift()!;
|
|
484
483
|
|
|
@@ -8,7 +8,8 @@ export interface RotationGestureListener {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export default class RotationGestureDetector
|
|
11
|
-
implements RotationGestureListener
|
|
11
|
+
implements RotationGestureListener
|
|
12
|
+
{
|
|
12
13
|
onRotationBegin: (detector: RotationGestureDetector) => boolean;
|
|
13
14
|
onRotation: (detector: RotationGestureDetector) => boolean;
|
|
14
15
|
onRotationEnd: (detector: RotationGestureDetector) => void;
|
|
@@ -21,6 +21,7 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
21
21
|
private startY = 0;
|
|
22
22
|
|
|
23
23
|
private maxNumberOfPointersSimultaneously = 0;
|
|
24
|
+
private keyPointer = NaN;
|
|
24
25
|
|
|
25
26
|
public init(ref: number, propsRef: React.RefObject<unknown>): void {
|
|
26
27
|
super.init(ref, propsRef);
|
|
@@ -29,8 +30,6 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
29
30
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
30
31
|
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
31
32
|
|
|
32
|
-
this.enabled = enabled;
|
|
33
|
-
|
|
34
33
|
if (this.config.direction) {
|
|
35
34
|
this.direction = this.config.direction;
|
|
36
35
|
}
|
|
@@ -51,9 +50,9 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
51
50
|
};
|
|
52
51
|
}
|
|
53
52
|
|
|
54
|
-
private startFling(
|
|
55
|
-
this.startX =
|
|
56
|
-
this.startY =
|
|
53
|
+
private startFling(): void {
|
|
54
|
+
this.startX = this.tracker.getLastX(this.keyPointer);
|
|
55
|
+
this.startY = this.tracker.getLastY(this.keyPointer);
|
|
57
56
|
|
|
58
57
|
this.begin();
|
|
59
58
|
|
|
@@ -62,18 +61,22 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
62
61
|
this.delayTimeout = setTimeout(() => this.fail(), this.maxDurationMs);
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
private tryEndFling(
|
|
64
|
+
private tryEndFling(): boolean {
|
|
66
65
|
if (
|
|
67
66
|
this.maxNumberOfPointersSimultaneously ===
|
|
68
67
|
this.numberOfPointersRequired &&
|
|
69
68
|
((this.direction & Direction.RIGHT &&
|
|
70
|
-
|
|
69
|
+
this.tracker.getLastX(this.keyPointer) - this.startX >
|
|
70
|
+
this.minAcceptableDelta) ||
|
|
71
71
|
(this.direction & Direction.LEFT &&
|
|
72
|
-
this.startX -
|
|
72
|
+
this.startX - this.tracker.getLastX(this.keyPointer) >
|
|
73
|
+
this.minAcceptableDelta) ||
|
|
73
74
|
(this.direction & Direction.UP &&
|
|
74
|
-
this.startY -
|
|
75
|
+
this.startY - this.tracker.getLastY(this.keyPointer) >
|
|
76
|
+
this.minAcceptableDelta) ||
|
|
75
77
|
(this.direction & Direction.DOWN &&
|
|
76
|
-
|
|
78
|
+
this.tracker.getLastY(this.keyPointer) - this.startY >
|
|
79
|
+
this.minAcceptableDelta))
|
|
77
80
|
) {
|
|
78
81
|
clearTimeout(this.delayTimeout);
|
|
79
82
|
this.activate();
|
|
@@ -84,40 +87,43 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
84
87
|
return false;
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
private endFling(
|
|
88
|
-
if (!this.tryEndFling(
|
|
90
|
+
private endFling() {
|
|
91
|
+
if (!this.tryEndFling()) {
|
|
89
92
|
this.fail();
|
|
90
93
|
}
|
|
91
94
|
}
|
|
92
95
|
|
|
93
96
|
protected onPointerDown(event: AdaptedEvent): void {
|
|
94
97
|
this.tracker.addToTracker(event);
|
|
98
|
+
this.keyPointer = event.pointerId;
|
|
99
|
+
|
|
95
100
|
super.onPointerDown(event);
|
|
96
|
-
this.newPointerAction(
|
|
101
|
+
this.newPointerAction();
|
|
97
102
|
}
|
|
98
103
|
|
|
99
104
|
protected onPointerAdd(event: AdaptedEvent): void {
|
|
100
105
|
this.tracker.addToTracker(event);
|
|
101
106
|
super.onPointerAdd(event);
|
|
102
|
-
this.newPointerAction(
|
|
107
|
+
this.newPointerAction();
|
|
103
108
|
}
|
|
104
109
|
|
|
105
|
-
private newPointerAction(
|
|
110
|
+
private newPointerAction(): void {
|
|
106
111
|
if (this.currentState === State.UNDETERMINED) {
|
|
107
|
-
this.startFling(
|
|
112
|
+
this.startFling();
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
if (this.currentState !== State.BEGAN) {
|
|
111
116
|
return;
|
|
112
117
|
}
|
|
113
118
|
|
|
114
|
-
this.tryEndFling(
|
|
119
|
+
this.tryEndFling();
|
|
115
120
|
|
|
116
121
|
if (
|
|
117
122
|
this.tracker.getTrackedPointersCount() >
|
|
118
123
|
this.maxNumberOfPointersSimultaneously
|
|
119
124
|
) {
|
|
120
|
-
this.maxNumberOfPointersSimultaneously =
|
|
125
|
+
this.maxNumberOfPointersSimultaneously =
|
|
126
|
+
this.tracker.getTrackedPointersCount();
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
|
|
@@ -128,7 +134,7 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
128
134
|
return;
|
|
129
135
|
}
|
|
130
136
|
|
|
131
|
-
this.tryEndFling(
|
|
137
|
+
this.tryEndFling();
|
|
132
138
|
|
|
133
139
|
super.onPointerMove(event);
|
|
134
140
|
}
|
|
@@ -136,6 +142,8 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
136
142
|
protected onPointerUp(event: AdaptedEvent): void {
|
|
137
143
|
super.onPointerUp(event);
|
|
138
144
|
this.onUp(event);
|
|
145
|
+
|
|
146
|
+
this.keyPointer = NaN;
|
|
139
147
|
}
|
|
140
148
|
|
|
141
149
|
protected onPointerRemove(event: AdaptedEvent): void {
|
|
@@ -148,7 +156,7 @@ export default class FlingGestureHandler extends GestureHandler {
|
|
|
148
156
|
if (this.currentState !== State.BEGAN) {
|
|
149
157
|
return;
|
|
150
158
|
}
|
|
151
|
-
this.endFling(
|
|
159
|
+
this.endFling();
|
|
152
160
|
}
|
|
153
161
|
|
|
154
162
|
protected onPointerCancel(event: AdaptedEvent): void {
|
|
@@ -70,13 +70,18 @@ export default abstract class GestureHandler {
|
|
|
70
70
|
);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
this.view =
|
|
73
|
+
this.view = findNodeHandle(this.ref) as unknown as HTMLElement;
|
|
74
74
|
this.view.style['touchAction'] = 'none';
|
|
75
|
-
this.view.style['webkitUserSelect'] = 'none';
|
|
76
|
-
this.view.style['userSelect'] = 'none';
|
|
77
|
-
|
|
78
75
|
//@ts-ignore This one disables default events on Safari
|
|
79
76
|
this.view.style['WebkitTouchCallout'] = 'none';
|
|
77
|
+
|
|
78
|
+
if (!this.config.userSelect) {
|
|
79
|
+
this.view.style['webkitUserSelect'] = 'none';
|
|
80
|
+
this.view.style['userSelect'] = 'none';
|
|
81
|
+
} else {
|
|
82
|
+
this.view.style['webkitUserSelect'] = this.config.userSelect;
|
|
83
|
+
this.view.style['userSelect'] = this.config.userSelect;
|
|
84
|
+
}
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
private addEventManager(manager: EventManager): void {
|
|
@@ -121,19 +126,17 @@ export default abstract class GestureHandler {
|
|
|
121
126
|
return;
|
|
122
127
|
}
|
|
123
128
|
|
|
129
|
+
const oldState = this.currentState;
|
|
130
|
+
this.currentState = newState;
|
|
131
|
+
|
|
124
132
|
if (
|
|
125
133
|
this.tracker.getTrackedPointersCount() > 0 &&
|
|
126
134
|
this.config.needsPointerData &&
|
|
127
|
-
(
|
|
128
|
-
newState === State.CANCELLED ||
|
|
129
|
-
newState === State.FAILED)
|
|
135
|
+
this.isFinished()
|
|
130
136
|
) {
|
|
131
137
|
this.cancelTouches();
|
|
132
138
|
}
|
|
133
139
|
|
|
134
|
-
const oldState = this.currentState;
|
|
135
|
-
this.currentState = newState;
|
|
136
|
-
|
|
137
140
|
GestureHandlerOrchestrator.getInstance().onHandlerStateChange(
|
|
138
141
|
this,
|
|
139
142
|
newState,
|
|
@@ -324,6 +327,18 @@ export default abstract class GestureHandler {
|
|
|
324
327
|
}
|
|
325
328
|
}
|
|
326
329
|
protected onPointerOut(event: AdaptedEvent): void {
|
|
330
|
+
if (this.shouldCancellWhenOutside) {
|
|
331
|
+
switch (this.currentState) {
|
|
332
|
+
case State.ACTIVE:
|
|
333
|
+
this.cancel();
|
|
334
|
+
break;
|
|
335
|
+
case State.BEGAN:
|
|
336
|
+
this.fail();
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
327
342
|
if (this.config.needsPointerData) {
|
|
328
343
|
this.sendTouchEvent(event);
|
|
329
344
|
}
|
|
@@ -362,9 +377,8 @@ export default abstract class GestureHandler {
|
|
|
362
377
|
const { onGestureHandlerEvent }: PropsRef = this.propsRef
|
|
363
378
|
.current as PropsRef;
|
|
364
379
|
|
|
365
|
-
const touchEvent: ResultTouchEvent | undefined =
|
|
366
|
-
event
|
|
367
|
-
);
|
|
380
|
+
const touchEvent: ResultTouchEvent | undefined =
|
|
381
|
+
this.transformTouchEvent(event);
|
|
368
382
|
|
|
369
383
|
if (touchEvent) {
|
|
370
384
|
invokeNullableMethod(onGestureHandlerEvent, touchEvent);
|
|
@@ -376,10 +390,8 @@ export default abstract class GestureHandler {
|
|
|
376
390
|
//
|
|
377
391
|
|
|
378
392
|
public sendEvent = (newState: State, oldState: State): void => {
|
|
379
|
-
const {
|
|
380
|
-
|
|
381
|
-
onGestureHandlerStateChange,
|
|
382
|
-
}: PropsRef = this.propsRef.current as PropsRef;
|
|
393
|
+
const { onGestureHandlerEvent, onGestureHandlerStateChange }: PropsRef =
|
|
394
|
+
this.propsRef.current as PropsRef;
|
|
383
395
|
|
|
384
396
|
const resultEvent: ResultEvent = this.transformEventData(
|
|
385
397
|
newState,
|
|
@@ -578,6 +590,11 @@ export default abstract class GestureHandler {
|
|
|
578
590
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
579
591
|
this.config = { enabled: enabled, ...props };
|
|
580
592
|
this.enabled = enabled;
|
|
593
|
+
|
|
594
|
+
if (this.config.shouldCancelWhenOutside !== undefined) {
|
|
595
|
+
this.setShouldCancelWhenOutside(this.config.shouldCancelWhenOutside);
|
|
596
|
+
}
|
|
597
|
+
|
|
581
598
|
this.validateHitSlops();
|
|
582
599
|
|
|
583
600
|
if (this.enabled) {
|
|
@@ -775,6 +792,14 @@ export default abstract class GestureHandler {
|
|
|
775
792
|
return this.enabled;
|
|
776
793
|
}
|
|
777
794
|
|
|
795
|
+
private isFinished(): boolean {
|
|
796
|
+
return (
|
|
797
|
+
this.currentState === State.END ||
|
|
798
|
+
this.currentState === State.FAILED ||
|
|
799
|
+
this.currentState === State.CANCELLED
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
|
|
778
803
|
protected setShouldCancelWhenOutside(shouldCancel: boolean) {
|
|
779
804
|
this.shouldCancellWhenOutside = shouldCancel;
|
|
780
805
|
}
|
|
@@ -23,6 +23,8 @@ export default class LongPressGestureHandler extends GestureHandler {
|
|
|
23
23
|
public init(ref: number, propsRef: React.RefObject<unknown>) {
|
|
24
24
|
super.init(ref, propsRef);
|
|
25
25
|
this.setShouldCancelWhenOutside(true);
|
|
26
|
+
|
|
27
|
+
this.view.oncontextmenu = () => false;
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
protected transformNativeEvent() {
|
|
@@ -40,8 +42,6 @@ export default class LongPressGestureHandler extends GestureHandler {
|
|
|
40
42
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
41
43
|
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
42
44
|
|
|
43
|
-
this.enabled = enabled;
|
|
44
|
-
|
|
45
45
|
if (this.config.minDurationMs !== undefined) {
|
|
46
46
|
this.minDurationMs = this.config.minDurationMs;
|
|
47
47
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AdaptedEvent } from '../interfaces';
|
|
1
|
+
import { AdaptedEvent, Config } from '../interfaces';
|
|
2
2
|
import GestureHandler from './GestureHandler';
|
|
3
3
|
|
|
4
4
|
export default class ManualGestureHandler extends GestureHandler {
|
|
@@ -6,6 +6,10 @@ export default class ManualGestureHandler extends GestureHandler {
|
|
|
6
6
|
super.init(ref, propsRef);
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
10
|
+
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
11
|
+
}
|
|
12
|
+
|
|
9
13
|
protected onPointerDown(event: AdaptedEvent): void {
|
|
10
14
|
this.tracker.addToTracker(event);
|
|
11
15
|
super.onPointerDown(event);
|
|
@@ -22,6 +26,11 @@ export default class ManualGestureHandler extends GestureHandler {
|
|
|
22
26
|
super.onPointerMove(event);
|
|
23
27
|
}
|
|
24
28
|
|
|
29
|
+
protected onPointerOutOfBounds(event: AdaptedEvent): void {
|
|
30
|
+
this.tracker.track(event);
|
|
31
|
+
super.onPointerOutOfBounds(event);
|
|
32
|
+
}
|
|
33
|
+
|
|
25
34
|
protected onPointerUp(event: AdaptedEvent): void {
|
|
26
35
|
super.onPointerUp(event);
|
|
27
36
|
this.tracker.removeFromTracker(event.pointerId);
|
|
@@ -30,11 +30,6 @@ export default class NativeViewGestureHandler extends GestureHandler {
|
|
|
30
30
|
} else {
|
|
31
31
|
this.buttonRole = false;
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
if (this.view.tagName.toLowerCase() === 'input') {
|
|
35
|
-
//Enables text input on Safari
|
|
36
|
-
this.view.style['webkitUserSelect'] = 'auto';
|
|
37
|
-
}
|
|
38
33
|
}
|
|
39
34
|
|
|
40
35
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
@@ -65,8 +65,6 @@ export default class PanGestureHandler extends GestureHandler {
|
|
|
65
65
|
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
66
66
|
this.checkCustomActivationCriteria(this.customActivationProperties);
|
|
67
67
|
|
|
68
|
-
this.enabled = enabled;
|
|
69
|
-
|
|
70
68
|
if (this.config.minDist !== undefined) {
|
|
71
69
|
this.minDistSq = this.config.minDist * this.config.minDist;
|
|
72
70
|
} else if (this.hasCustomActivationCriteria) {
|
|
@@ -98,10 +96,6 @@ export default class PanGestureHandler extends GestureHandler {
|
|
|
98
96
|
this.activateAfterLongPress = this.config.activateAfterLongPress;
|
|
99
97
|
}
|
|
100
98
|
|
|
101
|
-
if (this.config.shouldCancelWhenOutside) {
|
|
102
|
-
this.setShouldCancelWhenOutside(false);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
99
|
if (this.config.activeOffsetXStart !== undefined) {
|
|
106
100
|
this.activeOffsetXStart = this.config.activeOffsetXStart;
|
|
107
101
|
|
|
@@ -57,8 +57,6 @@ export default class PinchGestureHandler extends GestureHandler {
|
|
|
57
57
|
|
|
58
58
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
59
59
|
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
60
|
-
|
|
61
|
-
this.enabled = enabled;
|
|
62
60
|
}
|
|
63
61
|
|
|
64
62
|
protected transformNativeEvent() {
|
|
@@ -41,9 +41,8 @@ export default class RotationGestureHandler extends GestureHandler {
|
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
private rotationGestureDetector: RotationGestureDetector =
|
|
45
|
-
this.rotationGestureListener
|
|
46
|
-
);
|
|
44
|
+
private rotationGestureDetector: RotationGestureDetector =
|
|
45
|
+
new RotationGestureDetector(this.rotationGestureListener);
|
|
47
46
|
|
|
48
47
|
public init(ref: number, propsRef: React.RefObject<unknown>): void {
|
|
49
48
|
super.init(ref, propsRef);
|
|
@@ -53,8 +52,6 @@ export default class RotationGestureHandler extends GestureHandler {
|
|
|
53
52
|
|
|
54
53
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
55
54
|
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
56
|
-
|
|
57
|
-
this.enabled = enabled;
|
|
58
55
|
}
|
|
59
56
|
|
|
60
57
|
protected transformNativeEvent() {
|
|
@@ -39,8 +39,6 @@ export default class TapGestureHandler extends GestureHandler {
|
|
|
39
39
|
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
40
40
|
super.updateGestureConfig({ enabled: enabled, ...props });
|
|
41
41
|
|
|
42
|
-
this.enabled = enabled;
|
|
43
|
-
|
|
44
42
|
if (this.config.numberOfTaps !== undefined) {
|
|
45
43
|
this.numberOfTaps = this.config.numberOfTaps;
|
|
46
44
|
}
|
package/src/web/interfaces.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UserSelect } from '../handlers/gestureHandlerCommon';
|
|
1
2
|
import { Directions } from '../Directions';
|
|
2
3
|
import { State } from '../State';
|
|
3
4
|
|
|
@@ -20,6 +21,7 @@ type ConfigArgs =
|
|
|
20
21
|
| number
|
|
21
22
|
| boolean
|
|
22
23
|
| HitSlop
|
|
24
|
+
| UserSelect
|
|
23
25
|
| Directions
|
|
24
26
|
| Handler[]
|
|
25
27
|
| null
|
|
@@ -31,6 +33,7 @@ export interface Config extends Record<string, ConfigArgs> {
|
|
|
31
33
|
waitFor?: Handler[] | null;
|
|
32
34
|
hitSlop?: HitSlop;
|
|
33
35
|
shouldCancelWhenOutside?: boolean;
|
|
36
|
+
userSelect?: UserSelect;
|
|
34
37
|
|
|
35
38
|
activateAfterLongPress?: number;
|
|
36
39
|
failOffsetXStart?: number;
|
|
@@ -69,9 +69,8 @@ export default class InteractionManager {
|
|
|
69
69
|
handler: GestureHandler,
|
|
70
70
|
otherHandler: GestureHandler
|
|
71
71
|
): boolean {
|
|
72
|
-
const simultaneousHandlers:
|
|
73
|
-
|
|
74
|
-
| undefined = this.simultaneousRelations.get(handler.getTag());
|
|
72
|
+
const simultaneousHandlers: number[] | undefined =
|
|
73
|
+
this.simultaneousRelations.get(handler.getTag());
|
|
75
74
|
if (!simultaneousHandlers) {
|
|
76
75
|
return false;
|
|
77
76
|
}
|
|
@@ -206,10 +206,8 @@ abstract class GestureHandler {
|
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
sendEvent = (nativeEvent: HammerInputExt) => {
|
|
209
|
-
const {
|
|
210
|
-
|
|
211
|
-
onGestureHandlerStateChange,
|
|
212
|
-
} = this.propsRef.current;
|
|
209
|
+
const { onGestureHandlerEvent, onGestureHandlerStateChange } =
|
|
210
|
+
this.propsRef.current;
|
|
213
211
|
|
|
214
212
|
const event = this.transformEventData(nativeEvent);
|
|
215
213
|
|
|
@@ -312,7 +310,7 @@ abstract class GestureHandler {
|
|
|
312
310
|
return;
|
|
313
311
|
}
|
|
314
312
|
|
|
315
|
-
this.onRawEvent(
|
|
313
|
+
this.onRawEvent(ev as unknown as HammerInputExt);
|
|
316
314
|
|
|
317
315
|
// TODO: Bacon: Check against something other than null
|
|
318
316
|
// The isFirst value is not called when the first rotation is calculated.
|
|
@@ -336,17 +334,17 @@ abstract class GestureHandler {
|
|
|
336
334
|
// TODO(TS) Hammer types aren't exactly that what we get in runtime
|
|
337
335
|
if (!this.isDiscrete) {
|
|
338
336
|
this.hammer!.on(`${this.name}start`, (event: HammerInput) =>
|
|
339
|
-
this.onStart(
|
|
337
|
+
this.onStart(event as unknown as HammerInputExt)
|
|
340
338
|
);
|
|
341
339
|
this.hammer!.on(
|
|
342
340
|
`${this.name}end ${this.name}cancel`,
|
|
343
341
|
(event: HammerInput) => {
|
|
344
|
-
this.onGestureEnded(
|
|
342
|
+
this.onGestureEnded(event as unknown as HammerInputExt);
|
|
345
343
|
}
|
|
346
344
|
);
|
|
347
345
|
}
|
|
348
346
|
this.hammer!.on(this.name, (ev: HammerInput) =>
|
|
349
|
-
this.onGestureActivated(
|
|
347
|
+
this.onGestureActivated(ev as unknown as HammerInputExt)
|
|
350
348
|
); // TODO(TS) remove cast after https://github.com/DefinitelyTyped/DefinitelyTyped/pull/50438 is merged
|
|
351
349
|
}
|
|
352
350
|
|
|
@@ -54,23 +54,29 @@ class PanGestureHandler extends DraggingGestureHandler {
|
|
|
54
54
|
return Hammer.DIRECTION_ALL;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
if (!isnan(activeOffsetXStart))
|
|
57
|
+
if (!isnan(activeOffsetXStart)) {
|
|
58
58
|
horizontalDirections.push(Hammer.DIRECTION_LEFT);
|
|
59
|
-
|
|
59
|
+
}
|
|
60
|
+
if (!isnan(activeOffsetXEnd)) {
|
|
60
61
|
horizontalDirections.push(Hammer.DIRECTION_RIGHT);
|
|
61
|
-
|
|
62
|
+
}
|
|
63
|
+
if (horizontalDirections.length === 2) {
|
|
62
64
|
horizontalDirections = [Hammer.DIRECTION_HORIZONTAL];
|
|
65
|
+
}
|
|
63
66
|
|
|
64
67
|
directions = directions.concat(horizontalDirections);
|
|
65
68
|
let verticalDirections = [];
|
|
66
69
|
|
|
67
|
-
if (!isnan(activeOffsetYStart))
|
|
70
|
+
if (!isnan(activeOffsetYStart)) {
|
|
68
71
|
verticalDirections.push(Hammer.DIRECTION_UP);
|
|
69
|
-
|
|
72
|
+
}
|
|
73
|
+
if (!isnan(activeOffsetYEnd)) {
|
|
70
74
|
verticalDirections.push(Hammer.DIRECTION_DOWN);
|
|
75
|
+
}
|
|
71
76
|
|
|
72
|
-
if (verticalDirections.length === 2)
|
|
77
|
+
if (verticalDirections.length === 2) {
|
|
73
78
|
verticalDirections = [Hammer.DIRECTION_VERTICAL];
|
|
79
|
+
}
|
|
74
80
|
|
|
75
81
|
directions = directions.concat(verticalDirections);
|
|
76
82
|
|
package/android/lib/build.gradle
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
apply plugin: 'com.android.library'
|
|
2
|
-
|
|
3
|
-
repositories {
|
|
4
|
-
maven { url 'https://repo1.maven.org/maven2' }
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
android {
|
|
8
|
-
compileSdkVersion 23
|
|
9
|
-
buildToolsVersion '25.0.0'
|
|
10
|
-
|
|
11
|
-
defaultConfig {
|
|
12
|
-
minSdkVersion 16
|
|
13
|
-
targetSdkVersion 23
|
|
14
|
-
versionCode 1
|
|
15
|
-
versionName "1.0"
|
|
16
|
-
}
|
|
17
|
-
buildTypes {
|
|
18
|
-
release {
|
|
19
|
-
minifyEnabled false
|
|
20
|
-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
dependencies {
|
|
26
|
-
testCompile 'junit:junit:4.12'
|
|
27
|
-
compile 'com.android.support:appcompat-v7:23.4.0'
|
|
28
|
-
}
|
|
Binary file
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
-
<plist version="1.0">
|
|
4
|
-
<dict>
|
|
5
|
-
<key>SchemeUserState</key>
|
|
6
|
-
<dict>
|
|
7
|
-
<key>RNGestureHandler-tvOS.xcscheme_^#shared#^_</key>
|
|
8
|
-
<dict>
|
|
9
|
-
<key>orderHint</key>
|
|
10
|
-
<integer>0</integer>
|
|
11
|
-
</dict>
|
|
12
|
-
<key>RNGestureHandler.xcscheme_^#shared#^_</key>
|
|
13
|
-
<dict>
|
|
14
|
-
<key>orderHint</key>
|
|
15
|
-
<integer>1</integer>
|
|
16
|
-
</dict>
|
|
17
|
-
</dict>
|
|
18
|
-
</dict>
|
|
19
|
-
</plist>
|