Phase 1: foundation modules

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>
This commit is contained in:
EiSiMo 2026-04-11 19:36:15 +02:00
parent 6f56c337f7
commit 43f970d764
19 changed files with 409 additions and 2 deletions

View file

@ -1,3 +1,13 @@
<drawables>
<bitmap id="LauncherIcon" filename="launcher_icon.svg"/>
<bitmap id="LauncherIcon" filename="launcher_icon.svg"/>
<bitmap id="IconHistory" filename="icon_history.svg"/>
<bitmap id="IconEvent" filename="icon_event.svg"/>
<bitmap id="IconStart" filename="icon_start.svg"/>
<bitmap id="IconEnd" filename="icon_end.svg"/>
<bitmap id="IconArrival" filename="icon_arrival.svg"/>
<bitmap id="IconArrest" filename="icon_arrest.svg"/>
<bitmap id="IconForce" filename="icon_force.svg"/>
<bitmap id="IconEvidence" filename="icon_evidence.svg"/>
<bitmap id="IconSighting" filename="icon_sighting.svg"/>
<bitmap id="IconDelete" filename="icon_delete.svg"/>
</drawables>

View file

@ -0,0 +1,6 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#FF0088"/>
<circle cx="13" cy="20" r="6" fill="none" stroke="#000000" stroke-width="3"/>
<circle cx="27" cy="20" r="6" fill="none" stroke="#000000" stroke-width="3"/>
<rect x="18" y="18" width="4" height="4" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 361 B

View file

@ -0,0 +1,5 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#FFDD00"/>
<path d="M20 8 C14 8 10 12 10 18 C10 24 20 32 20 32 C20 32 30 24 30 18 C30 12 26 8 20 8 Z" fill="#000000"/>
<circle cx="20" cy="18" r="4" fill="#FFDD00"/>
</svg>

After

Width:  |  Height:  |  Size: 300 B

View file

@ -0,0 +1,9 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#FF2222"/>
<rect x="11" y="14" width="18" height="3" fill="#000000"/>
<rect x="17" y="10" width="6" height="3" fill="#000000"/>
<rect x="12" y="17" width="16" height="14" rx="1" fill="#000000"/>
<rect x="16" y="20" width="2" height="8" fill="#FF2222"/>
<rect x="19" y="20" width="2" height="8" fill="#FF2222"/>
<rect x="22" y="20" width="2" height="8" fill="#FF2222"/>
</svg>

After

Width:  |  Height:  |  Size: 511 B

View file

@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#00AAFF"/>
<polyline points="11,21 18,28 30,14" stroke="#000000" stroke-width="4" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 275 B

View file

@ -0,0 +1,5 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#FFAA00"/>
<rect x="18" y="10" width="4" height="20" fill="#000000"/>
<rect x="10" y="18" width="20" height="4" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 263 B

View file

@ -0,0 +1,7 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#00E5E5"/>
<rect x="8" y="14" width="24" height="16" rx="2" fill="#000000"/>
<rect x="15" y="11" width="10" height="4" fill="#000000"/>
<circle cx="20" cy="22" r="5" fill="#00E5E5"/>
<circle cx="20" cy="22" r="2" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 368 B

View file

@ -0,0 +1,7 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#AA00FF"/>
<rect x="11" y="14" width="18" height="14" rx="2" fill="#000000"/>
<rect x="13" y="11" width="3" height="6" fill="#000000"/>
<rect x="18" y="11" width="3" height="6" fill="#000000"/>
<rect x="23" y="11" width="3" height="6" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 390 B

View file

@ -0,0 +1,9 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#FFFFFF"/>
<circle cx="11" cy="13" r="1.5" fill="#000000"/>
<rect x="15" y="12" width="14" height="2" fill="#000000"/>
<circle cx="11" cy="20" r="1.5" fill="#000000"/>
<rect x="15" y="19" width="14" height="2" fill="#000000"/>
<circle cx="11" cy="27" r="1.5" fill="#000000"/>
<rect x="15" y="26" width="14" height="2" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 477 B

View file

@ -0,0 +1,8 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#FF8800"/>
<circle cx="13" cy="22" r="6" fill="#000000"/>
<circle cx="27" cy="22" r="6" fill="#000000"/>
<rect x="13" y="12" width="14" height="4" fill="#000000"/>
<circle cx="13" cy="22" r="2" fill="#FF8800"/>
<circle cx="27" cy="22" r="2" fill="#FF8800"/>
</svg>

After

Width:  |  Height:  |  Size: 398 B

View file

@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" fill="#00CC33"/>
<polygon points="15,10 30,20 15,30" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 196 B

View file

@ -1,3 +1,31 @@
<strings>
<string id="AppName">Einsatzprotokoll</string>
<!-- Menu labels -->
<string id="menu_history">Verlauf</string>
<string id="menu_general">Ereignis</string>
<string id="menu_start">Einsatzbeginn</string>
<string id="menu_end">Einsatzende</string>
<string id="menu_arrival">Eintreffen</string>
<string id="menu_arrest">Festnahme</string>
<string id="menu_force">Zwanganwendung</string>
<string id="menu_evidence">Beweismittel</string>
<string id="menu_sighting">Sichtung</string>
<string id="menu_delete">Letzten löschen</string>
<!-- Loading / result screens -->
<string id="loading_gps">Standort wird bestimmt</string>
<string id="error_gps">Standort konnte nicht bestimmt werden</string>
<string id="error_generic">Fehler beim Speichern</string>
<!-- History -->
<string id="history_empty">Keine Einträge</string>
<string id="history_loading_address">Adresse wird geladen…</string>
<string id="history_no_phone">Verbinde Handy für Adresse</string>
<!-- Delete -->
<string id="delete_hold">Halten zum Löschen</string>
<!-- Glance -->
<string id="glance_no_entries">Keine Einträge</string>
</strings>