From b6d0014b496ace6f9788d213aee865512d5d2851 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 7 Mar 2025 11:21:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/model/ReadManga.kt | 80 ++++++++----------- .../app/ui/book/manga/ReadMangaActivity.kt | 21 ++--- .../book/manga/recyclerview/MangaAdapter.kt | 31 +++---- .../app/ui/widget/recycler/LoadMoreView.kt | 11 ++- 4 files changed, 59 insertions(+), 84 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/ReadManga.kt b/app/src/main/java/io/legado/app/model/ReadManga.kt index b126cd643..3e38dd21b 100644 --- a/app/src/main/java/io/legado/app/model/ReadManga.kt +++ b/app/src/main/java/io/legado/app/model/ReadManga.kt @@ -65,7 +65,6 @@ object ReadManga : CoroutineScope by MainScope() { val downloadFailChapters = hashMapOf() val downloadScope = CoroutineScope(SupervisorJob() + IO) var rateLimiter = ConcurrentRateLimiter(null) - val durChapterAbsPos get() = (prevMangaChapter?.contents?.size ?: 0) + durChapterPos + 1 val mangaContents get() = buildContentList() val hasNextChapter get() = durChapterIndex < simulatedChapterSize - 1 @@ -235,35 +234,6 @@ object ReadManga : CoroutineScope by MainScope() { } } - - /** - * 注册回调 - */ - fun register(cb: Callback) { - mCallback = cb - } - - /** - * 取消注册回调 - */ - fun unregister(cb: Callback) { - if (mCallback === cb) { - mCallback = null - } - inBookshelf = false - tocChanged = false - chapterChanged = false - durChapterIndex = 0 - chapterSize = 0 - durChapterPos = 0 - durChapterImageCount = 0 - simulatedChapterSize = 0 - preDownloadTask?.cancel() - preDownloadTask = null - downloadScope.coroutineContext.cancelChildren() - coroutineContext.cancelChildren() - } - /** * 内容加载完成 */ @@ -276,7 +246,7 @@ object ReadManga : CoroutineScope by MainScope() { if (chapter.index !in durChapterIndex - 1..durChapterIndex + 1) { return } - when (chapter.index - durChapterIndex) { + when (val offset = chapter.index - durChapterIndex) { 0 -> { if (content == null) { mCallback?.loadFail("加载内容失败") @@ -294,10 +264,9 @@ object ReadManga : CoroutineScope by MainScope() { durChapterImageCount = mangaChapter.imageCount curMangaChapter = mangaChapter mCallback?.upContent(true) - mCallback?.contentLoadFinish() } - -1 -> { + -1, 1 -> { if (content == null || content.isEmpty()) { return } @@ -305,27 +274,22 @@ object ReadManga : CoroutineScope by MainScope() { if (mangaChapter.imageCount == 0) { return } - prevMangaChapter = mangaChapter - mCallback?.upContent() - } - 1 -> { - if (content == null || content.isEmpty()) { - return + when (offset) { + -1 -> prevMangaChapter = mangaChapter + 1 -> nextMangaChapter = mangaChapter } - val mangaChapter = getManageChapter(chapter, content) - if (mangaChapter.imageCount == 0) { - return - } - nextMangaChapter = mangaChapter + mCallback?.upContent() } } } - private fun buildContentList(): List { + private fun buildContentList(): Pair> { val list = arrayListOf() + var pos = durChapterPos + 1 prevMangaChapter?.let { + pos += it.contents.size list.addAll(it.contents) } curMangaChapter?.let { @@ -334,19 +298,20 @@ object ReadManga : CoroutineScope by MainScope() { nextMangaChapter?.let { list.addAll(it.contents) } - return list + return pos to list } /** * 加载下一章 */ - fun moveToNextChapter(): Boolean { + fun moveToNextChapter(startLoad: () -> Unit): Boolean { if (durChapterIndex < simulatedChapterSize - 1) { durChapterIndex++ prevMangaChapter = curMangaChapter curMangaChapter = nextMangaChapter nextMangaChapter = null if (curMangaChapter == null) { + startLoad.invoke() loadContent(durChapterIndex) } else { mCallback?.upContent(true) @@ -548,6 +513,26 @@ object ReadManga : CoroutineScope by MainScope() { } } + /** + * 注册回调 + */ + fun register(cb: Callback) { + mCallback = cb + } + + /** + * 取消注册回调 + */ + fun unregister(cb: Callback) { + if (mCallback === cb) { + mCallback = null + } + preDownloadTask?.cancel() + preDownloadTask = null + downloadScope.coroutineContext.cancelChildren() + coroutineContext.cancelChildren() + } + private suspend fun getManageChapter(chapter: BookChapter, content: String): MangaChapter { val list = flow { val matcher = AppPattern.imgPattern.matcher(content) @@ -595,7 +580,6 @@ object ReadManga : CoroutineScope by MainScope() { interface Callback { fun upContent(finish: Boolean = false) - fun contentLoadFinish() fun loadFail(msg: String) fun adjustProgress() fun sureNewProgress(progress: BookProgress) diff --git a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt index c9dd4a741..f5ad7eb80 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt @@ -122,8 +122,8 @@ class ReadMangaActivity : VMBaseActivity content.mChapterIndex) { ReadManga.moveToPrevChapter() @@ -262,7 +259,7 @@ class ReadMangaActivity : VMBaseActivity(), PreloadModelProvider { + private val inflater: LayoutInflater = LayoutInflater.from(context) + companion object { private const val LOADING_VIEW = 0 private const val CONTENT_VIEW = 1 @@ -85,13 +87,15 @@ class MangaAdapter(private val context: Context) : binding.retry.setOnClickListener { val item = mDiffer.currentList[layoutPosition] if (item is MangaContent) { - loadImageWithRetry(item.mImageUrl, isHorizontal, mDiffer.currentList.size == 3) + loadImageWithRetry( + item.mImageUrl, isHorizontal, item.mDurChapterImageCount == 1 + ) } } } fun onBind(item: MangaContent) { - loadImageWithRetry(item.mImageUrl, isHorizontal, mDiffer.currentList.size == 3) + loadImageWithRetry(item.mImageUrl, isHorizontal, item.mDurChapterImageCount == 1) } } @@ -105,29 +109,18 @@ class MangaAdapter(private val context: Context) : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - return when { - viewType >= TYPE_FOOTER_VIEW -> { ItemViewHolder(footerItems.get(viewType).invoke(parent)) } - viewType == LOADING_VIEW -> PageMoreViewHolder( - BookComicLoadingRvBinding.inflate( - LayoutInflater.from( - parent.context - ), parent, false - ) - ) - - viewType == CONTENT_VIEW -> PageViewHolder( - BookComicRvBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) + viewType == LOADING_VIEW -> { + PageMoreViewHolder(BookComicLoadingRvBinding.inflate(inflater, parent, false)) + } + viewType == CONTENT_VIEW -> { + PageViewHolder(BookComicRvBinding.inflate(inflater, parent, false)) + } else -> error("Unknown view type!") } diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt index d13e034b9..66b9ed525 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt @@ -5,9 +5,11 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup import android.widget.FrameLayout +import androidx.annotation.ColorRes import io.legado.app.R import io.legado.app.databinding.ViewLoadMoreBinding import io.legado.app.lib.dialogs.alert +import io.legado.app.utils.getCompatColor import io.legado.app.utils.invisible import io.legado.app.utils.visible @@ -79,8 +81,13 @@ class LoadMoreView(context: Context, attrs: AttributeSet? = null) : FrameLayout( binding.tvText.visible() } - fun getLoading() = binding.rotateLoading - fun getLoadingText() = binding.tvText + fun setLoadingColor(@ColorRes color: Int) { + binding.rotateLoading.loadingColor = context.getCompatColor(color) + } + + fun setLoadingTextColor(@ColorRes color: Int) { + binding.tvText.setTextColor(context.getCompatColor(color)) + } private fun showErrorDialog(): Boolean { if (errorMsg.isBlank()) {