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); }