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>
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>