Files
patrickandClaude Sonnet 5 c8d9480cf9
CI / backend-tests (push) Successful in 3m17s
CI / frontend-build (push) Successful in 22s
perf(mangel): Foto-Kompression vor Upload in beiden Clients ergänzt
PWA lud Mangel-Fotos bislang komplett unkomprimiert hoch (rohes File aus
capture-Input) - Canvas-basierte Verkleinerung/Neukodierung (max. 1600px,
JPEG q0.7) vor dem Enqueue ergänzt. Flutter-Client nutzte nur imageQuality
(reine JPEG-Kompression ohne Auflösungs-Downscale) - maxWidth/maxHeight
ergänzt. Beides zahlt sich bei schlechter Feld-Verbindung aus.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDMvneg6wKfXdXvTYNd3dN
2026-09-12 22:23:31 +02:00
..

MABEA Android-App (Flutter) – erstes Grundgerüst

Zweiter Client derselben API (Prompt 19 API-first-Prinzip) neben der React-PWA (frontend/). Deckt Login, Objektliste, Kontroll-Screen (Start/Sperre-Übernahme/ Positionen/Abschluss/Abbruch) sowie eine Offline-Queue (Prompt 17-Härtung, lib/offline/queue.dart, sqflite) ab.

Wichtig: Plattform-Ordner fehlen noch

Dieses Verzeichnis enthält nur lib/, pubspec.yaml, analysis_options.yaml - die von flutter create generierten Plattform-Ordner (android/, ios/, Gradle- Konfiguration etc.) wurden bewusst NICHT von Hand nachgebaut, da das ohne Testlauf zu fehleranfällig wäre. Erstinbetriebnahme auf dem Zielsystem (mit Flutter-SDK installiert):

cd flutter_app
flutter create . --platforms android --org de.perlbach24 --project-name mabea_app
# überschreibt pubspec.yaml NICHT automatisch mit *nix cp -n, ggf. lib/-Inhalt
# und pubspec.yaml-Dependencies danach gegen diese Version abgleichen
flutter pub get
flutter build apk

API-Adresse

lib/main.dart: kApiBaseUrl ist aktuell fest auf den Deployment-Server (192.168.1.238) gesetzt. Für Produktivbetrieb auf --dart-define umstellen oder zumindest vor jedem Build prüfen/anpassen.

Kamera-Berechtigung (Kamera-Scan, Karte 10; Mangel-Foto, MOBILE-004)

mobile_scanner (QR-Scan) UND image_picker (Mangel-Foto) brauchen die Kamera- Berechtigung im generierten android/-Ordner (existiert erst nach flutter create ., siehe oben) - nach dem Erstlauf einmalig in android/app/src/main/AndroidManifest.xml ergänzen, oberhalb von <application>:

<uses-permission android:name="android.permission.CAMERA" />

Für iOS entsprechend in ios/Runner/Info.plist:

<key>NSCameraUsageDescription</key>
<string>Wird zum Scannen von Objekt-/Geräte-Codes benötigt.</string>

Offline-Queue (Prompt 17-Härtung)

lib/offline/queue.dart: Positionen werden lokal in sqflite zwischengespeichert (enqueue), Status je Eintrag (wartet/wird_uebertragen/fehler), Sync bei Reconnect (connectivity_plus) und periodisch alle 15s - gleiches Muster wie frontend/src/offline/queue.ts (IndexedDB), nur die lokale DB ist anders. KontrollScreen gleicht per 2s-Reconciliation-Loop den Anzeigezustand mit der Queue ab, Abschluss ist gesperrt, solange Einträge offen sind.

Tests

flutter test

http.Client ist per Konstruktor injizierbar (ApiClient(httpClient: ...)), Tests mocken ihn mit mocktail statt echten Netzwerkaufrufen - kein Server/Emulator nötig. test/offline_queue_test.dart nutzt sqflite_common_ffi (reines Dart, keine Plattform-Channels), um die sqflite-Queue ohne Gerät/Emulator zu testen. Deckt ab: ApiClient (Login, Token-Header, Fehlerfälle), Offline-Queue (Erfolg/Netzwerkfehler/ 4xx-kein-Retry), Login-Screen und Objektliste-Suche als Widget-Tests.