android-buschauffeurswekker/app/src/main/java/nl/eddydevink/buschauffeurswekker/receivers/AlarmRingReceiver.kt

61 lines
No EOL
2.5 KiB
Kotlin

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
}
}
}