99 lines
4.6 KiB
Markdown
99 lines
4.6 KiB
Markdown
Du bist ein Senior Android Engineer. Baue eine komplett werbefreie, datensparsame Android-App (“Clean Scanner”) als MVP.
|
|
|
|
Ziele / USP:
|
|
- 100% werbefrei (keine Ad-SDKs, kein Tracking/Analytics, kein Crashlytics).
|
|
- Offline-First QR- & Barcode-Scanner (on-device).
|
|
- Extrem schnell: App öffnen → Kamera → Scan → Ergebnis.
|
|
- Lokale Historie (optional aktivierbar, standardmäßig AUS).
|
|
- Sicherheits-UX: Warnung bei potenziell gefährlichen URLs (z.B. punycode/homograph, IP-URLs, sehr lange/obfuskierte URLs, http statt https, verdächtige TLDs nur als Heuristik; keine Blockade, nur Warnhinweis).
|
|
- Keine Accounts, kein Backend, keine Cloud.
|
|
|
|
Tech-Stack / Vorgaben:
|
|
- Kotlin, Gradle (KTS), Android Studio Projekt.
|
|
- Jetpack Compose UI, Material 3.
|
|
- CameraX für Kamerafeed.
|
|
- Barcode/QR Erkennung: Google ML Kit Barcode Scanning (on-device). Keine Netzwerkpflicht.
|
|
- Architektur: MVVM + Repository, Kotlin Coroutines + Flow.
|
|
- Persistenz (nur wenn Historie eingeschaltet): Room.
|
|
- Optional: Verschlüsselung der Historie via Jetpack Security (EncryptedSharedPreferences) für Settings; Room DB kann unverschlüsselt bleiben im MVP, aber strukturiere so, dass SQLCipher später möglich wäre.
|
|
- Min SDK: 24 (Android 7.0), Target/Compile: aktuell stabiles (verwende die neuesten stabilen Versionen, wenn möglich).
|
|
- Permissions: CAMERA (runtime). Keine Internet-Permission, außer absolut nötig (sollte nicht nötig sein).
|
|
- App-Größe klein halten.
|
|
|
|
Funktionen (MVP):
|
|
1) Startscreen:
|
|
- Großer Button “Scannen”
|
|
- Toggle/Setting “Historie speichern (lokal)” (default OFF)
|
|
- Link “Datenschutz” (kurzer Text: keine Datenübertragung, keine Werbung, keine Tracker)
|
|
2) Scanner-Screen:
|
|
- Live-Kamera Vorschau
|
|
- Overlay (Fadenkreuz)
|
|
- Taschenlampen-Toggle (wenn verfügbar)
|
|
- On successful scan: Stoppe Analyse kurz, zeige Bottom Sheet mit:
|
|
- erkannter Inhalt (Text)
|
|
- Typ (URL, Text, WiFi, Kontakt, etc. soweit ML Kit liefert)
|
|
- Aktionen:
|
|
- “Kopieren”
|
|
- falls URL: “Öffnen” (Intent), aber vorher ggf. Warn-Dialog wenn riskScore > Schwelle
|
|
- “Teilen”
|
|
- “Nochmal scannen”
|
|
- Wenn Historie an: speichere Scan mit Timestamp, Typ, Inhalt (gekürzt in Liste, Volltext im Detail).
|
|
3) Historie-Screen:
|
|
- Liste der Scans (neueste zuerst)
|
|
- Suchfeld (lokal)
|
|
- Swipe-to-delete einzelner Eintrag
|
|
- Button “Alles löschen” mit Confirm
|
|
4) Einstellungen:
|
|
- Historie an/aus (bei OFF: frage, ob vorhandene Historie gelöscht werden soll)
|
|
- “Sicherheitswarnungen” an/aus (default ON)
|
|
- “Über” (Version, Open-Source-Lizenzen, Kontakt-Email Platzhalter)
|
|
|
|
URL-Risiko-Heuristik (rein lokal, keine Webrequests):
|
|
- Parse URL via java.net.URI / Android Uri
|
|
- riskScore Punkte:
|
|
- host ist IP-Adresse (+2)
|
|
- scheme == "http" (+2)
|
|
- punycode “xn--” im host (+2)
|
|
- sehr langer host > 40 Zeichen (+1)
|
|
- sehr langer query > 120 Zeichen (+1)
|
|
- contains many percent-encodings (%xx count > 10) (+1)
|
|
- userinfo in URL (user:pass@host) (+2)
|
|
- Ab riskScore >= 3: zeige Dialog:
|
|
“Diese URL wirkt ungewöhnlich. Prüfe sie, bevor du öffnest.”
|
|
Buttons: “Abbrechen”, “Trotzdem öffnen”
|
|
|
|
UX/Qualität:
|
|
- Kein Flackern, keine Doppelscans: debounce (z.B. 800ms) und blockiere bis User “Nochmal scannen”.
|
|
- Sauberes Permission Handling (Denied → rationale → Settings deep link).
|
|
- Dark Mode support.
|
|
- Lokalisierung: Deutsch (Strings.xml), Englisch optional.
|
|
- Accessibility: ContentDescriptions, große Touch Targets.
|
|
|
|
Projektstruktur (erwartet):
|
|
- app/
|
|
- ui/ (compose screens, components)
|
|
- domain/ (models, usecases falls sinnvoll)
|
|
- data/ (mlkit scanner wrapper, room dao/entities, repository)
|
|
- util/ (url risk scoring, clipboard, intents)
|
|
- settings/ (DataStore oder SharedPreferences; DataStore bevorzugt)
|
|
|
|
Tests:
|
|
- Unit-Tests für URL-Risk-Scorer (mind. 10 Cases).
|
|
- Optional: Robolectric für Repository/Room (wenn leicht).
|
|
|
|
Build & Run:
|
|
- Liefere vollständige Gradle-Dateien, Manifest, Compose setup, Permissions.
|
|
- Stelle sicher, dass das Projekt ohne weitere manuelle Schritte kompiliert.
|
|
|
|
Wichtige Verbote:
|
|
- Keine Werbung, kein Analytics, keine externen Tracker.
|
|
- Kein Copycat-UI von bestehenden Apps; eigenes schlichtes Design.
|
|
- Keine Webrequests, keine Servercalls.
|
|
|
|
Zusatz (später, aber Architektur vorbereiten):
|
|
- Play Billing “1 € / Jahr” Subscription (nicht im MVP implementieren, aber baue Code so, dass eine Paywall später leicht als optionales Feature-Flag ergänzt werden kann).
|
|
|
|
Ergebnis:
|
|
- Gib den kompletten Code (alle Dateien) und kurze Run-Anleitung.
|
|
- Erkläre kurz die wichtigsten Architekturentscheidungen.
|