package com.blaze.agent.state import android.content.Context import android.os.PowerManager import android.util.Log import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow enum class AppState { SLEEP, LISTENING, ACTIVE, MONITORING } object AppStateManager { private const val TAG = "BlazeStateManager" private const val WAKE_LOCK_TAG = "Blaze:MonitoringWakeLock" private val _state = MutableStateFlow(AppState.SLEEP) val state: StateFlow = _state private var wakeLock: PowerManager.WakeLock? = null private var context: Context? = null var onEnterSleep: (() -> Unit)? = null var onEnterListening: (() -> Unit)? = null var onEnterActive: (() -> Unit)? = null var onEnterMonitoring: (() -> Unit)? = null fun init(ctx: Context) { context = ctx.applicationContext val pm = ctx.getSystemService(Context.POWER_SERVICE) as PowerManager wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG) wakeLock?.setReferenceCounted(false) } fun current(): AppState = _state.value fun transitionTo(newState: AppState) { val old = _state.value if (old == newState) return Log.d(TAG, "State: $old → $newState") when (newState) { AppState.SLEEP -> { releaseWakeLock(); onEnterSleep?.invoke() } AppState.LISTENING -> { releaseWakeLock(); onEnterListening?.invoke() } AppState.ACTIVE -> { acquireWakeLock(5 * 60 * 1000L); onEnterActive?.invoke() } AppState.MONITORING -> { acquireWakeLock(8 * 60 * 60 * 1000L); onEnterMonitoring?.invoke() } } _state.value = newState } private fun acquireWakeLock(timeout: Long) { if (wakeLock?.isHeld == true) wakeLock?.release() wakeLock?.acquire(timeout) Log.d(TAG, "WakeLock acquired (timeout=${timeout}ms)") } private fun releaseWakeLock() { if (wakeLock?.isHeld == true) { wakeLock?.release() Log.d(TAG, "WakeLock released") } } }