private void SetState(UserflowState newState, long nowTime)
        {
            // Establishes newState for userflow at nowTime .
            state          = newState;
            isForegrounded = UserflowReporter.isForegrounded;
            switch (state)
            {
            case UserflowState.CANCELLED:
                SetEndTime(nowTime);
                RemoveTimer();
                break;

            case UserflowState.BEGUN:
                SetBeginTime(nowTime);
                if (isForegrounded)
                {
                    SetForegroundTime(nowTime);
                    CreateTimer();
                }
                break;

            default:
                // Final state
                SetEndTime(nowTime);
                RemoveTimer();
                if (isForegrounded)
                {
                    // Entering final state is effectively closing early ahead of
                    // the time when app may be backgrounded later.  The persisted
                    // record gets the correct additional "eye time".
                    eyeTime       += nowTime - foregroundTime;
                    isForegrounded = false;
                }
                if (newState == UserflowState.TIMEOUT)
                {
                    Crittercism.OnUserflowTimeOut(new CRUserflowEventArgs(name));
                }
                break;
            }
            UserflowReporter.Save(this);
        }