From 558ce084c81ca8e82b540b62890ac3eb4e65aa18 Mon Sep 17 00:00:00 2001 From: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Date: Tue, 15 Oct 2024 01:59:58 +0545 Subject: [PATCH] Show download state and progress on reader chapter list. (#1263) * Show download state and progress on reader chapter list. * Update download indicator on progress and status change. --- .../presentation/reader/ChapterListDialog.kt | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt index a3f4a9560..7d5369c78 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ChapterListDialog.kt @@ -8,11 +8,13 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.presentation.manga.components.MangaChapterListItem +import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.ui.reader.chapter.ReaderChapterItem import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel @@ -20,8 +22,13 @@ import eu.kanade.tachiyomi.util.lang.toRelativeString import exh.metadata.MetadataUtil import exh.source.isEhBasedManga import kotlinx.collections.immutable.ImmutableList +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.library.service.LibraryPreferences +import tachiyomi.source.local.isLocal +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDate import java.time.ZoneId @@ -39,6 +46,8 @@ fun ChapterListDialog( val manga by screenModel.mangaFlow.collectAsState() val context = LocalContext.current val state = rememberLazyListState(chapters.indexOfFirst { it.isCurrent }.coerceAtLeast(0)) + val downloadManager: DownloadManager = remember { Injekt.get() } + val downloadQueueState by downloadManager.queueState.collectAsState() AdaptiveSheet( onDismissRequest = onDismissRequest, @@ -52,6 +61,28 @@ fun ChapterListDialog( items = chapters, key = { "chapter-${it.chapter.id}" }, ) { chapterItem -> + val activeDownload = downloadQueueState.find { it.chapter.id == chapterItem.chapter.id } + val progress = activeDownload?.let { + downloadManager.progressFlow() + .filter { it.chapter.id == chapterItem.chapter.id } + .map { it.progress } + .collectAsState(0).value + } ?: 0 + val downloaded = if (chapterItem.manga.isLocal()) { + true + } else { + downloadManager.isChapterDownloaded( + chapterItem.chapter.name, + chapterItem.chapter.scanlator, + chapterItem.manga.ogTitle, + chapterItem.manga.source, + ) + } + val downloadState = when { + activeDownload != null -> activeDownload.status + downloaded -> Download.State.DOWNLOADED + else -> Download.State.NOT_DOWNLOADED + } MangaChapterListItem( title = chapterItem.chapter.name, date = chapterItem.chapter.dateUpload @@ -76,8 +107,8 @@ fun ChapterListDialog( bookmark = chapterItem.chapter.bookmark, selected = false, downloadIndicatorEnabled = false, - downloadStateProvider = { Download.State.NOT_DOWNLOADED }, - downloadProgressProvider = { 0 }, + downloadStateProvider = { downloadState }, + downloadProgressProvider = { progress }, chapterSwipeStartAction = LibraryPreferences.ChapterSwipeAction.ToggleBookmark, chapterSwipeEndAction = LibraryPreferences.ChapterSwipeAction.ToggleBookmark, onLongClick = { /*TODO*/ },