# Clean Scanner (MVP) Offline-first, ad-free QR/barcode scanner built with Kotlin, Jetpack Compose, CameraX, and on-device ML Kit. ## Architektur - `ui/`: Compose screens/components + ViewModels (MVVM) - `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 ## 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 - Ergebnis-Bottom-Sheet: Typ/Inhalt + Copy/Share/Open/Scan again - 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 ``` - URL-Risk-Scorer tests: `app/src/test/java/com/clean/scanner/util/UrlRiskScorerTest.kt`