Saltar al contenido principal

Ciclo de Vida de una Secuencia

FluxManager es el orquestador central del sistema: coordina la carga de datos, la inicialización, la ejecución y el cierre de una Sequence. A continuación se describe el ciclo de vida típico, en el orden en que normalmente ocurre.

1. Obtener las secuencias disponibles

GetSequences() pide al backend (FirebaseData.Instance.GetSequences) la lista de secuencias disponibles para la sesión o plataforma actual. Al completarse la operación, FluxManager dispara el evento estático OnGetsSequences, que la capa de presentación puede escuchar para, por ejemplo, poblar un menú de selección.

2. Cargar una secuencia

LoadSequence(uidSequence, stage) carga los pasos de una secuencia específica y la agrega o actualiza dentro de SequencesList. Para escenarios offline o de testing existe LoadSequenceLocal(uidSequence), que en lugar de consultar el backend lee un JSON local desde Resources/Sequences/<uid>.json. En ambos casos, al finalizar la carga se dispara OnLoadedSequence(bool isLoaded).

3. Inicializar la secuencia

InitializeSequence() limpia el registro de eventos (Log) y reinicia el índice de paso activo a 0, dejando la secuencia lista para comenzar desde el principio. Dispara OnInitializedSequence.

4. Iniciar la secuencia

StartSequence() marca SequenceRunning = true, activa el primer paso de la secuencia y, si IsActiveTimer está habilitado en la configuración, arranca el CountDownTimer. Dispara OnStartedSequence.

5. Bucle de ejecución

Mientras la secuencia está corriendo, cada vez que se dispara una Action (típicamente vía Action.TriggerAction(uid)), ocurre lo siguiente:

  • FluxManager verifica el trigger contra el paso activo, delegando la lógica de verificación en el FluxState activo (CheckTriggerAction).
  • Se dispara OnTriggerActionSequence(isCorrect, index) para informar el resultado.
  • Si corresponde avanzar de paso, se llama a ActivateNextStep del FluxState activo, lo que dispara OnDeactivatePreviousStep(uidAnterior) seguido de OnActivateStep(uidNuevo).

En paralelo, si el CountDownTimer llega a cero, se dispara OnTimerFinished(index) para que la capa de presentación reaccione (por ejemplo, marcando el paso como fallido por tiempo).

6. Manejo de foco de la aplicación

Si IsActiveApplicationFocus está activo en la configuración, el sistema reacciona a los cambios de foco de la aplicación:

  • Al perder el foco (OnApplicationFocus(false)), FluxManager pausa el flujo mediante SleepFlux, calculando el tiempo transcurrido en ese instante.
  • Al recuperar el foco, ResumeFlux (apoyado en GetCountStepOnResume) calcula cuántos pasos y cuánto tiempo deben avanzarse para compensar el tiempo que la aplicación estuvo en segundo plano, respetando siempre MinRemainingTimeAfterFocus como límite inferior de tiempo restante.

7. Finalizar la secuencia

FinishSequence() detiene el timer y marca SequenceRunning = false. Dispara OnFinishedSequence, evento con el que la capa de presentación normalmente muestra resultados o métricas de desempeño.

Diagramas

Ciclo de vida de FluxManager

Secuencia de disparo de una acción