mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-12 20:19:05 +01:00
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:
@@ -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 = '.' },
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user