diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/BaseReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/BaseReaderFragment.kt index 4e5bef523..8a2e07edc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/BaseReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/BaseReaderFragment.kt @@ -18,7 +18,7 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen abstract val hasItems: Boolean - abstract val currentPageIndex: Int + protected abstract val currentPageIndex: Int abstract val pages: List @@ -46,6 +46,11 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen override fun onChaptersLoader(chapters: List) = Unit + override fun onDestroyView() { + chaptersMap.clear() + super.onDestroyView() + } + final override fun onPagesLoaded(chapterId: Long, pages: List) { when { chaptersMap.isEmpty() -> { @@ -68,6 +73,33 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen } } + fun switchPageBy(delta: Int) { + setCurrentPage(currentPageIndex + delta, true) + } + + fun findCurrentPageIndex(chapterId: Long): Int { + val pages = this.pages + var offset = 0 + for ((id, count) in chaptersMap) { + if (id == chapterId) { + return currentPageIndex - offset + } + offset += count + } + return -1 + } + + fun getPages(chapterId: Long): List? { + var offset = 0 + for ((id, count) in chaptersMap) { + if (id == chapterId) { + return pages.subList(offset, offset + count - 1) + } + offset += count + } + return null + } + private fun shouldAppend(chapterId: Long): Boolean { val chapters = lastState?.manga?.chapters ?: return false val lastChapterId = chaptersMap.peekLast()?.first ?: return false diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt index 135d316c1..ab3ac976b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt @@ -89,7 +89,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh override fun onPause() { reader?.let { - state = state.copy(page = it.currentPageIndex) + state = state.copy(page = it.findCurrentPageIndex(state.chapterId)) presenter.saveState(state) } super.onPause() @@ -126,10 +126,15 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh } R.id.action_pages_thumbs -> { if (reader?.hasItems == true) { - PagesThumbnailsSheet.show( - supportFragmentManager, reader!!.pages, - state.chapter?.name ?: title?.toString().orEmpty() - ) + val pages = reader?.getPages(state.chapterId) + if (pages != null) { + PagesThumbnailsSheet.show( + supportFragmentManager, pages, + state.chapter?.name ?: title?.toString().orEmpty() + ) + } else { + showWaitWhileLoading() + } } else { showWaitWhileLoading() } @@ -154,7 +159,9 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh } override fun onLoadingStateChanged(isLoading: Boolean) { - layout_loading.isVisible = isLoading + val hasPages = reader?.hasItems == true + layout_loading.isVisible = isLoading && !hasPages + progressBar_bottom.isVisible = isLoading && hasPages } override fun onError(e: Exception) { @@ -177,15 +184,11 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh } GridTouchHelper.AREA_TOP, GridTouchHelper.AREA_LEFT -> { - reader?.let { - it.setCurrentPage(it.currentPageIndex - 1, true) - } + reader?.switchPageBy(-1) } GridTouchHelper.AREA_BOTTOM, GridTouchHelper.AREA_RIGHT -> { - reader?.let { - it.setCurrentPage(it.currentPageIndex + 1, true) - } + reader?.switchPageBy(1) } } } @@ -225,7 +228,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh override fun onReaderModeChanged(mode: ReaderMode) { reader?.let { - state = state.copy(page = it.currentPageIndex) + state = state.copy(page = it.findCurrentPageIndex(state.chapterId)) } presenter.saveState(state, mode) setReader(mode) @@ -248,10 +251,14 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh } override fun onPageChanged(chapter: MangaChapter, page: Int, total: Int) { - title = chapter.name - state.manga.chapters?.run { - supportActionBar?.subtitle = - getString(R.string.chapter_d_of_d, chapter.number, size) + if (chapter.id != state.chapterId) { + title = chapter.name + state = state.copy(chapterId = chapter.id) + presenter.saveState(state) + state.manga.chapters?.run { + supportActionBar?.subtitle = + getString(R.string.chapter_d_of_d, chapter.number, size) + } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/StandardReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/StandardReaderFragment.kt index e4d2d6697..7a94ef992 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/StandardReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/StandardReaderFragment.kt @@ -49,7 +49,11 @@ class StandardReaderFragment : BaseReaderFragment(R.layout.fragment_reader_stand } } } - Action.PREPEND -> adapter?.prependData(pages) + Action.PREPEND -> adapter?.run { + val pos = pager.currentItem + prependData(pages) + pager.setCurrentItem(pos + pages.size, false) + } Action.APPEND -> adapter?.appendData(pages) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt index ecd74be75..0c90f7b5c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt @@ -10,6 +10,7 @@ import org.koitharu.kotatsu.ui.reader.BaseReaderFragment import org.koitharu.kotatsu.ui.reader.OnBoundsScrollListener import org.koitharu.kotatsu.ui.reader.PageLoader import org.koitharu.kotatsu.ui.reader.ReaderPresenter +import org.koitharu.kotatsu.utils.ext.doOnCurrentItemChanged import org.koitharu.kotatsu.utils.ext.firstItem class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoon), @@ -30,6 +31,7 @@ class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoo adapter = WebtoonAdapter(loader) recyclerView.adapter = adapter recyclerView.addOnScrollListener(ListPaginationListener(2, this)) + recyclerView.doOnCurrentItemChanged(::notifyPageChanged) } override fun onPagesLoaded(chapterId: Long, pages: List, action: Action) { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index 1bbd557b5..dbff12ad9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -172,4 +172,21 @@ fun ViewPager2.doOnPageChanged(callback: (Int) -> Unit) { callback(position) } }) +} + +fun RecyclerView.doOnCurrentItemChanged(callback: (Int) -> Unit) { + addOnScrollListener(object : RecyclerView.OnScrollListener() { + + private var lastItem = -1 + + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + val item = (recyclerView.layoutManager as? LinearLayoutManager) + ?.findFirstVisibleItemPosition() + if (item != null && item != RecyclerView.NO_POSITION && item != lastItem) { + lastItem = item + callback(item) + } + } + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index 0453a7e2b..07dcb89ab 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -1,5 +1,5 @@ - + + - \ No newline at end of file + \ No newline at end of file