61 lines
No EOL
2.5 KiB
Kotlin
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
|
|
}
|
|
}
|
|
} |