package nl.eddydevink.buschauffeurswekker.receivers import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.os.PowerManager import nl.eddydevink.buschauffeurswekker.AlarmActivity import nl.eddydevink.buschauffeurswekker.core.AlarmScheduler import nl.eddydevink.buschauffeurswekker.core.Notifier /** Afgaande wekker: toont de alarmactivity (via full-screen intent) en houdt het scherm wakker. */ class AlarmRingReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val name = intent.getStringExtra(AlarmScheduler.EXTRA_NAME) ?: "Wekker" val ringTime = intent.getLongExtra(AlarmScheduler.EXTRA_RING_TIME, System.currentTimeMillis()) val snoozed = intent.getBooleanExtra(AlarmScheduler.EXTRA_SNOOZED, false) // Wakkere CPU houden tot de alarmactivity het overneemt. val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager @Suppress("DEPRECATION") val wakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "buschauffeurswekker:ring") wakelock.acquire(RING_WAKELOCK_MS) heldWakelock?.release() heldWakelock = wakelock val alarmIntent = Intent(context, AlarmActivity::class.java) .putExtra(AlarmScheduler.EXTRA_NAME, name) .putExtra(AlarmScheduler.EXTRA_RING_TIME, ringTime) .putExtra(AlarmScheduler.EXTRA_SNOOZED, snoozed) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP) // Full-screen intent: het systeem toont de activity bovenop het vergrendelscherm. val fullScreenPi = PendingIntent.getActivity( context, name.hashCode(), alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) Notifier.showAlarm(context, name, ringTime, fullScreenPi) // Directe start als het mag (scherm aan/niet vergrendeld); anders neemt de // full-screen intent het over. runCatching { context.startActivity(alarmIntent) } } companion object { private const val RING_WAKELOCK_MS = 10 * 60 * 1000L /** Wordt door AlarmActivity vrijgegeven zodra de wekker is afgehandeld. */ @Volatile var heldWakelock: PowerManager.WakeLock? = null private set fun releaseHeldWakelock() { heldWakelock?.let { if (it.isHeld) it.release() } heldWakelock = null } } }