024512959f1a0762da85a22539b3b2493ac29315
Round out the read-only model so the detail view shows everything CalendarContract actually stores, ahead of write support. Data layer: - New domain types: Reminder, EventStatus, Availability, AccessLevel, AttendeeRelationship, AttendeeType; EventDetail gains reminders, status, availability, accessLevel, eventTimezone, selfStatus and Attendee gains relationship + type (all defaulted so existing callers compile) - EventDetailProjection reads STATUS / AVAILABILITY / ACCESS_LEVEL / EVENT_TIMEZONE / SELF_ATTENDEE_STATUS; AttendeeProjection reads RELATIONSHIP + TYPE; new ReminderProjection queries CalendarContract.Reminders - Mappers translate each provider integer code, guarding STATUS's null-vs-0 ambiguity (0 == TENTATIVE) so an absent status reads as Confirmed - Mapper unit tests cover every new column's codes Detail UI: - Status / availability / access chips under the title; cancelled also strikes the title through - Reminders card with humanised lead times (plurals, DE + EN) - Foreign-timezone card, shown only for timed events in a non-device zone - Attendee role badges + the user's own "Your response: …" line - http(s) URLs in the description are now tappable URL field cut: CalendarContract exposes no Events.URL column (only the CUSTOM_APP_URI app deep-link), so URLs are surfaced by linkifying the description instead. Recorded in ROADMAP/CHANGELOG. Version bumped to 0.6.0 / 6. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Calendula
A modern Material 3 Expressive calendar app for Android.
Calendula is named after the flower of the same name, whose name comes from
the Latin kalendae — the first day of the month — the same root as the
word "calendar". Calendula reads from Android's built-in CalendarContract,
so any calendar source synced to your device (CalDAV via DAVx5, Google,
local, WebCal subscriptions, ...) is shown.
Features (V1)
- Month, Week, and Day views
- Read-only event details (write support comes in V2)
- Multi-calendar visibility toggle
- Material You Dynamic Color (Android 12+)
- Light/Dark theme follows system
- German + English UI
Building
Requires Android SDK 36 and JDK 17. The Gradle wrapper is checked in, so no host Gradle install is needed:
# Build debug APK
./gradlew assembleDebug
# Run unit tests
./gradlew test
# Run lint
./gradlew lint
If your default JDK is something other than 17, set JAVA_HOME explicitly:
JAVA_HOME=/path/to/jdk-17 ./gradlew assembleDebug
License
MIT — Jean-Luc Makiola, 2026