MangaScreen: Improve chapter list scrolling performance (#7491)

* MangaScreen: Improve chapter list scrolling performance

Process chapter title, date and read progress string ahead of time

* Use enum for contentType and add key
This commit is contained in:
Ivan Iskandar
2022-07-10 03:20:40 +07:00
committed by GitHub
parent b15073fd61
commit 1551891c15
4 changed files with 95 additions and 69 deletions

View File

@@ -1,5 +1,7 @@
package eu.kanade.tachiyomi.ui.manga
import android.app.Application
import android.content.Context
import android.os.Bundle
import androidx.compose.runtime.Immutable
import eu.kanade.domain.category.interactor.GetCategories
@@ -24,6 +26,7 @@ import eu.kanade.domain.track.interactor.GetTracks
import eu.kanade.domain.track.interactor.InsertTrack
import eu.kanade.domain.track.model.toDbTrack
import eu.kanade.domain.track.model.toDomainTrack
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.model.Download
@@ -40,6 +43,7 @@ import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper
import eu.kanade.tachiyomi.util.chapter.getChapterSort
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.lang.toRelativeString
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.preference.asImmediateFlow
import eu.kanade.tachiyomi.util.removeCovers
@@ -68,6 +72,9 @@ import rx.schedulers.Schedulers
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.text.DateFormat
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.util.Date
import eu.kanade.domain.chapter.model.Chapter as DomainChapter
import eu.kanade.domain.manga.model.Manga as DomainManga
@@ -154,15 +161,18 @@ class MangaPresenter(
getMangaAndChapters.subscribe(mangaId)
.collectLatest { (manga, chapters) ->
val chapterItems = chapters.toChapterItems(manga)
val chapterItems = chapters.toChapterItems(
context = view?.activity ?: Injekt.get<Application>(),
manga = manga,
dateRelativeTime = preferences.relativeTime().get(),
dateFormat = preferences.dateFormat(),
)
_state.update { currentState ->
when (currentState) {
// Initialize success state
MangaScreenState.Loading -> MangaScreenState.Success(
manga = manga,
source = Injekt.get<SourceManager>().getOrStub(manga.source),
dateRelativeTime = preferences.relativeTime().get(),
dateFormat = preferences.dateFormat(),
isFromSource = isFromSource,
trackingAvailable = trackManager.hasLoggedServices(),
chapters = chapterItems,
@@ -428,7 +438,12 @@ class MangaPresenter(
}
}
private fun List<DomainChapter>.toChapterItems(manga: DomainManga): List<ChapterItem> {
private fun List<DomainChapter>.toChapterItems(
context: Context,
manga: DomainManga,
dateRelativeTime: Int,
dateFormat: DateFormat,
): List<ChapterItem> {
return map { chapter ->
val activeDownload = downloadManager.queue.find { chapter.id == it.chapter.id }
val downloaded = downloadManager.isChapterDownloaded(chapter.name, chapter.scanlator, manga.title, manga.source)
@@ -441,6 +456,29 @@ class MangaPresenter(
chapter = chapter,
downloadState = downloadState,
downloadProgress = activeDownload?.progress ?: 0,
chapterTitleString = if (manga.displayMode == DomainManga.CHAPTER_DISPLAY_NUMBER) {
context.getString(
R.string.display_mode_chapter,
chapterDecimalFormat.format(chapter.chapterNumber.toDouble()),
)
} else {
chapter.name
},
dateUploadString = chapter.dateUpload
.takeIf { it > 0 }
?.let {
Date(it).toRelativeString(
context,
dateRelativeTime,
dateFormat,
)
},
readProgressString = chapter.lastPageRead.takeIf { !chapter.read && it > 0 }?.let {
context.getString(
R.string.chapter_progress,
it + 1,
)
},
)
}
}
@@ -853,8 +891,6 @@ sealed class MangaScreenState {
data class Success(
val manga: DomainManga,
val source: Source,
val dateRelativeTime: Int,
val dateFormat: DateFormat,
val isFromSource: Boolean,
val chapters: List<ChapterItem>,
val trackingAvailable: Boolean = false,
@@ -909,6 +945,16 @@ data class ChapterItem(
val chapter: DomainChapter,
val downloadState: Download.State,
val downloadProgress: Int,
val chapterTitleString: String,
val dateUploadString: String?,
val readProgressString: String?,
) {
val isDownloaded = downloadState == Download.State.DOWNLOADED
}
private val chapterDecimalFormat = DecimalFormat(
"#.###",
DecimalFormatSymbols()
.apply { decimalSeparator = '.' },
)