public void updateView(bool updateAll)
    {
        if (_DEBUG_lastState != userInteractionState)
        {
            Debug.Log(userInteractionState);
            _DEBUG_lastState = userInteractionState;
        }

        List<Hexagon> toBeUpdatedHexagons = new List<Hexagon>();
        if (updateAll)
        {
            toBeUpdatedHexagons.AddRange(Map.instance.Hexagons);
        }
        else
        {
            if (_prevHexagon != null)
            {
                toBeUpdatedHexagons.Add(_prevHexagon);
                toBeUpdatedHexagons.AddRange(_prevHexagon.SurroundingHexagons);
            }
        }
        foreach (var toBeUpdatedHexagon in toBeUpdatedHexagons)
        {
            toBeUpdatedHexagon.updateMaterial();
        }

        moveButtonTo(GridManager.instance.MoveButton, _prevHexagon, new Vector3(50, 60, 0));
        moveButtonTo(GridManager.instance.InfectButton, _prevHexagon, new Vector3(-50, 60, 0));

        GridManager.instance.MoveButton.GetComponent<UnityEngine.UI.Button>().interactable = isMoveButtonActive(_prevHexagon);
        GridManager.instance.InfectButton.GetComponent<UnityEngine.UI.Button>().interactable = isInfectButtonActive(_prevHexagon);
    }
        public UserInteractionManager()
        {
            Log.Logger.Information($"Creating UserInteractionManager");

            SnoozeTimer           = new Timer();
            SnoozeTimer.Enabled   = false;
            SnoozeTimer.AutoReset = false;
            SnoozeTimer.Elapsed  += SnoozeTimer_Elapsed;

            ElapsedActiveReminders = new List <ReminderEntity>();
            UserState = UserInteractionState.Disabled;

            Log.Logger.Information($"Creating UserInteractionManager done");
        }
        /// <summary>
        /// Sets SnoozeTime user state and starts the snooze timer countdown.
        /// </summary>
        protected virtual void GoToSnoozeState(DateTime now, int?remainingSnoozeIntervalMs = null)
        {
            UserState          = UserInteractionState.SnoozeTime;
            SnoozeTimerStarted = now;

            //determine interval
            int configuredIntervalMs = SnoozeIntervalMinutes.Value * 60 * 1000;
            int snoozeIntervalToUse  = remainingSnoozeIntervalMs ?? configuredIntervalMs;

            //start timer
            SnoozeTimer.Interval = snoozeIntervalToUse;
            Log.Logger.Information($"Starting snooze timer with intveral [Interval = {snoozeIntervalToUse} ms]");
            SnoozeTimer.Start();
        }
        /// <summary>
        /// Immediately fires next event if there is any reminder in the list, or goes to NoElapsedReminders state otherwise.
        /// </summary>
        protected virtual void GoToRingingOrIdleState(DateTime now)
        {
            if (ElapsedActiveReminders.Any())
            {
                var nextToRing = ElapsedActiveReminders.First();

                GoToRingingState(nextToRing.Name, now);
            }
            else
            {
                UserState = UserInteractionState.NoElapsedReminders;
                Log.Logger.Information($"No elapsed reminders in the list. GoToRingingOrIdleState method is setting state to NoElapsedReminders");
            }
        }
        protected virtual void HandleSnoozeElapsed(DateTime now)
        {
            if (UserState != UserInteractionState.SnoozeTime)
            {
                //only expected to happen as a result of not well handled concurrency
                //this may put component in a deadlock probably! Will disable+enabled unblock the state?
                Log.Logger.Error($"UserState is {UserState} instead of {UserInteractionState.SnoozeTime} after snooze period elapsed. Ignoring timer event.");
                return;
            }

            var nextReminderToRing = ElapsedActiveReminders.FirstOrDefault();

            if (nextReminderToRing == null)
            {
                //only expected to happen as a result of not well handled concurrency
                Log.Logger.Error($"No reminder found after snooze period elapsed. Going to {UserInteractionState.NoElapsedReminders} state.");
                UserState = UserInteractionState.NoElapsedReminders;
                return;
            }

            GoToRingingState(nextReminderToRing.Name, now);
        }
        protected virtual void HandleStatusChangeAndSetIsEnabled(bool wasEnabledBefore, bool isEnabled)
        {
            bool     startedNow = !wasEnabledBefore && isEnabled;
            bool     stoppedNow = wasEnabledBefore && !isEnabled;
            DateTime now        = DateTime.UtcNow;

            if (startedNow)
            {
                Log.Logger.Information($"Starting UserInteractionManager");
                GoToRingingOrIdleState(now);
                Log.Logger.Information($"Starting UserInteractionManager done");
            }
            else if (stoppedNow)
            {
                SnoozeTimer.Stop();
                UserState = UserInteractionState.Disabled;
                Log.Logger.Information($"Stopped UserInteractionManager");
            }
            else
            {
                Log.Logger.Information($"UserInteractionManager already {(isEnabled ? "started" : "stopped")}");
            }
        }
        /// <summary>
        /// Set user state and fire ringing event.
        /// </summary>
        /// <param name="reminderName"></param>
        /// <param name="now"></param>
        protected void GoToRingingState(string reminderName, DateTime now)
        {
            UserState = UserInteractionState.WaitingUserResponse;

            OnRingingNeeded(reminderName);
        }
 public UserInteractionStateChangedEventArgs(UserInteractionState userInteractionstate)
 {
     UserInteractionState = userInteractionstate;
 }
    void OnReleasingHexagon(Hexagon hexagon)
    {
        switch (userInteractionState)
        {
            case UserInteractionState.Idle:
                userInteractionState = UserInteractionState.Idle;
                break;
            case UserInteractionState.HexagonSelected:

                userInteractionState = UserInteractionState.HexagonSelected;
                break;
            case UserInteractionState.StartedMoving:
                userInteractionState = UserInteractionState.StartedMoving;
                break;
            case UserInteractionState.StartedDragging:
                if (hexagon.isAccessible() && !hexagon.HexagonContainsFungus)
                {
                    EndDrag(hexagon);
                    selectDifferentHexagon(null);
                    userInteractionState = UserInteractionState.Idle;
                }
                else
                {
                    userInteractionState = UserInteractionState.HexagonSelected;
                }
                break;
        }
        updateView();
    }
 void OnPressingNowhere()
 {
     switch (userInteractionState)
     {
         case UserInteractionState.Idle:
         case UserInteractionState.HexagonSelected:
         case UserInteractionState.StartedMoving:
         case UserInteractionState.StartedDragging:
             selectDifferentHexagon(null);
             userInteractionState = UserInteractionState.Idle;
             break;
     }
     updateView();
 }
 void OnPressingHexagon(Hexagon hexagon)
 {
     switch (userInteractionState)
     {
         case UserInteractionState.Idle:
             if (hexagon.HexagonContainsFungus)
             {
                 selectDifferentHexagon(hexagon);
                 userInteractionState = UserInteractionState.HexagonSelected;
                 if (isMoveButtonActive(hexagon))
                 {
                     StartDrag(hexagon);
                     userInteractionState = UserInteractionState.StartedDragging;
                 }
             }
             else
             {
                 userInteractionState = UserInteractionState.Idle;
             }
             break;
         case UserInteractionState.HexagonSelected:
             if (isMoveButtonActive(hexagon) && hexagon == _prevHexagon)
             {
                 StartDrag(hexagon);
                 userInteractionState = UserInteractionState.StartedDragging;
             }
             else
             {
                 userInteractionState = UserInteractionState.HexagonSelected;
             }
             break;
         case UserInteractionState.StartedMoving:
             userInteractionState = UserInteractionState.StartedMoving;
             break;
         case UserInteractionState.StartedDragging:
             userInteractionState = UserInteractionState.StartedDragging;
             break;
     }
     updateView();
 }
 private void OnMoveClicked()
 {
     switch (userInteractionState)
     {
         case UserInteractionState.Idle:
             userInteractionState = UserInteractionState.Idle;
             break;
         case UserInteractionState.HexagonSelected:
             StartDrag(_prevHexagon);
             userInteractionState = UserInteractionState.StartedMoving;
             break;
         case UserInteractionState.StartedMoving:
             userInteractionState = UserInteractionState.StartedMoving;
             break;
         case UserInteractionState.StartedDragging:
             userInteractionState = UserInteractionState.StartedDragging;
             break;
     }
     updateView();
 }
 private void OnInfectClicked()
 {
     switch (userInteractionState)
     {
         case UserInteractionState.Idle:
             userInteractionState = UserInteractionState.Idle;
             break;
         case UserInteractionState.HexagonSelected:
             if (isInfectButtonActive(_prevHexagon))
             {
                 _prevHexagon.InfectTree();
                 selectDifferentHexagon(null);
                 userInteractionState = UserInteractionState.Idle;
             }
             else
             {
                 userInteractionState = UserInteractionState.HexagonSelected;
             }
             break;
         case UserInteractionState.StartedMoving:
             userInteractionState = UserInteractionState.StartedMoving;
             break;
         case UserInteractionState.StartedDragging:
             userInteractionState = UserInteractionState.StartedDragging;
             break;
     }
     updateView();
 }