Skip to content

Commit 9bf46bf

Browse files
committed
fix: nativeGetterKey option for handler
1 parent 670c68d commit 9bf46bf

File tree

5 files changed

+66
-32
lines changed

5 files changed

+66
-32
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"plugin.watch.android": "npm i && npm-watch build.android",
2020
"plugin.watch.ios": "npm i && npm-watch build.ios",
2121
"plugin.watch": "npm run plugin.watch.tsc & npm run plugin.watch.android & npm run plugin.watch.ios",
22-
"publish": "npm run build && lerna publish --create-release=github",
22+
"publish": "npm run build && lerna publish --create-release=github --force-publish",
2323
"commitmsg": "commitlint -e $GIT_PARAMS"
2424
},
2525
"keywords": [

src/gesturehandler.android.ts

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export abstract class Handler<T extends com.swmansion.gesturehandler.GestureHand
132132
nativegetterName: 'getHitSlop',
133133
converter: {
134134
toNative(value) {
135-
const HIT_SLOP_NONE = com.swmansion.gesturehandler.GestureHandler.HIT_SLOP_NONE;
135+
const HIT_SLOP_NONE = GestureHandler.HIT_SLOP_NONE;
136136
if (typeof value === 'number') {
137137
const hitSlop = layout.toDevicePixels(value);
138138
return [hitSlop, hitSlop, hitSlop, hitSlop, HIT_SLOP_NONE, HIT_SLOP_NONE];
@@ -180,6 +180,7 @@ export abstract class Handler<T extends com.swmansion.gesturehandler.GestureHand
180180
shouldStartGesture: (arg) => boolean;
181181
manager: WeakRef<Manager>;
182182
touchListener: com.swmansion.gesturehandler.OnTouchEventListener<T>;
183+
nativeGetterKey = 'nativeView';
183184

184185
getExtraData(handler: T) {
185186
const numberOfPointers = handler.getNumberOfPointers();
@@ -276,7 +277,10 @@ export abstract class Handler<T extends com.swmansion.gesturehandler.GestureHand
276277
this.manager.get().attachGestureHandler(this, view);
277278
}
278279
detachFromView(view?: View) {
279-
if (view && view !== this.attachedView) {
280+
if ((view && view !== this.attachedView) || !this.attachedView) {
281+
return;
282+
}
283+
if (!this.attachedView) {
280284
return;
281285
}
282286
this.manager.get().detachGestureHandler(this, this.attachedView);
@@ -347,6 +351,10 @@ export class PinchGestureHandler extends Handler<com.swmansion.gesturehandler.Pi
347351
}
348352
getExtraData(handler: com.swmansion.gesturehandler.PinchGestureHandler) {
349353
return Object.assign(super.getExtraData(handler), {
354+
x: layout.toDeviceIndependentPixels(handler.getLastRelativePositionX()),
355+
y: layout.toDeviceIndependentPixels(handler.getLastRelativePositionY()),
356+
absoluteX: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionX()),
357+
absoluteY: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionY()),
350358
scale: handler.getScale(),
351359
focalX: layout.toDeviceIndependentPixels(handler.getFocalPointX()),
352360
focalY: layout.toDeviceIndependentPixels(handler.getFocalPointY()),
@@ -355,20 +363,21 @@ export class PinchGestureHandler extends Handler<com.swmansion.gesturehandler.Pi
355363
}
356364
}
357365

366+
const GestureHandler = com.swmansion.gesturehandler.GestureHandler;
358367
export enum FlingDirection {
359-
DIRECTION_LEFT = com.swmansion.gesturehandler.GestureHandler.DIRECTION_LEFT,
360-
DIRECTION_UP = com.swmansion.gesturehandler.GestureHandler.DIRECTION_UP,
361-
DIRECTION_DOWN = com.swmansion.gesturehandler.GestureHandler.DIRECTION_DOWN,
362-
DIRECTION_RIGHT = com.swmansion.gesturehandler.GestureHandler.DIRECTION_RIGHT,
368+
DIRECTION_LEFT = GestureHandler.DIRECTION_LEFT,
369+
DIRECTION_UP = GestureHandler.DIRECTION_UP,
370+
DIRECTION_DOWN = GestureHandler.DIRECTION_DOWN,
371+
DIRECTION_RIGHT = GestureHandler.DIRECTION_RIGHT,
363372
}
364373

365374
function directionToString(direction: number) {
366375
switch (direction) {
367-
case com.swmansion.gesturehandler.GestureHandler.DIRECTION_RIGHT:
376+
case GestureHandler.DIRECTION_RIGHT:
368377
return 'right';
369-
case com.swmansion.gesturehandler.GestureHandler.DIRECTION_UP:
378+
case GestureHandler.DIRECTION_UP:
370379
return 'up';
371-
case com.swmansion.gesturehandler.GestureHandler.DIRECTION_DOWN:
380+
case GestureHandler.DIRECTION_DOWN:
372381
return 'down';
373382
default:
374383
return 'left';
@@ -378,13 +387,13 @@ function directionToString(direction: number) {
378387
function directionFromString(direction: string) {
379388
switch (direction) {
380389
case 'right':
381-
return com.swmansion.gesturehandler.GestureHandler.DIRECTION_RIGHT;
390+
return GestureHandler.DIRECTION_RIGHT;
382391
case 'up':
383-
return com.swmansion.gesturehandler.GestureHandler.DIRECTION_UP;
392+
return GestureHandler.DIRECTION_UP;
384393
case 'down':
385-
return com.swmansion.gesturehandler.GestureHandler.DIRECTION_DOWN;
394+
return GestureHandler.DIRECTION_DOWN;
386395
default:
387-
return com.swmansion.gesturehandler.GestureHandler.DIRECTION_LEFT;
396+
return GestureHandler.DIRECTION_LEFT;
388397
}
389398
}
390399

@@ -407,21 +416,25 @@ export class LongPressGestureHandler extends Handler<com.swmansion.gesturehandle
407416
const context = Application.android.context as android.content.Context;
408417
return new com.swmansion.gesturehandler.LongPressGestureHandler(context);
409418
}
410-
// getExtraData(handler: com.swmansion.gesturehandler.LongPressGestureHandler) {
411-
// return Object.assign(super.getExtraData(handler), {
412-
// x: layout.toDeviceIndependentPixels(handler.getLastRelativePositionX()),
413-
// y: layout.toDeviceIndependentPixels(handler.getLastRelativePositionY()),
414-
// absoluteX: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionX()),
415-
// absoluteY: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionY())
416-
// });
417-
// }
419+
getExtraData(handler: com.swmansion.gesturehandler.LongPressGestureHandler) {
420+
return Object.assign(super.getExtraData(handler), {
421+
x: layout.toDeviceIndependentPixels(handler.getLastRelativePositionX()),
422+
y: layout.toDeviceIndependentPixels(handler.getLastRelativePositionY()),
423+
absoluteX: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionX()),
424+
absoluteY: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionY()),
425+
});
426+
}
418427
}
419428
export class RotationGestureHandler extends Handler<com.swmansion.gesturehandler.RotationGestureHandler, RotationGestureHandlerOptions> {
420429
createNative(options) {
421430
return new com.swmansion.gesturehandler.RotationGestureHandler();
422431
}
423432
getExtraData(handler: com.swmansion.gesturehandler.RotationGestureHandler) {
424433
return Object.assign(super.getExtraData(handler), {
434+
x: layout.toDeviceIndependentPixels(handler.getLastRelativePositionX()),
435+
y: layout.toDeviceIndependentPixels(handler.getLastRelativePositionY()),
436+
absoluteX: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionX()),
437+
absoluteY: layout.toDeviceIndependentPixels(handler.getLastAbsolutePositionY()),
425438
rotation: handler.getRotation(),
426439
anchorX: layout.toDeviceIndependentPixels(handler.getAnchorX()),
427440
anchorY: layout.toDeviceIndependentPixels(handler.getAnchorY()),
@@ -502,7 +515,7 @@ export class Manager extends ManagerBase {
502515
const registry = page.registry;
503516
if (registry) {
504517
registry.registerHandler(nHandler);
505-
registry.attachHandlerToView(nHandler.getTag(), view.nativeView);
518+
registry.attachHandlerToView(nHandler.getTag(), view[handler.nativeGetterKey]);
506519
}
507520
} else {
508521
throw new Error('a page is needed to attach a gesture');

src/gesturehandler.common.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,13 @@ export const ViewDisposeEvent = 'ViewDisposeEvent';
264264
let NATIVE_GESTURE_TAG = 74000;
265265
class ViewGestureExtended extends View {
266266
exclusiveTouchGestureHandler: NativeViewGestureHandler;
267+
268+
set exclusiveTouch(value) {
269+
this.style['exclusiveTouch'] = value;
270+
}
271+
get exclusiveTouch() {
272+
return this.style['exclusiveTouch'];
273+
}
267274
initNativeView() {
268275
if (this.nativeView) {
269276
this.nativeView.nsView = new WeakRef(this);
@@ -274,6 +281,10 @@ class ViewGestureExtended extends View {
274281
if (this.nativeView) {
275282
this.nativeView.nsView = null;
276283
}
284+
if (this.exclusiveTouchGestureHandler) {
285+
this.exclusiveTouchGestureHandler.detachFromView();
286+
this.exclusiveTouchGestureHandler = null;
287+
}
277288
this.notify({ eventName: ViewDisposeEvent, object: this });
278289
}
279290
[exclusiveTouchProperty.setNative](value: boolean) {

src/gesturehandler.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,12 @@ export interface HandlerOptions {
5050
shouldCancelWhenOutside?: boolean;
5151
waitFor?: number[];
5252
simultaneousHandlers?: number[];
53-
shouldStartGesture?: (event) => boolean;
53+
/**
54+
* optional property to access the View nativeView
55+
*
56+
* @memberof HandlerOptions
57+
*/
58+
nativeGetterKey?: string;
5459
}
5560
export abstract class Handler<T, U extends HandlerOptions> extends BaseNative<T, U> {
5661
enabled: boolean;

src/gesturehandler.ios.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ export class Handler<T extends GestureHandler, U extends HandlerOptions> extends
186186
return null;
187187
}
188188
attachedView: View;
189+
nativeGetterKey = 'nativeView';
189190
attachToView(view: View) {
190191
if (view === this.attachedView) {
191192
return;
@@ -194,13 +195,16 @@ export class Handler<T extends GestureHandler, U extends HandlerOptions> extends
194195
this.detachFromView(this.attachedView);
195196
}
196197
this.attachedView = view;
197-
const tag = this.native.tag;
198198
this.delegate = HandlerDelegate.initWithOwner(new WeakRef(this));
199199
this.native.delegate = this.delegate;
200-
this.manager.get().attachGestureHandler(tag, view);
200+
this.manager.get().attachGestureHandler(this, view);
201201
}
202202
detachFromView(view?: View) {
203-
if (view && view !== this.attachedView) {
203+
if ((view && view !== this.attachedView) || !this.attachedView) {
204+
return;
205+
}
206+
207+
if (!this.attachedView) {
204208
return;
205209
}
206210
const tag = this.native.tag;
@@ -246,22 +250,23 @@ export class Manager extends ManagerBase {
246250
}
247251

248252
viewListeners = new Map<View, Map<number, { init: () => void; dispose: () => void }>>();
249-
attachGestureHandler(handlerTag: number, view: View) {
253+
attachGestureHandler(handler: Handler<any, any>, view: View) {
254+
const tag = handler.native.tag;
250255
if (view.nativeView) {
251-
this.manager.attachGestureHandlerToView(handlerTag, view.nativeView);
256+
this.manager.attachGestureHandlerToView(tag, view[handler.nativeGetterKey]);
252257
}
253258
const onInit = () => {
254-
this.manager.attachGestureHandlerToView(handlerTag, view.nativeView);
259+
this.manager.attachGestureHandlerToView(tag, view[handler.nativeGetterKey]);
255260
};
256-
const onDispose = () => this.manager.dropGestureHandler(handlerTag);
261+
const onDispose = () => this.manager.dropGestureHandler(tag);
257262
view.on(ViewInitEvent, onInit, this);
258263
view.on(ViewDisposeEvent, onDispose, this);
259264
let viewListeners = this.viewListeners.get(view);
260265
if (!viewListeners) {
261266
viewListeners = new Map();
262267
this.viewListeners.set(view, viewListeners);
263268
}
264-
viewListeners.set(handlerTag, {
269+
viewListeners.set(tag, {
265270
init: onInit,
266271
dispose: onDispose,
267272
});

0 commit comments

Comments
 (0)