(cherry picked from commit aa498360db90350f2642e6320dc55e7d474df1fd) # Conflicts: # app/build.gradle.kts # app/src/main/java/eu/kanade/domain/base/BasePreferences.kt # app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt # app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt # app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt # app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt # app/src/main/java/eu/kanade/tachiyomi/App.kt # app/src/main/java/eu/kanade/tachiyomi/Migrations.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt # app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt # app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt # core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/CbzCrypto.kt # data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt # data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt # domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt # domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt # settings.gradle.kts # source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/online/HttpSource.kt # source-local/src/androidMain/kotlin/tachiyomi/source/local/image/LocalCoverManager.kt
108 lines
4.1 KiB
Kotlin
108 lines
4.1 KiB
Kotlin
package exh.pagepreview
|
|
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.setValue
|
|
import cafe.adriel.voyager.core.model.StateScreenModel
|
|
import cafe.adriel.voyager.core.model.screenModelScope
|
|
import eu.kanade.domain.manga.interactor.GetPagePreviews
|
|
import eu.kanade.domain.manga.model.PagePreview
|
|
import eu.kanade.tachiyomi.source.Source
|
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
import kotlinx.coroutines.flow.catch
|
|
import kotlinx.coroutines.flow.collect
|
|
import kotlinx.coroutines.flow.onEach
|
|
import kotlinx.coroutines.flow.update
|
|
import tachiyomi.core.common.util.lang.launchIO
|
|
import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId
|
|
import tachiyomi.domain.chapter.model.Chapter
|
|
import tachiyomi.domain.manga.interactor.GetManga
|
|
import tachiyomi.domain.manga.model.Manga
|
|
import tachiyomi.domain.source.service.SourceManager
|
|
import uy.kohesive.injekt.Injekt
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
class PagePreviewScreenModel(
|
|
private val mangaId: Long,
|
|
private val getPagePreviews: GetPagePreviews = Injekt.get(),
|
|
private val getManga: GetManga = Injekt.get(),
|
|
private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(),
|
|
private val sourceManager: SourceManager = Injekt.get(),
|
|
) : StateScreenModel<PagePreviewState>(PagePreviewState.Loading) {
|
|
|
|
private val page = MutableStateFlow(1)
|
|
|
|
var pageDialogOpen by mutableStateOf(false)
|
|
|
|
init {
|
|
screenModelScope.launchIO {
|
|
val manga = getManga.await(mangaId)!!
|
|
val chapter = getChaptersByMangaId.await(mangaId).minByOrNull { it.sourceOrder }
|
|
if (chapter == null) {
|
|
mutableState.update {
|
|
PagePreviewState.Error(Exception("No chapters found"))
|
|
}
|
|
return@launchIO
|
|
}
|
|
val source = sourceManager.getOrStub(manga.source)
|
|
page
|
|
.onEach { page ->
|
|
when (
|
|
val previews = getPagePreviews.await(manga, source, page)
|
|
) {
|
|
is GetPagePreviews.Result.Error -> mutableState.update {
|
|
PagePreviewState.Error(previews.error)
|
|
}
|
|
is GetPagePreviews.Result.Success -> mutableState.update {
|
|
when (it) {
|
|
PagePreviewState.Loading, is PagePreviewState.Error -> {
|
|
PagePreviewState.Success(
|
|
page,
|
|
previews.pagePreviews,
|
|
previews.hasNextPage,
|
|
previews.pageCount,
|
|
manga,
|
|
chapter,
|
|
source,
|
|
)
|
|
}
|
|
is PagePreviewState.Success -> it.copy(
|
|
page = page,
|
|
pagePreviews = previews.pagePreviews,
|
|
hasNextPage = previews.hasNextPage,
|
|
pageCount = previews.pageCount,
|
|
)
|
|
}
|
|
}
|
|
GetPagePreviews.Result.Unused -> Unit
|
|
}
|
|
}
|
|
.catch { e ->
|
|
mutableState.update {
|
|
PagePreviewState.Error(e)
|
|
}
|
|
}
|
|
.collect()
|
|
}
|
|
}
|
|
|
|
fun moveToPage(page: Int) {
|
|
this.page.value = page
|
|
}
|
|
}
|
|
|
|
sealed class PagePreviewState {
|
|
data object Loading : PagePreviewState()
|
|
|
|
data class Success(
|
|
val page: Int,
|
|
val pagePreviews: List<PagePreview>,
|
|
val hasNextPage: Boolean,
|
|
val pageCount: Int?,
|
|
val manga: Manga,
|
|
val chapter: Chapter,
|
|
val source: Source,
|
|
) : PagePreviewState()
|
|
|
|
data class Error(val error: Throwable) : PagePreviewState()
|
|
}
|