Swap lazysodium/JNA for a pure-Java Bouncy Castle crypto envelope so the APK ships no native .so files (resolves the Android 15 16 KB alignment crash) while staying byte-compatible with the desktop libsodium sync. Bring the Android app up to the desktop feature set: full item CRUD with an add/edit screen and FAB, inline editing on the detail view (status, rating, favorite, per-unit/segment watched toggles, delete), online metadata search (TMDB/OpenLibrary/AniList/RAWG) that pre-fills the editor, library filtering and sorting, a statistics view, and settings polish for dark mode and provider API keys/language. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| app | ||
| gradle | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
Ultimate Media Tracker – Android
Mobile Companion-App zur Desktop-Anwendung, gebaut mit Kotlin, Jetpack Compose und Material 3. Die App zeigt deine Bibliothek an, die du in der Desktop-App als JSON exportierst und hier importierst.
Status (MVP-Gerüst)
Enthalten ist ein lauffähiges Grundgerüst mit:
- Datenmodell, das 1:1 zur Desktop-App passt (
MediaType,WatchStatus, Segmente/Einheiten, Fortschritt). - Lokale Speicherung mit Room.
- JSON-Import über den System-Dateidialog (
kotlinx.serialization). - Navigation (Bibliotheksliste → Detailansicht) mit Navigation-Compose.
- Material-3-Theme (dunkel/hell + Material-You-Dynamic-Color ab Android 12).
- Bibliotheks-Übersicht als Karten-Grid mit Such- und Typ-Filter.
- Detailansicht mit Cover, Status, Bewertung, Fortschrittsbalken und standardmäßig zugeklappten Staffeln/Bänden (wie in der Desktop-App).
Eine mitgelieferte Beispielbibliothek (app/src/main/assets/sample-library.json)
wird beim ersten Start geladen, damit die App nicht leer ist.
Sync (lokal oder verschlüsselte Cloud)
Unter Einstellungen (Zahnrad oben rechts) wählst du den Speicherort:
- Nur lokal (SQLite): Die Bibliothek bleibt ausschließlich auf dem Gerät.
- Cloud-Sync: Die komplette Bibliothek wird als ein Snapshot
Ende-zu-Ende verschlüsselt (Argon2id + XChaCha20-Poly1305 via libsodium)
und über den Kombi-Server (
/sync/library) abgeglichen. Der Server speichert nur Chiffretext – Passphrase und Klartext verlassen das Gerät nie.
Für den Cloud-Sync trägst du Server-URL und Zugriffstoken (beides aus der
Proxy-Anmeldung, identisch zur Desktop-App) sowie eine frei gewählte
Sync-Passphrase ein. Dieselbe Passphrase muss auf allen Geräten gesetzt sein.
Server-URL, Token und Passphrase liegen in EncryptedSharedPreferences
(Android-Keystore).
Synchronisiert wird die ganze Bibliothek als Snapshot mit Revisionsnummer (Last-Write-Wins). Beim Hochladen prüft der Server die Revision; bei einem Konflikt (zwischenzeitliche Änderung) bietet die App an, den Serverstand zu laden oder lokal zu überschreiben. Das Wolken-Symbol oben rechts lädt direkt herunter.
Öffnen & Bauen
- Den Ordner
android/in Android Studio (Ladybug oder neuer) öffnen. - Android Studio erzeugt beim ersten Sync den Gradle-Wrapper und lädt die
Abhängigkeiten. Alternativ per CLI:
gradle wrapperimandroid/-Ordner, danach./gradlew assembleDebug. - Auf einem Gerät/Emulator mit mindestens Android 8.0 (API 26) ausführen.
JSON-Exportformat
Die App liest eine Datei dieser Form (entspricht dem Desktop-MediaItem):
{
"version": 1,
"exportedAt": "2026-06-20T12:00:00Z",
"items": [
{
"type": "Series", // Movie | Series | Manga | Book | Game
"title": "Solo Leveling",
"originalTitle": "...",
"localizedTitles": { "de": "...", "en": "..." },
"coverUrl": "https://.../cover.jpg",
"genres": ["Action"],
"tags": [],
"franchise": "",
"status": "InProgress", // PlanToWatch | InProgress | Completed | OnHold | Dropped
"rating": 9, // 0..10
"favorite": true,
"year": 2024,
"overview": "...",
"notes": "",
"segments": [
{ "number": 1, "title": "Staffel 1", "units": [
{ "number": 1, "title": "Folge 1", "watched": true, "watchedDate": "" }
]}
],
"customFields": {},
"dateAdded": "",
"dateCompleted": "",
"externalId": "127532",
"externalSource": "tmdb"
}
]
}
Wichtig: Der Import ersetzt die gesamte lokale Bibliothek (alles-oder-nichts;
bei einem Parse-Fehler bleiben die vorhandenen Daten erhalten). coverPath aus
der Desktop-DB wird ignoriert – auf dem Handy zählt coverUrl.
Noch offen / nächste Schritte
- Bearbeiten/Fortschritt auf dem Handy abhaken (aktuell read-only); Änderungen werden danach hochgeladen.
- Online-Suche über den TMDB-Proxy / AniList / RAWG / OpenLibrary.