Change PageLoader lifecycle

This commit is contained in:
Koitharu
2023-03-13 18:14:25 +02:00
parent 8294eb4ecd
commit b4e0704a3a
7 changed files with 37 additions and 30 deletions

View File

@@ -23,6 +23,7 @@ import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.local.data.PagesCache
import org.koitharu.kotatsu.local.domain.LocalMangaRepository
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.utils.ext.processLifecycleScope
import javax.inject.Inject
@@ -125,6 +126,7 @@ class KotatsuApp : Application(), Configuration.Provider {
.setClassInstanceLimit(LocalMangaRepository::class.java, 1)
.setClassInstanceLimit(PagesCache::class.java, 1)
.setClassInstanceLimit(MangaLoaderContext::class.java, 1)
.setClassInstanceLimit(PageLoader::class.java, 1)
.penaltyLog()
.build(),
)

View File

@@ -5,6 +5,9 @@ import android.graphics.BitmapFactory
import android.net.Uri
import androidx.collection.LongSparseArray
import androidx.collection.set
import dagger.hilt.android.ActivityRetainedLifecycle
import dagger.hilt.android.lifecycle.RetainedLifecycle
import dagger.hilt.android.scopes.ActivityRetainedScoped
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -18,7 +21,6 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import okhttp3.OkHttpClient
import okhttp3.Request
import okio.Closeable
import org.koitharu.kotatsu.core.network.CommonHeaders
import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
@@ -42,12 +44,18 @@ import kotlin.coroutines.CoroutineContext
private const val PROGRESS_UNDEFINED = -1f
private const val PREFETCH_LIMIT_DEFAULT = 10
@ActivityRetainedScoped
class PageLoader @Inject constructor(
lifecycle: ActivityRetainedLifecycle,
private val okHttp: OkHttpClient,
private val cache: PagesCache,
private val settings: AppSettings,
private val mangaRepositoryFactory: MangaRepository.Factory,
) : Closeable {
) : RetainedLifecycle.OnClearedListener {
init {
lifecycle.addOnClearedListener(this)
}
val loaderScope = CoroutineScope(SupervisorJob() + InternalErrorHandler() + Dispatchers.Default)
@@ -59,7 +67,7 @@ class PageLoader @Inject constructor(
private val counter = AtomicInteger(0)
private var prefetchQueueLimit = PREFETCH_LIMIT_DEFAULT // TODO adaptive
override fun close() {
override fun onCleared() {
loaderScope.cancel()
synchronized(tasks) {
tasks.clear()

View File

@@ -56,7 +56,6 @@ import org.koitharu.kotatsu.utils.ext.requireValue
import org.koitharu.kotatsu.utils.ext.runCatchingCancellable
import java.util.Date
import javax.inject.Inject
import javax.inject.Provider
private const val BOUNDS_PAGE_OFFSET = 2
private const val PREFETCH_LIMIT = 10
@@ -70,7 +69,7 @@ class ReaderViewModel @Inject constructor(
private val bookmarksRepository: BookmarksRepository,
private val settings: AppSettings,
private val pageSaveHelper: PageSaveHelper,
pageLoaderFactory: Provider<PageLoader>,
private val pageLoader: PageLoader,
) : BaseViewModel() {
private val intent = MangaIntent(savedStateHandle)
@@ -84,7 +83,6 @@ class ReaderViewModel @Inject constructor(
private val chapters: LongSparseArray<MangaChapter>
get() = chaptersLoader.chapters
val pageLoader = pageLoaderFactory.get()
private val chaptersLoader = ChaptersLoader(mangaRepositoryFactory)
val readerMode = MutableLiveData<ReaderMode>()
@@ -148,10 +146,10 @@ class ReaderViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
override fun onCleared() {
/*override fun onCleared() {
pageLoader.close()
super.onCleared()
}
}*/
fun reload() {
loadingJob?.cancel()

View File

@@ -10,6 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.async
import org.koitharu.kotatsu.core.os.NetworkState
import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding
import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.pager.BaseReader
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
@@ -28,6 +29,9 @@ class ReversedReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
@Inject
lateinit var networkState: NetworkState
@Inject
lateinit var pageLoader: PageLoader
private var pagerAdapter: ReversedPagesAdapter? = null
override fun onInflateView(
@@ -40,7 +44,7 @@ class ReversedReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
super.onViewCreated(view, savedInstanceState)
pagerAdapter = ReversedPagesAdapter(
lifecycleOwner = viewLifecycleOwner,
loader = viewModel.pageLoader,
loader = pageLoader,
settings = viewModel.readerSettings,
networkState = networkState,
exceptionResolver = exceptionResolver,

View File

@@ -10,6 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.async
import org.koitharu.kotatsu.core.os.NetworkState
import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding
import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.pager.BaseReader
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
@@ -27,6 +28,9 @@ class PagerReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
@Inject
lateinit var networkState: NetworkState
@Inject
lateinit var pageLoader: PageLoader
private var pagesAdapter: PagesAdapter? = null
override fun onInflateView(
@@ -39,7 +43,7 @@ class PagerReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
super.onViewCreated(view, savedInstanceState)
pagesAdapter = PagesAdapter(
lifecycleOwner = viewLifecycleOwner,
loader = viewModel.pageLoader,
loader = pageLoader,
settings = viewModel.readerSettings,
networkState = networkState,
exceptionResolver = exceptionResolver,

View File

@@ -9,6 +9,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.async
import org.koitharu.kotatsu.core.os.NetworkState
import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding
import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.pager.BaseReader
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
@@ -24,6 +25,9 @@ class WebtoonReaderFragment : BaseReader<FragmentReaderWebtoonBinding>() {
@Inject
lateinit var networkState: NetworkState
@Inject
lateinit var pageLoader: PageLoader
private val scrollInterpolator = AccelerateDecelerateInterpolator()
private var webtoonAdapter: WebtoonAdapter? = null
@@ -36,7 +40,7 @@ class WebtoonReaderFragment : BaseReader<FragmentReaderWebtoonBinding>() {
super.onViewCreated(view, savedInstanceState)
webtoonAdapter = WebtoonAdapter(
lifecycleOwner = viewLifecycleOwner,
loader = viewModel.pageLoader,
loader = pageLoader,
settings = viewModel.readerSettings,
networkState = networkState,
exceptionResolver = exceptionResolver,

View File

@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.viewModels
import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.GridLayoutManager
import coil.ImageLoader
@@ -21,14 +20,11 @@ import org.koitharu.kotatsu.databinding.SheetPagesBinding
import org.koitharu.kotatsu.list.ui.MangaListSpanResolver
import org.koitharu.kotatsu.parsers.model.MangaPage
import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.ReaderActivity
import org.koitharu.kotatsu.reader.ui.ReaderViewModel
import org.koitharu.kotatsu.reader.ui.thumbnails.adapter.PageThumbnailAdapter
import org.koitharu.kotatsu.utils.ext.getParcelableCompat
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
import org.koitharu.kotatsu.utils.ext.withArgs
import javax.inject.Inject
import javax.inject.Provider
@AndroidEntryPoint
class PagesThumbnailsSheet :
@@ -40,7 +36,7 @@ class PagesThumbnailsSheet :
lateinit var mangaRepositoryFactory: MangaRepository.Factory
@Inject
lateinit var pageLoaderProvider: Provider<PageLoader>
lateinit var pageLoader: PageLoader
@Inject
lateinit var coil: ImageLoader
@@ -51,7 +47,6 @@ class PagesThumbnailsSheet :
private lateinit var thumbnails: List<PageThumbnail>
private var spanResolver: MangaListSpanResolver? = null
private var currentPageIndex = -1
private var pageLoader: PageLoader? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -79,11 +74,10 @@ class PagesThumbnailsSheet :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val title = arguments?.getString(ARG_TITLE)
spanResolver = MangaListSpanResolver(view.resources)
with(binding.headerBar) {
toolbar.title = title
toolbar.subtitle = null
title = arguments?.getString(ARG_TITLE)
subtitle = null
addOnExpansionChangeListener(this@PagesThumbnailsSheet)
}
@@ -95,7 +89,7 @@ class PagesThumbnailsSheet :
dataSet = thumbnails,
coil = coil,
scope = viewLifecycleScope,
loader = getPageLoader(),
loader = pageLoader,
clickListener = this@PagesThumbnailsSheet,
)
addOnLayoutChangeListener(spanResolver)
@@ -110,8 +104,6 @@ class PagesThumbnailsSheet :
override fun onDestroyView() {
super.onDestroyView()
spanResolver = null
pageLoader?.close()
pageLoader = null
}
override fun onItemClick(item: MangaPage, view: View) {
@@ -126,21 +118,16 @@ class PagesThumbnailsSheet :
override fun onExpansionStateChanged(headerBar: BottomSheetHeaderBar, isExpanded: Boolean) {
if (isExpanded) {
headerBar.toolbar.subtitle = resources.getQuantityString(
headerBar.subtitle = resources.getQuantityString(
R.plurals.pages,
thumbnails.size,
thumbnails.size,
)
} else {
headerBar.toolbar.subtitle = null
headerBar.subtitle = null
}
}
private fun getPageLoader(): PageLoader {
val viewModel = (activity as? ReaderActivity)?.viewModels<ReaderViewModel>()?.value
return viewModel?.pageLoader ?: pageLoaderProvider.get().also { pageLoader = it }
}
companion object {
private const val ARG_PAGES = "pages"