- CalendarItem gains recurrenceMasterStart/End/Due, the true unresolved
master date, tracked separately from start/end/due (which hold the
resolved next occurrence for a recurring item). The edit screen now shows
and edits the real master date for recurring items instead of disabling
those fields outright, with a note that the change applies to the whole
series. Verified against a real recurring event on-device.
- New util/ConflictDiff.kt computes exactly which user-editable fields
differ between a local edit and the server's version after a 412. The
conflict dialog is now a per-field mine/theirs picker (with "All
mine"/"All theirs" shortcuts) instead of an all-or-nothing choice.
- Extracted statusLabel() to util/StatusLabels.kt so both the edit screen
and the new conflict diff can share it.
- Two more test files (ConflictDiffTest, extended IcsMapperTest).
- Recurrence picker (Daily/Weekly/Monthly/Yearly, interval, end condition) for
both events and tasks, backed by a real RRULE. Fixes a latent bug from the
prior RRULE-preservation change: editing a recurring item was writing the
resolved *next occurrence* back as the master DTSTART, silently shifting the
whole series forward on every edit - start/end/due are now correctly
read-only for recurring items instead.
- Periodic background sync (WorkManager, ~30 min, network-gated) so widgets
stay fresh without opening the app; auto-refresh on app open too.
- Tasks widget now renders the same parent/child tree as the in-app Tasks
screen (util/TaskTree.kt shared by both) instead of a flat due-date list.
- Conflict resolution: a stale save (HTTP 412) shows both versions and lets
you keep your edit or take theirs, instead of just an error banner.
- First test suite for the project (IcsMapperTest, TaskTreeTest).
One app for both events and tasks, talking directly to Nextcloud's CalDAV
endpoint - no DAVx5, no Google Play Services, no third-party services.
Encrypted at rest (SQLCipher DB, EncryptedSharedPreferences, Keystore-backed
widget state), HTTPS-only networking, home screen widgets, reminders,
subtasks, and full VTODO field support (status/priority/%complete/location/url).