Buschauffeurswekker v1: CalDAV-dagcheck 12:00, kwartier-afronding, wekkers Opstaan/Wally/Vertrek, fullscreen alarm-UI
This commit is contained in:
parent
97b7d3090e
commit
34505be9b8
31 changed files with 1881 additions and 1 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue