package no.naiv.meddetsamme.alarm import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import no.naiv.meddetsamme.domain.DoseActions /** * Handles the notification actions (and later, the same actions from the UI). * * Contract (CLAUDE.md, load-bearing): * - Taken → TAKEN, decrement inventory by the *logged* amount, stop escalating. * - Snooze → SNOOZED, next nag in 15 min, keeps escalating (and counting) after. * - Skip → SKIPPED, stop escalating, no inventory change. */ class DoseActionReceiver : BroadcastReceiver() { companion object { const val ACTION_TAKEN = "no.naiv.meddetsamme.action.TAKEN" const val ACTION_SNOOZE = "no.naiv.meddetsamme.action.SNOOZE" const val ACTION_SKIP = "no.naiv.meddetsamme.action.SKIP" const val EXTRA_LOG_ID = "logId" } override fun onReceive(context: Context, intent: Intent) { val logId = intent.getLongExtra(EXTRA_LOG_ID, -1) if (logId < 0) return val action = intent.action ?: return val pending = goAsync() CoroutineScope(Dispatchers.IO).launch { try { handle(context, action, logId) } finally { pending.finish() } } } private suspend fun handle(context: Context, action: String, logId: Long) { val actions = DoseActions(context) when (action) { ACTION_TAKEN -> actions.take(logId) ACTION_SNOOZE -> actions.snooze(logId) ACTION_SKIP -> actions.skip(logId) } } }