Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/tests/xml-declaration/xml-declaration-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,10 +187,10 @@ export function test_parse_ShouldParseBindingsToGestures() {
p.bindingContext = context;
var lbl = <labelModule.Label>p.content;

var observer = (<any>lbl)._gestureObservers[gesturesModule.GestureTypes.tap][0];
var observer = (<view.View>lbl).getGestureObservers(gesturesModule.GestureTypes.tap)[0];

TKUnit.assert(observer !== undefined, "Expected result: true.");
TKUnit.assert(observer._context === context, "Context should be equal to binding context. Actual result: " + observer._context);
TKUnit.assert(observer.context === context, "Context should be equal to binding context. Actual result: " + observer.context);
};

export function test_parse_ShouldParseSubProperties() {
Expand Down
28 changes: 21 additions & 7 deletions apps/ui-tests-app/pages/gestures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,34 +62,48 @@ export function createPage() {
rotaionLabel.text = "Gestures detection disabled";
});

var observer1 = tapLabel.observe(gestures.GestureTypes.tap, function (args: gestures.GestureEventData) {
tapLabel.observe(gestures.GestureTypes.tap, function (args: gestures.GestureEventData) {
tapLabel.text = "Tap gesture detected";
});

var observer2 = doubletapLabel.observe(gestures.GestureTypes.doubleTap, function (args: gestures.GestureEventData) {
var observer1 = tapLabel.getGestureObservers(gestures.GestureTypes.tap)[0];

doubletapLabel.observe(gestures.GestureTypes.doubleTap, function (args: gestures.GestureEventData) {
doubletapLabel.text = "Double Tap gesture detected";
});

var observer3 = longpressLabel.observe(gestures.GestureTypes.longPress, function (args: gestures.GestureEventData) {
var observer2 = doubletapLabel.getGestureObservers(gestures.GestureTypes.doubleTap)[0];

longpressLabel.observe(gestures.GestureTypes.longPress, function (args: gestures.GestureEventData) {
longpressLabel.text = "Long Press gesture detected";
});

var observer4 = swipeLabel.observe(gestures.GestureTypes.swipe, function (args: gestures.SwipeGestureEventData) {
var observer3 = longpressLabel.getGestureObservers(gestures.GestureTypes.longPress)[0];

swipeLabel.observe(gestures.GestureTypes.swipe, function (args: gestures.SwipeGestureEventData) {
swipeLabel.text = "Swipe Direction: " + args.direction;
});

var observer5 = panLabel.observe(gestures.GestureTypes.pan, function (args: gestures.PanGestureEventData) {
var observer4 = swipeLabel.getGestureObservers(gestures.GestureTypes.swipe)[0];

panLabel.observe(gestures.GestureTypes.pan, function (args: gestures.PanGestureEventData) {
panLabel.text = "Pan deltaX:" + args.deltaX + "; deltaY:" + args.deltaY + ";";
});

var observer6 = pinchLabel.observe(gestures.GestureTypes.pinch, function (args: gestures.PinchGestureEventData) {
var observer5 = panLabel.getGestureObservers(gestures.GestureTypes.pan)[0];

pinchLabel.observe(gestures.GestureTypes.pinch, function (args: gestures.PinchGestureEventData) {
pinchLabel.text = "Pinch Scale: " + args.scale;
});

var observer7 = rotaionLabel.observe(gestures.GestureTypes.rotation, function (args: gestures.RotationGestureEventData) {
var observer6 = pinchLabel.getGestureObservers(gestures.GestureTypes.pinch)[0];

rotaionLabel.observe(gestures.GestureTypes.rotation, function (args: gestures.RotationGestureEventData) {
rotaionLabel.text = "Rotation: " + args.rotation;
});

var observer7 = rotaionLabel.getGestureObservers(gestures.GestureTypes.rotation)[0];

var page = new pages.Page();
page.content = stack;
return page;
Expand Down
29 changes: 23 additions & 6 deletions ui/core/view-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,16 @@ export class View extends proxy.ProxyObject implements definition.View {

public _cssClasses: Array<string> = [];

public _gestureObservers = {};
public _gestureObservers: Map<number, Array<gestures.GesturesObserver>>;

public getGestureObservers(type: gestures.GestureTypes): Array<gestures.GesturesObserver> {
var result;
if (this._gestureObservers) {
result = this._gestureObservers.get(type) ? this._gestureObservers.get(type).slice(0) : undefined;
}
return result;
}

private _updatingInheritedProperties: boolean;

public _options: definition.Options;
Expand All @@ -147,7 +156,7 @@ export class View extends proxy.ProxyObject implements definition.View {
this._visualState = visualStateConstants.Normal;
}

observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
observe(type: gestures.GestureTypes, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
var gesturesList = this._getGesturesList(type, true);
gesturesList.push(gestures.observe(this, type, callback, thisArg));
}
Expand All @@ -157,10 +166,18 @@ export class View extends proxy.ProxyObject implements definition.View {
throw new Error("GestureType must be a valid gesture!");
}

var list = this._gestureObservers[gestureType];
if (!list && createIfNeeded) {
list = [];
this._gestureObservers[gestureType] = list;
var list: Array<gestures.GesturesObserver>;
if (this._gestureObservers && this._gestureObservers.has(gestureType)) {
list = this._gestureObservers.get(gestureType);
}
else {
if (createIfNeeded) {
list = [];
if (!this._gestureObservers) {
this._gestureObservers = new Map<number, Array<gestures.GesturesObserver>>();
}
this._gestureObservers.set(gestureType, list);
}
}
return list;
}
Expand Down
65 changes: 24 additions & 41 deletions ui/core/view.android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@ export class View extends viewCommon.View {
this._updateOnTouchListener(this.isUserInteractionEnabled);
}

observe(type: gestures.GestureTypes, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
super.observe(type, callback, thisArg);
if (this.isLoaded && !this.touchListenerIsSet) {
this.setOnTouchListener();
}
}

private touchListenerIsSet: boolean;

public onLoaded() {
super.onLoaded();
this.setOnTouchListener();
Expand All @@ -87,11 +96,17 @@ export class View extends viewCommon.View {
super.onUnloaded();
if (this._nativeView && this._nativeView.setOnTouchListener) {
this._nativeView.setOnTouchListener(null);
this.touchListenerIsSet = false;
}
}

private hasGestureObservers() {
return this._gestureObservers ? this._gestureObservers.size > 0 : false;
}

private setOnTouchListener() {
if (this._nativeView && this._nativeView.setOnTouchListener && Object.keys(this._gestureObservers).length > 0) {
if (this._nativeView && this._nativeView.setOnTouchListener && this.hasGestureObservers()) {
this.touchListenerIsSet = true;
var that = new WeakRef(this);
if (this._nativeView.setClickable) {
this._nativeView.setClickable(true);
Expand All @@ -102,47 +117,15 @@ export class View extends viewCommon.View {
if (!owner) {
return false;
}
var i;
for (var prop in owner._gestureObservers) {
if (owner._gestureObservers.hasOwnProperty(prop)) {
for (i = 0; i < owner._gestureObservers[prop].length; i++) {
var gestureObserver = owner._gestureObservers[prop][i];
if (gestureObserver._simpleGestureDetector) {
gestureObserver._simpleGestureDetector.onTouchEvent(motionEvent);
}

if (gestureObserver._scaleGestureDetector) {
gestureObserver._scaleGestureDetector.onTouchEvent(motionEvent);
}

if (gestureObserver._swipeGestureDetector) {
gestureObserver._swipeGestureDetector.onTouchEvent(motionEvent);
}

if (gestureObserver._panGestureDetector) {
gestureObserver._panGestureDetector.onTouchEvent(motionEvent);
}

if (gestureObserver.type & gestures.GestureTypes.rotation && motionEvent.getPointerCount() === 2) {

var deltaX = motionEvent.getX(0) - motionEvent.getX(1);
var deltaY = motionEvent.getY(0) - motionEvent.getY(1);
var radians = Math.atan(deltaY / deltaX);
var degrees = radians * (180 / Math.PI);

var args = <gestures.RotationGestureEventData>{
type: gestures.GestureTypes.rotation,
view: owner,
android: motionEvent,
rotation: degrees,
ios: null
}

//var observer = that.get();
if (gestureObserver.callback) {
gestureObserver.callback.call(gestureObserver._context, args);
}

var i;
for (var gestType in gestures.GestureTypes) {
if (gestures.GestureTypes.hasOwnProperty(gestType)) {
var gestArray = owner.getGestureObservers(gestType);
if (gestArray) {
for (i = 0; i < gestArray.length; i++) {
var gestObserver = gestArray[i];
gestObserver.androidOnTouchEvent(motionEvent);
}
}
}
Expand Down
11 changes: 10 additions & 1 deletion ui/core/view.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,15 @@ declare module "ui/core/view" {
*/
public focus(): boolean;

observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any);
public getGestureObservers(type: gestures.GestureTypes): Array<gestures.GesturesObserver>;

/**
* Adds a gesture observer.
* @param type - Type of the gesture.
* @param callback - A function that will be executed when gesture is received.
* @param thisArg - An optional parameter which will be used as `this` context for callback execution.
*/
observe(type: gestures.GestureTypes, callback: (args: gestures.GestureEventData) => void, thisArg?: any);

/**
* A basic method signature to hook an event listener (shortcut alias to the addEventListener method).
Expand Down Expand Up @@ -386,6 +394,7 @@ declare module "ui/core/view" {

// TODO: Implement logic for stripping these lines out
//@private
_gestureObservers: Map<number, Array<gestures.GesturesObserver>>;
_isInheritedChange(): boolean;
_domId: number;
_cssClasses: Array<string>;
Expand Down
62 changes: 59 additions & 3 deletions ui/gestures/gestures-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ export enum SwipeDirection {
down = 1 << 3
}

export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void, thisArg?: any): definition.GesturesObserver {
var observer = new definition.GesturesObserver(callback);
observer.observe(target, type, thisArg);
export function observe(target: view.View, type: definition.GestureTypes, callback: (args: definition.GestureEventData) => void, thisArg?: any): definition.GesturesObserver {
var observer = new definition.GesturesObserver(target, callback, thisArg);
observer.observe(type);
return observer;
}

Expand Down Expand Up @@ -88,4 +88,60 @@ export function fromString(type: string): definition.GestureTypes {
}

return undefined;
}

export class GesturesObserver implements definition.GesturesObserver {
private _callback: (args: definition.GestureEventData) => void;
private _target: view.View;
private _context: any;

public type: definition.GestureTypes;

public get callback(): (args: definition.GestureEventData) => void {
return this._callback;
}

public get target(): view.View {
return this._target;
}

public get context() {
return this._context;
}

constructor(target: view.View, callback: (args: definition.GestureEventData) => void, context: any) {
this._target = target;
this._callback = callback;
this._context = context;
}

public androidOnTouchEvent(motionEvent: android.view.MotionEvent) {
//
}

public observe(type: definition.GestureTypes) {
//
}

public disconnect() {
// remove gesture observer from map
if (this.target) {
var gestureObserversArray = this.target._gestureObservers.get(this.type);
if (gestureObserversArray) {
var i;
for (i = 0; i < gestureObserversArray.length; i++) {
if (gestureObserversArray[i].callback === this.callback) {
break;
}
}
gestureObserversArray.splice(i, 1);
if (gestureObserversArray.length === 0) {
this.target._gestureObservers.delete(this.type);
}
}
}
this._target = null;
this._callback = null;
this._context = null;
}
}
Loading