feat: per-event time zones (#31) #82
Reference in New Issue
Block a user
Delete Branch "feat/timezone-support"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements #31 — per-event time zones (2.16.0 milestone), plus the review fixes and on-device refinements that followed.
What it does
Notable correctness work
EVENT_TIMEZONEto the device (drift at the next DST boundary); a zone-only change wasn't intimesChangedsoDTSTARTwasn't rewritten. Both covered by tests.en-DEphone showed "GMT-4" for US zones; asking in the display language + the zone's region (viaandroid.icu, injected sodomain/stays pure-JVM) lights up EDT/PDT/BST/AEST/IST/JST. Verified on-device.Dependency
CollapsingScaffold'sscrollableopt-out, needed for the ~600-row lazy picker). Tagged and on kitmain.Testing
lint test assembleDebuggreen; new JVM tests forTimeZoneCatalog(region/DST/search) and the write/edit-form paths.Incidental
CalendarRepositorySmokeTest, which didn't compile against the currentCalendarRepositoryImplconstructor (blocked the whole androidTest source set; likely still broken onmain).Changelog updated (
CHANGELOG.md+ fastlane21600.txt).🤖 Generated with Claude Code
Two review fixes. The zone picker's search box was a raw Material OutlinedTextField — the only one left in the app, and against the convention DialogControls states outright ("the family's InlineTextField over a tonal surface, not Material's outlined field"). Rebuild it on InlineTextField over a tonal surface, with the clear button inside the surface since the picker's top bar is the title rather than a search field. Showing a pinned event only in its own zone answered "what was it set to?" while dropping "when is it for me?" — the user had to do the offset arithmetic. Show both whenever they differ: - the edit form keeps editing the event in its own zone (that's the time it was set at) and captions it with the local equivalent; - the detail screen keeps local times primary and now leads the zone card with the original ("8:00 AM – 9:00 AM in New York") instead of naming the zone and nothing else. EventForm.timesIn is pure, so the conversion — including crossing the date line and each zone's own DST, which don't move together — is a plain JUnit test rather than something only reviewable on a phone. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"Central European Time (Europe/Berlin)" is too wide — it made the zone field wrap and stretch. Lead with the id ("Europe/Berlin") and follow it with the abbreviation instead: "CEST · GMT+02:00" in the picker and edit card, "CET · 8:00 AM – 9:00 AM" on the detail card (abbreviation + the event's own-zone time). The abbreviation is resolved DST-aware at the same instant as the offset (CET vs CEST) via "zzz"; zones with no named abbreviation fall back to a "GMT+05:30" form, and zoneDescriptor drops the separate offset in that case so it isn't stated twice. The long localized name is kept on the option for search only — typing "pacific" still works — but no longer shown. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>