Fix GitHub sync not pushing task status changes to GitHub issues
Details
PushTaskAsync existed but was never called when tasks were updated locally.
Added an OnTaskUpdated callback to TaskService that fires after every
UpdateTask call. TasksPlugin subscribes to it during init and triggers
a background push for any GitHub-linked task (bidirectional sources only).
Includes a re-entrancy guard since PushTaskAsync itself calls UpdateTask
to save the updated SourceEtag.
Fix CalDAV sync token loss and conflict handling
Details
Two critical bugs that caused local edits to be overwritten by server:
1. Sync token was lost after every sync cycle. PullFromCalDavAsync
saved the token to the subscription, but SyncCalDavSubscriptionAsync
then called UpdateSubscriptionAsync with the original (stale) sub
object, overwriting the token with null. This forced a full fetch
on every sync, increasing the chance of overwrites. Fixed by
re-reading the subscription after pull/push before updating
LastSyncedAt.
2. On 412 Conflict (ETag mismatch), the push silently discarded the
local change by resetting SyncState to "synced". Now retries once
by fetching the fresh ETag from the server and re-attempting PUT.
If the retry also fails, keeps pending_push for next cycle.
Also added GetSubscriptionAsync to CalendarService for fresh reads.
Fix CalDAV sync overwriting local edits + add immediate push
Details
Two issues fixed:
1. Drag-and-drop event time changes were not setting SyncState to
"pending_push", so the next sync cycle's pull phase would see
content changes and overwrite the local edit with server data.
2. All CalDAV changes (edit, create, delete) waited up to 15 minutes
for the next scheduled sync to push. Now triggers an immediate
background sync for the affected subscription after any local
CalDAV event modification (save, drag-and-drop, delete).
Fix all-day events appearing on wrong/extra days
Details
Two bugs caused CalDAV all-day events to display on two days instead
of one (e.g., a birthday on Feb 24 showing on both Feb 24 and Feb 25):
1. IcsParserService: DATE-only values (DTSTART;VALUE=DATE:20260224)
were parsed with UTC offset (TimeSpan.Zero). When converted to
local time, midnight UTC shifts to the previous day in western
timezones. Now uses local timezone offset so the date is preserved.
2. CalendarViewModel: EventSpansDate and GetEventsForDate only adjusted
exclusive end dates for non-all-day events. Per RFC 5545, all-day
DTEND is exclusive (20260225 means "up to but not including Feb 25").
Now applies the -1 day adjustment for all-day events too.
Fix CalDAV provider UI: add Google toggle, bind provider commands
Details
The provider buttons in AddSubscriptionOverlay were hardcoded with no
command bindings — selecting iCloud or Google had no effect. This adds:
- Three toggle buttons (Generic/Nextcloud, iCloud, Google) bound to
SetCalDavProviderCommand with active-state highlighting
- Google Account picker (ComboBox) visible only when Google is selected
- Server URL field visible only for Generic provider
- Username/Password fields hidden when Google is selected
- xmlns:sdk namespace for ConnectionInfo DataTemplate
Get notified about new releases