From b4e0704a3a0037710672eb93fadd096b0deec148 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 13 Mar 2023 18:14:25 +0200 Subject: [PATCH] Change PageLoader lifecycle --- .../java/org/koitharu/kotatsu/KotatsuApp.kt | 2 ++ .../kotatsu/reader/domain/PageLoader.kt | 14 ++++++++--- .../kotatsu/reader/ui/ReaderViewModel.kt | 8 +++--- .../pager/reversed/ReversedReaderFragment.kt | 6 ++++- .../ui/pager/standard/PagerReaderFragment.kt | 6 ++++- .../ui/pager/webtoon/WebtoonReaderFragment.kt | 6 ++++- .../ui/thumbnails/PagesThumbnailsSheet.kt | 25 +++++-------------- 7 files changed, 37 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index fdae94568..57ce0686c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -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(), ) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt index 496c0270e..c92ce338f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt @@ -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() diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index f4c28fe7d..2c3f63a87 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -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, + private val pageLoader: PageLoader, ) : BaseViewModel() { private val intent = MangaIntent(savedStateHandle) @@ -84,7 +83,6 @@ class ReaderViewModel @Inject constructor( private val chapters: LongSparseArray get() = chaptersLoader.chapters - val pageLoader = pageLoaderFactory.get() private val chaptersLoader = ChaptersLoader(mangaRepositoryFactory) val readerMode = MutableLiveData() @@ -148,10 +146,10 @@ class ReaderViewModel @Inject constructor( }.launchIn(viewModelScope) } - override fun onCleared() { + /*override fun onCleared() { pageLoader.close() super.onCleared() - } + }*/ fun reload() { loadingJob?.cancel() diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt index d8f7b9b99..d2a87ab44 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt @@ -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() { @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() { super.onViewCreated(view, savedInstanceState) pagerAdapter = ReversedPagesAdapter( lifecycleOwner = viewLifecycleOwner, - loader = viewModel.pageLoader, + loader = pageLoader, settings = viewModel.readerSettings, networkState = networkState, exceptionResolver = exceptionResolver, diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt index af20be177..56a414baf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt @@ -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() { @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() { super.onViewCreated(view, savedInstanceState) pagesAdapter = PagesAdapter( lifecycleOwner = viewLifecycleOwner, - loader = viewModel.pageLoader, + loader = pageLoader, settings = viewModel.readerSettings, networkState = networkState, exceptionResolver = exceptionResolver, diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt index 072e42169..80b48b1a6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt @@ -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() { @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() { super.onViewCreated(view, savedInstanceState) webtoonAdapter = WebtoonAdapter( lifecycleOwner = viewLifecycleOwner, - loader = viewModel.pageLoader, + loader = pageLoader, settings = viewModel.readerSettings, networkState = networkState, exceptionResolver = exceptionResolver, diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt index 8a60e6a4e..0d9ca8b22 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt @@ -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 + lateinit var pageLoader: PageLoader @Inject lateinit var coil: ImageLoader @@ -51,7 +47,6 @@ class PagesThumbnailsSheet : private lateinit var thumbnails: List 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()?.value - return viewModel?.pageLoader ?: pageLoaderProvider.get().also { pageLoader = it } - } - companion object { private const val ARG_PAGES = "pages"