3212fe2c6ac314515745017982f64fd83637de30
Mirror the iOS Contacts birthday importer: read the address book's birthday events and reconcile them into the user's birthday calendar, scoped to this device via external_uid 'contact:<deviceId>:<contactId>' (add/update/delete), then report the device. - READ_CONTACTS permission + ContactsReader (Event TYPE_BIRTHDAY, handles year/no-year date formats) - API: GET /birthdays, POST /birthdays/sync-report; local-event create/update now carry external_uid (+ update carries rrule/birth_year) - CalendarViewModel.syncContactBirthdays reconciles like iOS; device-local enable flag + stable device id in SettingsStore - birthday dialog gains an 'Import from contacts' action (requests permission); auto-syncs on launch when enabled Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Description
Languages
Kotlin
100%