internal void HandleTouch(TouchEffect sender, TouchStatus status)
        {
            if (sender.IsDisabled)
            {
                return;
            }

            var canExecuteAction = sender.CanExecute;

            if (status != TouchStatus.Started || canExecuteAction)
            {
                if (!canExecuteAction)
                {
                    status = TouchStatus.Canceled;
                }

                var state = status == TouchStatus.Started
                                        ? TouchState.Pressed
                                        : TouchState.Normal;

                if (status == TouchStatus.Started)
                {
                    animationProgress = 0;
                    animationState    = state;
                }

                var isToggled = sender.IsToggled;
                if (isToggled.HasValue)
                {
                    if (status != TouchStatus.Started)
                    {
                        durationMultiplier = (animationState == TouchState.Pressed && !isToggled.Value) ||
                                             (animationState == TouchState.Normal && isToggled.Value)
                                                        ? 1 - animationProgress
                                                        : animationProgress;

                        UpdateStatusAndState(sender, status, state);
                        if (status == TouchStatus.Canceled)
                        {
                            sender.ForceUpdateState(false);
                            return;
                        }
                        OnTapped(sender);
                        sender.IsToggled = !isToggled;
                        return;
                    }

                    state = isToggled.Value
                                                ? TouchState.Normal
                                                : TouchState.Pressed;
                }

                UpdateStatusAndState(sender, status, state);
            }

            if (status == TouchStatus.Completed)
            {
                OnTapped(sender);
            }
        }