From 7648aa6ce86401f91d5c7ce97b72fe995bbcee36 Mon Sep 17 00:00:00 2001 From: eddy Date: Wed, 14 Oct 2026 20:42:08 +0200 Subject: [PATCH] Aan/uit-schakelaar per wekker (blijvend); uitgezette wekkers worden niet gepland --- .../buschauffeurswekker/MainActivity.kt | 35 +++++++++--- .../buschauffeurswekker/core/Prefs.kt | 17 ++++++ .../buschauffeurswekker/core/ShiftCheck.kt | 8 ++- app/src/main/res/layout/item_alarm_card.xml | 54 ++++++++++++------- 4 files changed, 85 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/nl/eddydevink/buschauffeurswekker/MainActivity.kt b/app/src/main/java/nl/eddydevink/buschauffeurswekker/MainActivity.kt index 51e23eb..e114fe7 100644 --- a/app/src/main/java/nl/eddydevink/buschauffeurswekker/MainActivity.kt +++ b/app/src/main/java/nl/eddydevink/buschauffeurswekker/MainActivity.kt @@ -9,6 +9,7 @@ import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout import android.widget.PopupMenu +import android.widget.Switch import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -120,13 +121,20 @@ class MainActivity : AppCompatActivity() { else -> "Gepland" } alarms.forEach { spec -> - container.addView( - inflater.inflate(R.layout.item_alarm_card, container, false).apply { - findViewById(R.id.tv_day).text = dayLabel - findViewById(R.id.tv_name).text = spec.name - findViewById(R.id.tv_time).text = TIME.format(spec.time) - }, - ) + val disabled = prefs.isDisabled(spec.name) + val card = inflater.inflate(R.layout.item_alarm_card, container, false) + card.findViewById(R.id.tv_day).text = dayLabel + card.findViewById(R.id.tv_name).text = spec.name + card.findViewById(R.id.tv_time).text = TIME.format(spec.time) + val switch = card.findViewById(R.id.switch_alarm) + switch.setOnCheckedChangeListener(null) + switch.isChecked = !disabled + card.alpha = if (disabled) 0.5f else 1f + switch.setOnCheckedChangeListener { _, checked -> + toggleAlarm(spec, checked) + renderStatus() + } + container.addView(card) } } @@ -156,6 +164,19 @@ class MainActivity : AppCompatActivity() { } } + /** Zet een wekker aan/uit: plan/cancel het alarm morgen en onthoud de keuze. */ + private fun toggleAlarm(spec: AlarmSpec, enabled: Boolean) { + if (enabled) { + prefs.enable(spec.name) + AlarmScheduler.scheduleAlarm(this, spec) + toast("${spec.name} ingeschakeld") + } else { + prefs.disable(spec.name) + AlarmScheduler.cancelAlarm(this, spec.name) + toast("${spec.name} uitgeschakeld") + } + } + private fun requestNotificationPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != diff --git a/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/Prefs.kt b/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/Prefs.kt index 3a5aa9f..5488c01 100644 --- a/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/Prefs.kt +++ b/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/Prefs.kt @@ -94,6 +94,22 @@ class Prefs(context: Context) { sp.edit().putString("ringtone_$name", uri?.toString()).apply() } + /** Wekkers die de gebruiker heeft uitgezet (blijvend, tot weer aangezet). */ + var disabledAlarms: Set + get() = sp.getString(KEY_DISABLED, "")?.split("|")?.filter { it.isNotEmpty() }?.toSet() + ?: emptySet() + private set(value) = sp.edit().putString(KEY_DISABLED, value.joinToString("|")).apply() + + fun isDisabled(name: String): Boolean = name in disabledAlarms + + fun disable(name: String) { + disabledAlarms = disabledAlarms + name + } + + fun enable(name: String) { + disabledAlarms = disabledAlarms - name + } + fun storePlan(day: LocalDate, alarms: List) { val zone = ZoneId.systemDefault() plannedDayIso = day.toString() @@ -131,5 +147,6 @@ class Prefs(context: Context) { const val KEY_PLAN_DAY = "plan_day" const val KEY_PLAN_ALARMS = "plan_alarms" const val KEY_SHIFT_START = "shift_start" + const val KEY_DISABLED = "disabled_alarms" } } \ No newline at end of file diff --git a/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/ShiftCheck.kt b/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/ShiftCheck.kt index 5e7a1d8..3c1cada 100644 --- a/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/ShiftCheck.kt +++ b/app/src/main/java/nl/eddydevink/buschauffeurswekker/core/ShiftCheck.kt @@ -66,9 +66,13 @@ object ShiftCheck { val shiftStart = starts.minOrNull()!! prefs.lastShiftStartIso = shiftStart.toString() val plan = ShiftPlanner.plan(shiftStart) - plan.forEach { AlarmScheduler.scheduleAlarm(context, it) } + // Volledig plan bewaren voor de weergave; alleen aangezette wekkers plannen. prefs.storePlan(tomorrow, plan) - val times = plan.joinToString(" · ") { "${it.name} ${DISPLAY.format(it.time)}" } + val disabled = prefs.disabledAlarms + plan.filter { it.name !in disabled }.forEach { AlarmScheduler.scheduleAlarm(context, it) } + plan.filter { it.name in disabled }.forEach { AlarmScheduler.cancelAlarm(context, it.name) } + val active = plan.filter { it.name !in disabled } + val times = active.joinToString(" · ") { "${it.name} ${DISPLAY.format(it.time)}" } val msg = "Dienst morgen om ${DISPLAY.format(shiftStart)} → $times" prefs.lastStatusTxt = msg prefs.lastCheckedAtMillis = System.currentTimeMillis() diff --git a/app/src/main/res/layout/item_alarm_card.xml b/app/src/main/res/layout/item_alarm_card.xml index a5a3c7f..80a34b0 100644 --- a/app/src/main/res/layout/item_alarm_card.xml +++ b/app/src/main/res/layout/item_alarm_card.xml @@ -13,38 +13,52 @@ + android:layout_weight="1" + android:orientation="vertical"> - + + + + + + + - - - + android:contentDescription="Wekker aan of uit" /> \ No newline at end of file