diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoRouteScreen.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoRouteScreen.kt index f8fbe1fb4..b74b57557 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoRouteScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoRouteScreen.kt @@ -12,7 +12,10 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner import io.legado.app.R import io.legado.app.help.book.isAudio import io.legado.app.help.book.isImage @@ -58,6 +61,7 @@ fun BookInfoRouteScreen( ) { val context = LocalContext.current val activity = context as AppCompatActivity + val lifecycleOwner = LocalLifecycleOwner.current val tocActivityResult = rememberLauncherForActivityResult(TocActivityResult()) { viewModel.onTocResult(it) @@ -104,6 +108,18 @@ fun BookInfoRouteScreen( } } + DisposableEffect(lifecycleOwner, viewModel) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_RESUME) { + viewModel.refreshShelfState() + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + } + } + LaunchedEffect(viewModel, activity) { viewModel.effects.collectLatest { effect -> when (effect) { diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 589d1eddd..852c470b8 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -351,6 +351,22 @@ class BookInfoViewModel( } } + fun refreshShelfState() { + val bookUrl = currentBook?.bookUrl ?: return + execute { + appDb.bookDao.getBook(bookUrl) + }.onSuccess { dbBook -> + val nextInBookshelf = dbBook != null && !dbBook.isNotShelf + if (nextInBookshelf) { + currentBook = dbBook + } + if (inBookshelf != nextInBookshelf || nextInBookshelf) { + inBookshelf = nextInBookshelf + syncUiState() + } + } + } + fun toggleCanUpdate() { currentBook?.let { book -> book.canUpdate = !book.canUpdate