|
|
|
@ -4,16 +4,18 @@ import android.os.Bundle
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.core.view.children
|
|
|
|
import androidx.core.view.children
|
|
|
|
|
|
|
|
import com.google.android.material.snackbar.Snackbar
|
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
import kotlinx.coroutines.async
|
|
|
|
import kotlinx.coroutines.async
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
import kotlinx.coroutines.coroutineScope
|
|
|
|
|
|
|
|
import kotlinx.coroutines.yield
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.R
|
|
|
|
import org.koitharu.kotatsu.core.os.NetworkState
|
|
|
|
import org.koitharu.kotatsu.core.os.NetworkState
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.observe
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.observe
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.resetTransformations
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.resetTransformations
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding
|
|
|
|
import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding
|
|
|
|
import org.koitharu.kotatsu.reader.domain.PageLoader
|
|
|
|
import org.koitharu.kotatsu.reader.domain.PageLoader
|
|
|
|
import org.koitharu.kotatsu.reader.ui.ReaderState
|
|
|
|
import org.koitharu.kotatsu.reader.ui.ReaderState
|
|
|
|
@ -33,8 +35,6 @@ class ReversedReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>
|
|
|
|
@Inject
|
|
|
|
@Inject
|
|
|
|
lateinit var pageLoader: PageLoader
|
|
|
|
lateinit var pageLoader: PageLoader
|
|
|
|
|
|
|
|
|
|
|
|
private var pagerAdapter: ReversedPagesAdapter? = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onCreateViewBinding(
|
|
|
|
override fun onCreateViewBinding(
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
container: ViewGroup?,
|
|
|
|
container: ViewGroup?,
|
|
|
|
@ -42,15 +42,8 @@ class ReversedReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>
|
|
|
|
|
|
|
|
|
|
|
|
override fun onViewBindingCreated(binding: FragmentReaderStandardBinding, savedInstanceState: Bundle?) {
|
|
|
|
override fun onViewBindingCreated(binding: FragmentReaderStandardBinding, savedInstanceState: Bundle?) {
|
|
|
|
super.onViewBindingCreated(binding, savedInstanceState)
|
|
|
|
super.onViewBindingCreated(binding, savedInstanceState)
|
|
|
|
pagerAdapter = ReversedPagesAdapter(
|
|
|
|
|
|
|
|
lifecycleOwner = viewLifecycleOwner,
|
|
|
|
|
|
|
|
loader = pageLoader,
|
|
|
|
|
|
|
|
settings = viewModel.readerSettings,
|
|
|
|
|
|
|
|
networkState = networkState,
|
|
|
|
|
|
|
|
exceptionResolver = exceptionResolver,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
with(binding.pager) {
|
|
|
|
with(binding.pager) {
|
|
|
|
adapter = pagerAdapter
|
|
|
|
adapter = readerAdapter
|
|
|
|
offscreenPageLimit = 2
|
|
|
|
offscreenPageLimit = 2
|
|
|
|
doOnPageChanged(::notifyPageChanged)
|
|
|
|
doOnPageChanged(::notifyPageChanged)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -67,11 +60,18 @@ class ReversedReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onDestroyView() {
|
|
|
|
override fun onDestroyView() {
|
|
|
|
pagerAdapter = null
|
|
|
|
|
|
|
|
requireViewBinding().pager.adapter = null
|
|
|
|
requireViewBinding().pager.adapter = null
|
|
|
|
super.onDestroyView()
|
|
|
|
super.onDestroyView()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onCreateAdapter() = ReversedPagesAdapter(
|
|
|
|
|
|
|
|
lifecycleOwner = viewLifecycleOwner,
|
|
|
|
|
|
|
|
loader = pageLoader,
|
|
|
|
|
|
|
|
settings = viewModel.readerSettings,
|
|
|
|
|
|
|
|
networkState = networkState,
|
|
|
|
|
|
|
|
exceptionResolver = exceptionResolver,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
override fun switchPageBy(delta: Int) {
|
|
|
|
override fun switchPageBy(delta: Int) {
|
|
|
|
with(requireViewBinding().pager) {
|
|
|
|
with(requireViewBinding().pager) {
|
|
|
|
setCurrentItem(currentItem - delta, context.isAnimationsEnabled)
|
|
|
|
setCurrentItem(currentItem - delta, context.isAnimationsEnabled)
|
|
|
|
@ -87,26 +87,28 @@ class ReversedReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onPagesChanged(pages: List<ReaderPage>, pendingState: ReaderState?) {
|
|
|
|
override suspend fun onPagesChanged(pages: List<ReaderPage>, pendingState: ReaderState?) = coroutineScope {
|
|
|
|
val reversedPages = pages.asReversed()
|
|
|
|
val reversedPages = pages.asReversed()
|
|
|
|
viewLifecycleScope.launch {
|
|
|
|
|
|
|
|
val items = async {
|
|
|
|
val items = async {
|
|
|
|
pagerAdapter?.setItems(reversedPages)
|
|
|
|
requireAdapter().setItems(reversedPages)
|
|
|
|
|
|
|
|
yield()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (pendingState != null) {
|
|
|
|
if (pendingState != null) {
|
|
|
|
val position = reversedPages.indexOfLast {
|
|
|
|
val position = reversedPages.indexOfLast {
|
|
|
|
it.chapterId == pendingState.chapterId && it.index == pendingState.page
|
|
|
|
it.chapterId == pendingState.chapterId && it.index == pendingState.page
|
|
|
|
}
|
|
|
|
}
|
|
|
|
items.await() ?: return@launch
|
|
|
|
items.await()
|
|
|
|
if (position != -1) {
|
|
|
|
if (position != -1) {
|
|
|
|
requireViewBinding().pager.setCurrentItem(position, false)
|
|
|
|
requireViewBinding().pager.setCurrentItem(position, false)
|
|
|
|
notifyPageChanged(position)
|
|
|
|
notifyPageChanged(position)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Snackbar.make(requireView(), R.string.not_found_404, Snackbar.LENGTH_SHORT)
|
|
|
|
|
|
|
|
.show()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
items.await()
|
|
|
|
items.await()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun getCurrentState(): ReaderState? = viewBinding?.run {
|
|
|
|
override fun getCurrentState(): ReaderState? = viewBinding?.run {
|
|
|
|
val adapter = pager.adapter as? BaseReaderAdapter<*>
|
|
|
|
val adapter = pager.adapter as? BaseReaderAdapter<*>
|
|
|
|
@ -123,6 +125,6 @@ class ReversedReaderFragment : BaseReaderFragment<FragmentReaderStandardBinding>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun reversed(position: Int): Int {
|
|
|
|
private fun reversed(position: Int): Int {
|
|
|
|
return ((pagerAdapter?.itemCount ?: 0) - position - 1).coerceAtLeast(0)
|
|
|
|
return ((readerAdapter?.itemCount ?: 0) - position - 1).coerceAtLeast(0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|