feat(backend): Phase 2 complete — bookshelf-api + ABS, remove OPDS/Gutenberg/LocalFolder/CloudSync

Phase 2.4: download/open ebooks from server
- BookshelfViewModel now extends AndroidViewModel, downloads books via BookshelfApiRepository.downloadEbook
- Saves to cache dir, emits Uri via SharedFlow, opens in reader via MainViewModel.onFileSelected
- Download progress indicator in BookshelfLibraryScreen item cards

Phase 2.5: remove legacy backends
- Delete reader/opds/ package (OpdsModels, OpdsParser, OpdsRepository, OpdsViewModel)
- Delete CloudSyncTrace.kt and FolderSyncWorker.kt
- Delete OpdsTab, rememberOpdsCoverImageLoader, OpdsCatalogCard, OpdsNavigationCard, OpdsBookCard, OpdsBookDetailsSheet from LibraryScreen
- Delete FolderSyncScreen, FolderCard, EditFolderFiltersDialog from LibraryScreen
- Remove 'Catalogs' tab from LibraryScreen tabTitles
- Add CloudSyncTraceStub.kt with no-op stubs for logCloudSyncTrace/Error/Annotation variants
- Add FolderSyncWorkerStub.kt as no-op CoroutineWorker with constants
- Fix OpdsStreamDocumentWrapper to use plain OkHttpClient
- ':app:assembleOssDebug' passes (APK ~80 MB).
This commit is contained in:
Atte149 2026-06-24 16:41:38 +03:00
parent 1666ae0fe2
commit fef33afe69
13 changed files with 163 additions and 2591 deletions

View file

@ -435,10 +435,17 @@ fun AppNavigation(
composable(route = AppDestinations.BOOKSHELF_LIBRARY_ROUTE) {
val bookshelfViewModel: org.dueattendant149.bookreader.bookshelf.BookshelfViewModel = hiltViewModel()
LaunchedEffect(bookshelfViewModel) {
bookshelfViewModel.downloadedFile.collect { uri ->
Timber.d("Downloaded book $uri, opening in reader")
viewModel.onFileSelected(uri, isFromRecent = false, isExternalIntent = false)
}
}
BookshelfLibraryScreen(
viewModel = bookshelfViewModel,
onItemClick = { item ->
Timber.d("Bookshelf item selected: ${item.id}")
bookshelfViewModel.downloadBook(item)
},
onOpenSettings = {
navController.navigateIfReady(AppDestinations.SERVER_SETTINGS_ROUTE)