# Private QR Scanner (MVP) Offline-first, ad-free QR/barcode scanner built with Kotlin, Jetpack Compose, CameraX, and on-device ML Kit. ## Platform Assumption - Android mobile app first (phone/tablet). - Prefer Android-compatible libraries and APIs for parsing/integration decisions. ## Architektur - `ui/`: Compose screens/components + ViewModels (MVVM) - `ui/screens/ScannerScreen.kt`: Scanner-Orchestrierung (Camera, Overlay, Actions, Bottom Sheet) - `ui/screens/ScannerResultCards.kt`: strukturierte Ergebnis-Visualisierung (inkl. Kontaktkarten) - `ui/screens/ScannerGalleryPreviewDialog.kt`: Bild-Scan-Vorschau mit Zoom/Pan + Live-Re-Detection - `ui/screens/ScannerOverlayComponents.kt`: Overlay-Toggles, Batch-Panel, Permission-Content - `ui/screens/BarcodeTypeMapper.kt`: ML-Kit `valueType` -> lesbarer Typ - `data/`: ML Kit analyzer, Room entities/DAO, repository - `domain/`: app models (`ScanResult`, `ScanRecord`, `UrlRiskResult`) - `settings/`: DataStore preferences (history + warnings toggles) - `util/`: URL risk scoring, clipboard, intents, content parser (`vCard`/`MECARD`/`WIFI`/`VEVENT`) ## Datenschutz - Keine Werbung - Keine Tracker/Analytics/Crashlytics - Kein Backend, keine Servercalls - Keine `INTERNET`-Permission im Manifest ## MVP Features - Home: Scan-Button, lokaler Historie-Toggle (Default: OFF), Datenschutz-Dialog - Scanner: CameraX Live-Preview, Fadenkreuz-Overlay, Taschenlampe, Debounce gegen Doppelscans, Live-Hinweise zu erkannten/lesbaren Codes - Bild-Scan: Multi-Code-Erkennung aus einem Bild mit Ergebnis-Auswahl - Ergebnis-Bottom-Sheet: strukturierte Anzeige + Copy/Share/Open/Scan again + kontextspezifische Aktionen - Kontakt-Workflows: vCard/MECARD parsen, visuelle Kontaktkarte, "Zu Kontakten hinzufügen" - Office/Admin-Workflows: Wi-Fi QR parsen + Einstellungen öffnen, Kalender-QR parsen + Event anlegen - URL-Sicherheitswarnung bei lokalem `riskScore >= 3` (kein Blocken, nur Hinweis) - Historie: Suche, Swipe-to-delete, Alles-löschen, Detailansicht mit Volltext - Einstellungen: Historie an/aus (mit optionalem Löschen), Warnungen an/aus, About-Infos ## Voraussetzungen - Android Studio (aktuell stabil) - JDK 17+ - Android SDK für `compileSdk = 35` ## Build & Run 1. Projekt in Android Studio öffnen. 2. Gradle Sync ausführen. 3. App auf Emulator/Device (API 24+) starten. CLI: ```bash ./gradlew :app:assembleDebug ./gradlew :app:installDebug ``` ## Tests - Unit tests: ```bash ./gradlew testDebugUnitTest ``` - Wichtige Test-Suites: - `app/src/test/java/com/clean/scanner/util/ScanContentParsersTest.kt` - `app/src/test/java/com/clean/scanner/util/HistoryExportFormatterTest.kt` - `app/src/test/java/com/clean/scanner/util/UrlRiskScorerTest.kt` - `app/src/test/java/com/clean/scanner/ui/ScannerViewModelTest.kt` - `app/src/androidTest/java/com/clean/scanner/util/IntentsTest.kt`