All checks were successful
CI / ci (push) Successful in 12m38s
Release — F-Droid repo + Gitea release / ci (push) Successful in 2m19s
Release — F-Droid repo + Gitea release / build-and-deploy (push) Successful in 10m1s
Release — F-Droid repo + Gitea release / gitea-release (push) Successful in 8s
Bundles the unreleased Tier 2/3 work into one release: - Home-screen widgets (Glance): an "Upcoming" agenda widget and a month-grid widget, both reusing the in-app grouping/layout (groupAgendaDays, layoutMonthWeeks) via a Hilt WidgetEntryPoint, honouring hidden-calendar filters and refreshing on PROVIDER_CHANGED / date rollover. - App shortcut: launcher long-press "New event", routed through the shared WidgetNavRequest.Create channel into the create-event form. - Agenda view and jump-to-date (already merged via #3/#4) are documented here as part of the shipped version. Bumps versionCode 20500 / versionName 2.5.0, moves the CHANGELOG Unreleased section under [2.5.0], updates ROADMAP/STATE, and adds EN+DE strings. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42 lines
1.7 KiB
Kotlin
42 lines
1.7 KiB
Kotlin
package de.jeanlucmakiola.calendula.widget
|
|
|
|
import android.content.BroadcastReceiver
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import androidx.glance.appwidget.updateAll
|
|
import de.jeanlucmakiola.calendula.widget.agenda.AgendaWidget
|
|
import de.jeanlucmakiola.calendula.widget.month.MonthWidget
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.SupervisorJob
|
|
import kotlinx.coroutines.launch
|
|
|
|
/**
|
|
* Redraws both home-screen widgets when their data goes stale. Triggered by:
|
|
* - `PROVIDER_CHANGED` from the calendar provider — fires on any data change,
|
|
* so it covers both the app's own writes and external sync.
|
|
* - `DATE_CHANGED` / `TIME_SET` / `TIMEZONE_CHANGED` — so "today" highlighting
|
|
* and the upcoming window roll over at midnight / on a clock change.
|
|
*
|
|
* Both widgets also carry an `updatePeriodMillis` backstop in their provider
|
|
* XML, and the month widget's refresh button forces an immediate redraw.
|
|
*/
|
|
class WidgetUpdateReceiver : BroadcastReceiver() {
|
|
override fun onReceive(context: Context, intent: Intent) {
|
|
val pending = goAsync()
|
|
val appContext = context.applicationContext
|
|
// Calendar data may have changed (sync / our own write) — drop the cached
|
|
// month window so the widgets reload fresh. Month paging does NOT call
|
|
// this, so arrow taps stay instant.
|
|
invalidateMonthWidgetCache()
|
|
CoroutineScope(SupervisorJob() + Dispatchers.IO).launch {
|
|
try {
|
|
AgendaWidget().updateAll(appContext)
|
|
MonthWidget().updateAll(appContext)
|
|
} finally {
|
|
pending.finish()
|
|
}
|
|
}
|
|
}
|
|
}
|