InputDelegate separates hardware KEY_ENTER (opens item) from
screen onTap (rotates to tapped icon). Fixes tap always opening
instead of rotating.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Tap on non-selected icon rotates instead of opening, flag
prevents onSelect from double-firing
- GpsService.stop() for clean cancellation
- LoadingView stops GPS on hide (BACK button)
- LoadingDelegate allows BACK to cancel GPS acquisition
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tapping an unselected icon in the menu ring rotates to it with
animation. Tapping the already-selected icon opens it. Icon
positions are tracked from last render for hit detection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
200ms ease-out animation when scrolling through icons.
Selected icon grows smoothly, previous shrinks. Accent ring
and label appear after animation completes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace placeholder SVG icons with custom PNG icons (80x80 padded)
- AffineTransform for pixel-perfect icon centering in menu ring
- Colored circles behind icons with icon drawn at 60% size
- GPS: always wait full timeout (30s), keep best quality fix
- History: show address, PLZ+city, coordinates on separate lines
- Geocoding: fall back to "name" field for street-level results,
include PLZ+city in cached address data
- Address distance threshold raised to 70m
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
App type changed to widget for glance support. GlanceView shows
event type, date/time, and street+housenumber (or coordinates as
fallback). Addresses are cached in Event storage on first view in
history. Glance-required modules annotated with (:glance). Address
distance threshold raised to 70m.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two-step delete: navigate to "Letzten löschen", press START/STOP
to open confirmation, press again to start 2.5s red arc countdown.
BACK cancels at any point. Currently uses click-to-start instead
of press-and-hold due to simulator key event limitations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3-section layout (15/70/15) for browsing recorded events.
Reverse-geocodes coordinates via Photon API with Haversine
distance check and address caching. Also adds simulator GPS
polling fallback (Position.getInfo) since the simulator does
not fire location event callbacks.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GpsService runs a single-shot position request with a hard timeout
and early-exit when Config.GPS_TARGET_ACCURACY_M is reached.
LoadingView renders a circular progress bar around the edge plus the
"Standort wird bestimmt" prompt; on callback it persists a new Event
via EventStore.add and transitions to SuccessView (green checkmark,
short vibration, auto-close) or ErrorView (red alert, 3× vibration,
German message, longer hold). TextUtils extracts the shared
multi-line centered text rendering so MenuView, LoadingView and
ErrorView all render wrapped German text consistently. Positioning
permission added to manifest.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rotating ring modeled after the watch Controls menu: UP/DOWN spin,
START/STOP selects. Selection point sits at −30° (≈ 2 o'clock) so it
lines up with the physical enter button on 5-button round Garmins.
Icons are rasterized at 80×80 with automaticPalette="false" and
scaled via drawBitmap2 to stay crisp at any display resolution. Long
German compounds ("Einsatzbeginn", "Beweismittel", "Letzten löschen")
wrap to two lines via a Config array so the center label never
overlaps the surrounding icons. Selected index is persisted in
Application.Storage and restored on next launch.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Central Config with all tunables (retention, GPS timeout, colors,
event type keys, menu item metadata). Event / EventStore handle
persistence via Application.Storage with 7-day pruning. Logger
mirrors the same retention. LayoutMetrics and Haversine provide
resolution-independent geometry helpers. German UI strings and
placeholder menu icons landed alongside so the build stays green.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Verifies the toolchain: builds and runs on fenix7 simulator and
Forerunner 265 hardware. No features yet — empty view rendering
"Einsatzprotokoll" on black background.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>