36 lines
1.3 KiB
Markdown
36 lines
1.3 KiB
Markdown
# Clean Scanner (MVP)
|
|
|
|
Offline-first, ad-free QR/barcode scanner built with Kotlin + Compose + CameraX + ML Kit.
|
|
|
|
## Architektur
|
|
- `ui/`: Compose-Screens + ViewModels (MVVM presentation layer)
|
|
- `data/`: Scanner-Analyzer, Room entities/DAO, Repository
|
|
- `domain/`: app models (`ScanResult`, `ScanRecord`, `UrlRiskResult`)
|
|
- `settings/`: DataStore preferences (history toggle, warnings toggle)
|
|
- `util/`: URL risk scorer, clipboard, intents
|
|
|
|
## Datenschutz
|
|
- Keine Werbung
|
|
- Keine Tracker/Analytics/Crashlytics
|
|
- Kein Backend/keine Webrequests
|
|
- Keine `INTERNET`-Permission im Manifest
|
|
|
|
## MVP Features
|
|
- Startscreen mit Scan-Button und lokalem Historie-Toggle (Default: OFF)
|
|
- Scanner mit CameraX live preview, Taschenlampe, debounce/no double scan
|
|
- Ergebnis-Bottom-Sheet mit Copy/Share/Open/Scan again
|
|
- Lokale URL-Risikoheuristik mit Warn-Dialog ab Score `>= 3`
|
|
- Historie-Liste inkl. Suche, Swipe-delete, Alles-löschen
|
|
- Einstellungen: Historie an/aus, Warnungen an/aus, About
|
|
|
|
## Run
|
|
1. In Android Studio: Open this folder as project.
|
|
2. Let Gradle sync dependencies.
|
|
3. Run app on emulator/device (API 24+).
|
|
|
|
## Tests
|
|
- URL Risk Scorer Tests: `app/src/test/java/com/clean/scanner/util/UrlRiskScorerTest.kt` (11 cases)
|
|
|
|
## Hinweis
|
|
In dieser Umgebung war kein `gradle`/`gradlew` verfügbar, daher konnte ich Builds/Tests hier nicht lokal ausführen.
|