feat(resources): In-App ePub & PDF Reader mit Leseposition und Homescreen-Widget #134

Open
opened 2026-05-19 20:16:55 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-19 20:16:55 +00:00 (Migrated from github.com)

Ziel

Bücher direkt in der App lesen – ohne externe Reader-App. Die aktuelle Fehlermeldung „Keine App zum Öffnen dieser Datei gefunden" (ePub/PDF) wird durch einen eingebetteten Viewer ersetzt.

Kein neues Gradle-Dependency nötig – beide Viewer nutzen ausschließlich Android-Bordmittel.


Scope

1. ePub Reader (WebView-basiert)

  • ePub ins Cache-Verzeichnis entpacken (ZIP → XHTML-Kapitel + CSS)
  • OPF-Datei parsen → Spine-Reihenfolge ermitteln
  • Kapitel in Compose AndroidView(WebView) rendern (CSS wird mitgeladen)
  • Prev/Next-Navigation zwischen Kapiteln
  • Kapitelübersicht (BottomSheet mit Inhaltsverzeichnis)
  • Neue Route: resources/{guid}/read
  • EpubExtractor.kt: ZIP → OPF → List<EpubChapter>(href, title, index)

2. PDF Viewer (android.graphics.pdf.PdfRenderer)

  • PdfRenderer (API 21+, in Android eingebaut, keine Library)
  • Pages als Bitmaps rendern, in Compose HorizontalPager anzeigen
  • Aktuelle Seite / Gesamtseitenanzahl in TopBar
  • Selbe Route wie ePub: resources/{guid}/read

3. Leseposition persistieren (Room)

  • Neue Room-Entity: ReadingProgress(guid, chapterIndex, scrollOffset, pageIndex, lastOpenedAt)
  • DB-Migration auf nächste Schema-Version
  • Beim Öffnen: automatisch zur letzten Position springen (Kapitel + Scroll-Offset bzw. Seite)
  • Beim Schließen (onDispose): aktuelle Position speichern

4. Homescreen – Zuletzt gelesen (max. 3)

  • Neue RecentlyReadSection auf dem Home-Screen
  • Zeigt die 3 zuletzt geöffneten Ressourcen, sortiert nach lastOpenedAt absteigend
  • Sichtbar erst sobald mindestens 1 Buch geöffnet wurde (sonst unsichtbar)
  • Klick → direkt zu EpubReaderScreen / PdfReaderScreen auf letzter gespeicherter Position

Abgrenzung

  • Kein DRM-Support nötig (alle Bücher sind Public Domain / freie Lizenzen)
  • Bilder (PNG/JPG/WEBP) behalten den externen Intent-Handoff
  • Keine Lesezeichen / Notizen (zukünftiges Feature)
  • Kein Cloud-Sync der Leseposition (lokal reicht)

Technische Notizen

Komponente Datei / Paket
ePub-Parser ui/resources/EpubExtractor.kt
WebView-Screen ui/resources/EpubReaderScreen.kt
PDF-Renderer ui/resources/PdfReaderScreen.kt
Leseposition Entity data/db/ReadingProgress.kt + DAO
DB-Migration Room AutoMigration oder manuelle Migration
Homescreen-Widget ui/home/RecentlyReadSection.kt
Navigation Neue Route resources/{guid}/read in NavGraph
## Ziel Bücher direkt in der App lesen – ohne externe Reader-App. Die aktuelle Fehlermeldung „Keine App zum Öffnen dieser Datei gefunden" (ePub/PDF) wird durch einen eingebetteten Viewer ersetzt. Kein neues Gradle-Dependency nötig – beide Viewer nutzen ausschließlich Android-Bordmittel. --- ## Scope ### 1. ePub Reader (WebView-basiert) - ePub ins Cache-Verzeichnis entpacken (ZIP → XHTML-Kapitel + CSS) - OPF-Datei parsen → Spine-Reihenfolge ermitteln - Kapitel in Compose `AndroidView(WebView)` rendern (CSS wird mitgeladen) - Prev/Next-Navigation zwischen Kapiteln - Kapitelübersicht (BottomSheet mit Inhaltsverzeichnis) - Neue Route: `resources/{guid}/read` - `EpubExtractor.kt`: ZIP → OPF → `List<EpubChapter>(href, title, index)` ### 2. PDF Viewer (android.graphics.pdf.PdfRenderer) - `PdfRenderer` (API 21+, in Android eingebaut, keine Library) - Pages als Bitmaps rendern, in Compose `HorizontalPager` anzeigen - Aktuelle Seite / Gesamtseitenanzahl in TopBar - Selbe Route wie ePub: `resources/{guid}/read` ### 3. Leseposition persistieren (Room) - Neue Room-Entity: `ReadingProgress(guid, chapterIndex, scrollOffset, pageIndex, lastOpenedAt)` - DB-Migration auf nächste Schema-Version - Beim Öffnen: automatisch zur letzten Position springen (Kapitel + Scroll-Offset bzw. Seite) - Beim Schließen (onDispose): aktuelle Position speichern ### 4. Homescreen – Zuletzt gelesen (max. 3) - Neue `RecentlyReadSection` auf dem Home-Screen - Zeigt die 3 zuletzt geöffneten Ressourcen, sortiert nach `lastOpenedAt` absteigend - Sichtbar erst sobald mindestens 1 Buch geöffnet wurde (sonst unsichtbar) - Klick → direkt zu `EpubReaderScreen` / `PdfReaderScreen` auf letzter gespeicherter Position --- ## Abgrenzung - Kein DRM-Support nötig (alle Bücher sind Public Domain / freie Lizenzen) - Bilder (PNG/JPG/WEBP) behalten den externen Intent-Handoff - Keine Lesezeichen / Notizen (zukünftiges Feature) - Kein Cloud-Sync der Leseposition (lokal reicht) --- ## Technische Notizen | Komponente | Datei / Paket | |-----------------------|-----------------------------------------------------------| | ePub-Parser | `ui/resources/EpubExtractor.kt` | | WebView-Screen | `ui/resources/EpubReaderScreen.kt` | | PDF-Renderer | `ui/resources/PdfReaderScreen.kt` | | Leseposition Entity | `data/db/ReadingProgress.kt` + DAO | | DB-Migration | Room AutoMigration oder manuelle Migration | | Homescreen-Widget | `ui/home/RecentlyReadSection.kt` | | Navigation | Neue Route `resources/{guid}/read` in NavGraph |
bollwerkadmin added the
status:todo
label 2026-05-19 20:37:21 +00:00
Sign in to join this conversation.
No description provided.