diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index d8da70242..de6ccd97c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -85,7 +85,6 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer import eu.kanade.tachiyomi.util.lang.launchIO -import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.system.applySystemAnimatorScale import eu.kanade.tachiyomi.util.system.hasDisplayCutout @@ -162,7 +161,6 @@ class ReaderActivity : EhActivity() { } } var mGalleryProvider: PageLoader2? = null - private var mSize: Int = 0 private var mCurrentIndex: Int = 0 private var mSavingPage = -1 private lateinit var builder: EditTextDialogBuilder @@ -192,9 +190,9 @@ class ReaderActivity : EhActivity() { return EhUrl.getGalleryDetailUrl(gid, token, 0, false) } - private fun buildProvider() { + private fun buildProvider(replace: Boolean = false) { if (mGalleryProvider != null) { - return + if (replace) mGalleryProvider!!.stop() else return } if (ACTION_EH == mAction) { @@ -250,13 +248,17 @@ class ReaderActivity : EhActivity() { } } - private fun onInit() { - val intent = intent ?: return + private fun handleIntent(intent: Intent?) { + intent ?: return mAction = intent.action mFilename = intent.getStringExtra(KEY_FILENAME) mUri = intent.data mGalleryInfo = intent.getParcelableExtraCompat(KEY_GALLERY_INFO) mPage = intent.getIntExtra(KEY_PAGE, -1) + } + + private fun onInit() { + handleIntent(intent) buildProvider() } @@ -270,6 +272,21 @@ class ReaderActivity : EhActivity() { buildProvider() } + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + handleIntent(intent) + buildProvider(true) + mGalleryProvider?.let { + lifecycleScope.launchIO { + it.start() + if (it.awaitReady()) withUIContext { + viewer?.setGalleryProvider(it) + moveToPageIndex(0) + } + } + } + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString(KEY_ACTION, mAction) @@ -299,10 +316,6 @@ class ReaderActivity : EhActivity() { builder.setPositiveButton(getString(android.R.string.ok), null) dialog = builder.create() dialog.setCanceledOnTouchOutside(false) - if (mGalleryProvider == null) { - finish() - return - } mGalleryProvider.let { if (it == null) { @@ -325,9 +338,10 @@ class ReaderActivity : EhActivity() { dialog.dismiss() // Get start page - if (mCurrentIndex == 0) mCurrentIndex = if (mPage >= 0) mPage else mGalleryProvider!!.startPage - mSize = mGalleryProvider!!.size - val viewerMode = ReadingModeType.fromPreference(readerPreferences.defaultReadingMode().get()) + if (mCurrentIndex == 0) + mCurrentIndex = if (mPage >= 0) mPage else mGalleryProvider!!.startPage + val viewerMode = + ReadingModeType.fromPreference(readerPreferences.defaultReadingMode().get()) binding.actionReadingMode.setImageResource(viewerMode.iconRes) viewer?.destroy() viewer = ReadingModeType.toViewer(readerPreferences.defaultReadingMode().get(), this) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt index 79709db80..71fce9ade 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt @@ -47,7 +47,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { /** * Currently active item. It can be a chapter page or a chapter transition. */ - private var currentPage: Any? = null + private var currentPage: ReaderPage? = null /** * Viewer chapters to set when the pager enters idle mode. Otherwise, if the view was settling @@ -153,27 +153,14 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { .firstOrNull { it.item == page } /** - * Called when a new page (either a [ReaderPage] or [ChapterTransition]) is marked as active + * Called when a new [ReaderPage] is marked as active */ private fun onPageChange(position: Int) { val page = adapter.items.getOrNull(position) if (page != null && currentPage != page) { - val forward = when { - currentPage is ReaderPage && page is ReaderPage -> { - // if both pages have the same number, it's a split page with an InsertPage - if (page.number == (currentPage as ReaderPage).number) { - // the InsertPage is always the second in the reading direction - false - } else { - page.number > (currentPage as ReaderPage).number - } - } - else -> true - } + val forward = page.number > (currentPage?.number ?: 0) currentPage = page - when (page) { - is ReaderPage -> onReaderPageSelected(page, forward) - } + onReaderPageSelected(page, forward) } } @@ -206,6 +193,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { private fun setChaptersInternal(chapters: PageLoader) { logcat { "setChaptersInternal" } adapter.setChapters(chapters) + refreshAdapter(0) // Layout the pager once a chapter is being set if (pager.isGone) { @@ -251,7 +239,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { */ protected open fun moveRight() { if (pager.currentItem != adapter.count - 1) { - val holder = (currentPage as? ReaderPage)?.let { getPageHolder(it) } + val holder = currentPage?.let { getPageHolder(it) } if (holder != null && config.navigateToPan && holder.canPanRight()) { holder.panRight() } else { @@ -265,7 +253,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { */ protected open fun moveLeft() { if (pager.currentItem != 0) { - val holder = (currentPage as? ReaderPage)?.let { getPageHolder(it) } + val holder = currentPage?.let { getPageHolder(it) } if (holder != null && config.navigateToPan && holder.canPanLeft()) { holder.panLeft() } else { @@ -292,8 +280,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { * Resets the adapter in order to recreate all the views. Used when a image configuration is * changed. */ - private fun refreshAdapter() { - val currentItem = pager.currentItem + private fun refreshAdapter(currentItem: Int = pager.currentItem) { adapter.refresh() pager.adapter = adapter pager.setCurrentItem(currentItem, false) @@ -318,6 +305,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { if (!config.volumeKeysInverted) moveDown() else moveUp() } } + KeyEvent.KEYCODE_VOLUME_UP -> { if (!config.volumeKeysEnabled || activity.menuVisible) { return false @@ -325,16 +313,19 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { if (!config.volumeKeysInverted) moveUp() else moveDown() } } + KeyEvent.KEYCODE_DPAD_RIGHT -> { if (isUp) { if (ctrlPressed) moveToNext() else moveRight() } } + KeyEvent.KEYCODE_DPAD_LEFT -> { if (isUp) { if (ctrlPressed) moveToPrevious() else moveLeft() } } + KeyEvent.KEYCODE_DPAD_DOWN -> if (isUp) moveDown() KeyEvent.KEYCODE_DPAD_UP -> if (isUp) moveUp() KeyEvent.KEYCODE_PAGE_DOWN -> if (isUp) moveDown() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt index 8d5536f4e..83545d85a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt @@ -39,8 +39,6 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { if (viewer is R2LPagerViewer) { items = items.asReversed() } - - notifyDataSetChanged() } /** @@ -60,7 +58,7 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { } override fun destroyView(container: ViewGroup, position: Int, view: View) { - val item = items[position] + val item = (view as PagerPageHolder).item currentChapter?.cancelRequest(item.index) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index dbe3c88dc..eba9e3468 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -155,6 +155,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr */ override fun setGalleryProvider(provider: PageLoader) { adapter.setChapters(provider) + refreshAdapter(0) if (recycler.isGone) { logcat { "Recycler first layout" } @@ -181,9 +182,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr val item = adapter.items.getOrNull(position) if (item != null && currentPage != item) { currentPage = item - when (item) { - is ReaderPage -> onPageSelected(item) - } + onPageSelected(item) } } @@ -265,8 +264,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr * Notifies adapter of changes around the current page to trigger a relayout in the recycler. * Used when an image configuration is changed. */ - private fun refreshAdapter() { - val position = layoutManager.findLastEndVisibleItemPosition() + private fun refreshAdapter(position: Int = layoutManager.findLastEndVisibleItemPosition()) { val positionStart = maxOf(0, position - 3) val positionEnd = minOf(position + 3, adapter.itemCount - 1) adapter.refresh()