All checks were successful
CI / ci (pull_request) Successful in 7m51s
Calendula didn't declare the intent filters launchers and the system use for calendar actions, so it never appeared in the "default calendar app" chooser — on every platform, not just GrapheneOS (issue #9). Android exposes no API for an app to set itself default, so registering these filters is the only way users can pick it from the system picker. Adds to MainActivity: - MAIN + APP_CALENDAR — the "open the calendar app" action the OS/launchers use. - VIEW on content://com.android.calendar/time/<epochMillis> and the time/epoch mime type — a launcher/clock date tap. The provider's time Uri is parsed into a LocalDate and opened on the day view, rooted over the default home view (a new sourceless WidgetNavRequest.OpenDate). The .ics import path now ignores the calendar provider host so a date tap isn't mistaken for a file to import. Bumps to 2.11.1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
35 lines
1.5 KiB
Kotlin
35 lines
1.5 KiB
Kotlin
package de.jeanlucmakiola.calendula.ui
|
|
|
|
import de.jeanlucmakiola.calendula.ui.common.CalendarView
|
|
|
|
/**
|
|
* A navigation a home-screen widget asked the app to perform when launched.
|
|
* Parsed from the launch intent in MainActivity and consumed once by
|
|
* [CalendarHost]. Every request carries the [source] view of the widget it came
|
|
* from (the agenda widget → [CalendarView.Agenda], the month widget →
|
|
* [CalendarView.Month]) so the in-app back stack roots itself in that view:
|
|
* backing out of the opened date/event returns to the widget's own view, not the
|
|
* default home. (Reminder notifications are not widgets — they keep the separate
|
|
* detail-key channel and leave the base view untouched.)
|
|
*/
|
|
sealed interface WidgetNavRequest {
|
|
/**
|
|
* Open the day view anchored on [dateIso] (an ISO `yyyy-MM-dd` date), over
|
|
* [source]. A null [source] means the request came from outside the app (a
|
|
* launcher/clock date tap, issue #9) rather than a widget, so it roots over
|
|
* the default home view instead of a widget's view.
|
|
*/
|
|
data class OpenDate(val dateIso: String, val source: CalendarView?) : WidgetNavRequest
|
|
|
|
/** Open one occurrence's detail (an agenda-widget event tap), over [source]. */
|
|
data class OpenEvent(
|
|
val eventId: Long,
|
|
val beginMillis: Long,
|
|
val endMillis: Long,
|
|
val source: CalendarView,
|
|
) : WidgetNavRequest
|
|
|
|
/** Open the create-event form prefilled for [dateIso] (today when null). */
|
|
data class Create(val dateIso: String?) : WidgetNavRequest
|
|
}
|