Buschauffeurswekker v1: CalDAV-dagcheck 12:00, kwartier-afronding, wekkers Opstaan/Wally/Vertrek, fullscreen alarm-UI

This commit is contained in:
eddy 2026-10-14 16:31:50 +02:00
commit 34505be9b8
31 changed files with 1881 additions and 1 deletions

View file

@ -0,0 +1,61 @@
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
}
}
}