Reader fixes
This commit is contained in:
@@ -18,7 +18,7 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen
|
|||||||
|
|
||||||
abstract val hasItems: Boolean
|
abstract val hasItems: Boolean
|
||||||
|
|
||||||
abstract val currentPageIndex: Int
|
protected abstract val currentPageIndex: Int
|
||||||
|
|
||||||
abstract val pages: List<MangaPage>
|
abstract val pages: List<MangaPage>
|
||||||
|
|
||||||
@@ -46,6 +46,11 @@ abstract class BaseReaderFragment(@LayoutRes contentLayoutId: Int) : BaseFragmen
|
|||||||
|
|
||||||
override fun onChaptersLoader(chapters: List<MangaChapter>) = Unit
|
override fun onChaptersLoader(chapters: List<MangaChapter>) = Unit
|
||||||
|
|
||||||
|
override fun onDestroyView() {
|
||||||
|
chaptersMap.clear()
|
||||||
|
super.onDestroyView()
|
||||||
|
}
|
||||||
|
|
||||||
final override fun onPagesLoaded(chapterId: Long, pages: List<MangaPage>) {
|
final override fun onPagesLoaded(chapterId: Long, pages: List<MangaPage>) {
|
||||||
when {
|
when {
|
||||||
chaptersMap.isEmpty() -> {
|
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<MangaPage>? {
|
||||||
|
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 {
|
private fun shouldAppend(chapterId: Long): Boolean {
|
||||||
val chapters = lastState?.manga?.chapters ?: return false
|
val chapters = lastState?.manga?.chapters ?: return false
|
||||||
val lastChapterId = chaptersMap.peekLast()?.first ?: return false
|
val lastChapterId = chaptersMap.peekLast()?.first ?: return false
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
|||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
reader?.let {
|
reader?.let {
|
||||||
state = state.copy(page = it.currentPageIndex)
|
state = state.copy(page = it.findCurrentPageIndex(state.chapterId))
|
||||||
presenter.saveState(state)
|
presenter.saveState(state)
|
||||||
}
|
}
|
||||||
super.onPause()
|
super.onPause()
|
||||||
@@ -126,10 +126,15 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
|||||||
}
|
}
|
||||||
R.id.action_pages_thumbs -> {
|
R.id.action_pages_thumbs -> {
|
||||||
if (reader?.hasItems == true) {
|
if (reader?.hasItems == true) {
|
||||||
PagesThumbnailsSheet.show(
|
val pages = reader?.getPages(state.chapterId)
|
||||||
supportFragmentManager, reader!!.pages,
|
if (pages != null) {
|
||||||
state.chapter?.name ?: title?.toString().orEmpty()
|
PagesThumbnailsSheet.show(
|
||||||
)
|
supportFragmentManager, pages,
|
||||||
|
state.chapter?.name ?: title?.toString().orEmpty()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
showWaitWhileLoading()
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
showWaitWhileLoading()
|
showWaitWhileLoading()
|
||||||
}
|
}
|
||||||
@@ -154,7 +159,9 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onLoadingStateChanged(isLoading: Boolean) {
|
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) {
|
override fun onError(e: Exception) {
|
||||||
@@ -177,15 +184,11 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
|||||||
}
|
}
|
||||||
GridTouchHelper.AREA_TOP,
|
GridTouchHelper.AREA_TOP,
|
||||||
GridTouchHelper.AREA_LEFT -> {
|
GridTouchHelper.AREA_LEFT -> {
|
||||||
reader?.let {
|
reader?.switchPageBy(-1)
|
||||||
it.setCurrentPage(it.currentPageIndex - 1, true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
GridTouchHelper.AREA_BOTTOM,
|
GridTouchHelper.AREA_BOTTOM,
|
||||||
GridTouchHelper.AREA_RIGHT -> {
|
GridTouchHelper.AREA_RIGHT -> {
|
||||||
reader?.let {
|
reader?.switchPageBy(1)
|
||||||
it.setCurrentPage(it.currentPageIndex + 1, true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,7 +228,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
|||||||
|
|
||||||
override fun onReaderModeChanged(mode: ReaderMode) {
|
override fun onReaderModeChanged(mode: ReaderMode) {
|
||||||
reader?.let {
|
reader?.let {
|
||||||
state = state.copy(page = it.currentPageIndex)
|
state = state.copy(page = it.findCurrentPageIndex(state.chapterId))
|
||||||
}
|
}
|
||||||
presenter.saveState(state, mode)
|
presenter.saveState(state, mode)
|
||||||
setReader(mode)
|
setReader(mode)
|
||||||
@@ -248,10 +251,14 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onPageChanged(chapter: MangaChapter, page: Int, total: Int) {
|
override fun onPageChanged(chapter: MangaChapter, page: Int, total: Int) {
|
||||||
title = chapter.name
|
if (chapter.id != state.chapterId) {
|
||||||
state.manga.chapters?.run {
|
title = chapter.name
|
||||||
supportActionBar?.subtitle =
|
state = state.copy(chapterId = chapter.id)
|
||||||
getString(R.string.chapter_d_of_d, chapter.number, size)
|
presenter.saveState(state)
|
||||||
|
state.manga.chapters?.run {
|
||||||
|
supportActionBar?.subtitle =
|
||||||
|
getString(R.string.chapter_d_of_d, chapter.number, size)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
Action.APPEND -> adapter?.appendData(pages)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.koitharu.kotatsu.ui.reader.BaseReaderFragment
|
|||||||
import org.koitharu.kotatsu.ui.reader.OnBoundsScrollListener
|
import org.koitharu.kotatsu.ui.reader.OnBoundsScrollListener
|
||||||
import org.koitharu.kotatsu.ui.reader.PageLoader
|
import org.koitharu.kotatsu.ui.reader.PageLoader
|
||||||
import org.koitharu.kotatsu.ui.reader.ReaderPresenter
|
import org.koitharu.kotatsu.ui.reader.ReaderPresenter
|
||||||
|
import org.koitharu.kotatsu.utils.ext.doOnCurrentItemChanged
|
||||||
import org.koitharu.kotatsu.utils.ext.firstItem
|
import org.koitharu.kotatsu.utils.ext.firstItem
|
||||||
|
|
||||||
class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoon),
|
class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoon),
|
||||||
@@ -30,6 +31,7 @@ class WebtoonReaderFragment : BaseReaderFragment(R.layout.fragment_reader_webtoo
|
|||||||
adapter = WebtoonAdapter(loader)
|
adapter = WebtoonAdapter(loader)
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
recyclerView.addOnScrollListener(ListPaginationListener(2, this))
|
recyclerView.addOnScrollListener(ListPaginationListener(2, this))
|
||||||
|
recyclerView.doOnCurrentItemChanged(::notifyPageChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPagesLoaded(chapterId: Long, pages: List<MangaPage>, action: Action) {
|
override fun onPagesLoaded(chapterId: Long, pages: List<MangaPage>, action: Action) {
|
||||||
|
|||||||
@@ -172,4 +172,21 @@ fun ViewPager2.doOnPageChanged(callback: (Int) -> Unit) {
|
|||||||
callback(position)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<com.google.android.material.circularreveal.CircularRevealFrameLayout
|
<FrameLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/rootLayout"
|
android:id="@+id/rootLayout"
|
||||||
@@ -12,6 +12,15 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBar_bottom"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal" />
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
android:id="@+id/appbar_top"
|
android:id="@+id/appbar_top"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -74,4 +83,4 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</com.google.android.material.circularreveal.CircularRevealFrameLayout>
|
</FrameLayout>
|
||||||
Reference in New Issue
Block a user