No locking (plan 03, decision 5): openForEdit keeps an EditSnapshot — the prefilled form plus the raw Events-row times, which the form itself can't see (it derives its times from the tapped occurrence, so an externally moved event would otherwise stay invisible). Right before writing, performSave re-reads the event and compares snapshots: a mismatch parks the save in SaveUiState.AwaitingConflict carrying the already-chosen recurring scope, and the dialog offers overwrite / discard / cancel (OptionCard style). Overwrite still writes only dirty fields, so external changes to untouched fields survive either way. A deleted event lands in SaveUiState.Gone — an informational dialog that closes form and detail. Fields the form can't write (attendees, status, self response, reminder methods) are excluded from the comparison so sync noise can't fake a conflict. The load-time zone is pinned in the EditTarget so a device timezone change mid-edit can't either. Store metadata: F-Droid descriptions (DE+EN) and the README stop claiming read-only and now describe write support and reminder delivery. New fastlane phoneScreenshots (6 per locale: week/month/day/detail/form/ reminder onboarding), captured on-device against demo-only calendars. Tests: EditSnapshot equality (unchanged event, field change, row-time move the form can't see, non-writable changes stay quiet). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
16 lines
784 B
Plaintext
16 lines
784 B
Plaintext
Calendula is a modern, open-source calendar app for Android. It works
|
|
directly on the system calendar provider, so any source synced to your
|
|
device — Nextcloud via DAVx5, Google, local, WebCal subscriptions — shows up
|
|
automatically, and changes you make sync back the same way.
|
|
|
|
Create, edit and delete events, including recurring events with scoped
|
|
changes (only this event / this and all following / the whole series) and a
|
|
simple repeat picker. Calendula also delivers your event reminders as
|
|
notifications — tap one and you're on the event.
|
|
|
|
The differentiator is the design: real Material 3 Expressive throughout,
|
|
with dynamic color, expressive motion, and expressive shapes.
|
|
|
|
Privacy: zero telemetry, no analytics, no network access — your data never
|
|
leaves the device.
|