/// <summary>
        /// Called when touch up
        /// </summary>
        /// <param name="touchEventArgs">Touch arguments</param>
        public void OnTouchUp(TouchEventArgs touchEventArgs)
        {
            if (this.currentTouchDisabled)
            {
                this.currentTouchDisabled = false;
                return;
            }

            this.currentStartTouch = null;

            if (this.cancellationTokenSource != null)
            {
                this.cancellationTokenSource.Cancel();
                this.cancellationTokenSource = null;
            }

            this.TouchUp?.Invoke(this, touchEventArgs);

            if (this.IsClicking)
            {
                this.Clicked?.Invoke(this, EventArgs.Empty);
            }

            this.IsClicking = false;
        }
        /// <summary>
        /// Called when touch leave
        /// </summary>
        /// <param name="touchEventArgs">Touch arguments</param>
        public void OnTouchLeave(TouchEventArgs touchEventArgs)
        {
            if (this.currentTouchDisabled)
            {
                return;
            }

            this.IsClicking        = false;
            this.currentStartTouch = null;
            this.TouchLeave?.Invoke(this, touchEventArgs);
        }
        /// <summary>
        /// Called when touch move
        /// </summary>
        /// <param name="touchEventArgs">Touch arguments</param>
        public void OnTouchMove(TouchEventArgs touchEventArgs)
        {
            if (this.currentTouchDisabled)
            {
                return;
            }

            if (this.currentStartTouch != null && this.currentStartTouch.Position.Distance(touchEventArgs.Position) > moveTolerance)
            {
                this.currentStartTouch = null;
            }

            this.TouchMove?.Invoke(this, touchEventArgs);
        }
        /// <summary>
        /// Called when touch is down
        /// </summary>
        /// <param name="touchEventArgs">Touch arguments</param>
        public void OnTouchDown(TouchEventArgs touchEventArgs)
        {
            this.currentStartTouch = new StartTouch(touchEventArgs.Position);
            this.IsClicking        = true;

            if (this.cancellationTokenSource != null)
            {
                this.cancellationTokenSource.Cancel();
                this.cancellationTokenSource = null;
            }

            this.cancellationTokenSource = new CancellationTokenSource();

            this.longPressDelayTask = Task.Delay(this.LongPressTime, cancellationTokenSource.Token);
            this.longPressDelayTask.ContinueWith(t =>
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    this.cancellationTokenSource = null;

                    if (this.currentStartTouch == null || t.IsCanceled)
                    {
                        return;
                    }

                    if (this.LongPressCancelClick)
                    {
                        this.IsClicking = false;
                    }

                    this.LongPressed?.Invoke(this, new TouchEventArgs(this.currentStartTouch.Position));
                    this.currentStartTouch = null;
                });
            });

            this.TouchDown?.Invoke(this, touchEventArgs);
        }
 /// <summary>
 /// this method disable the current tracking of a current touch device
 /// </summary>
 public void DisableCurrentTouch()
 {
     this.IsClicking           = false;
     this.currentStartTouch    = null;
     this.currentTouchDisabled = true;
 }