diff --git a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaLoaderContext.kt b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaLoaderContext.kt index 45f561580..6d9c92ed3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaLoaderContext.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/domain/MangaLoaderContext.kt @@ -3,15 +3,14 @@ package org.koitharu.kotatsu.base.domain import okhttp3.* import org.koin.core.component.KoinComponent import org.koin.core.component.get -import org.koin.core.component.inject import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.SourceSettings import org.koitharu.kotatsu.utils.ext.await -open class MangaLoaderContext : KoinComponent { - - private val okHttp by inject() - private val cookieJar by inject() +open class MangaLoaderContext( + private val okHttp: OkHttpClient, + private val cookieJar: CookieJar +) : KoinComponent { suspend fun httpGet(url: String): Response { val request = Request.Builder() diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt index a1b2ae7e1..4fbfbdcbb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.core.parser.site.* val parserModule get() = module { - single { MangaLoaderContext() } + single { MangaLoaderContext(get(), get()) } factory(named(MangaSource.READMANGA_RU)) { ReadmangaRepository(get()) } factory(named(MangaSource.MINTMANGA)) { MintMangaRepository(get()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesContainerFragment.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesContainerFragment.kt index 53e879978..de1ec4435 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesContainerFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/FavouritesContainerFragment.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.favourites.ui import android.os.Bundle +import android.os.Parcelable import android.view.* import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayoutMediator @@ -21,14 +22,15 @@ class FavouritesContainerFragment : BaseFragment(), FavouritesTabLongClickListener, CategoriesEditDelegate.CategoriesEditCallback { private val viewModel by viewModel() - private val editDelegate by lazy(LazyThreadSafetyMode.NONE) { CategoriesEditDelegate(requireContext(), this) } + private var adapterState: Parcelable? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) + adapterState = savedInstanceState?.getParcelable(KEY_ADAPTER_STATE) ?: adapterState } override fun onInflateView( @@ -39,6 +41,7 @@ class FavouritesContainerFragment : BaseFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val adapter = FavouritesPagerAdapter(this, this) + adapterState?.let(adapter::restoreState) binding.pager.adapter = adapter TabLayoutMediator(binding.tabs, binding.pager, adapter).attach() @@ -46,6 +49,16 @@ class FavouritesContainerFragment : BaseFragment(), viewModel.onError.observe(viewLifecycleOwner, ::onError) } + override fun onDestroyView() { + adapterState = (binding.pager.adapter as? FavouritesPagerAdapter)?.saveState() + super.onDestroyView() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(KEY_ADAPTER_STATE, adapterState) + } + private fun onCategoriesChanged(categories: List) { val data = ArrayList(categories.size + 1) data += FavouriteCategory(0L, getString(R.string.all_favourites), -1, Date()) @@ -103,6 +116,8 @@ class FavouritesContainerFragment : BaseFragment(), companion object { + private const val KEY_ADAPTER_STATE = "adapter_state" + fun newInstance() = FavouritesContainerFragment() } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt index 9f4b548c6..34483bb43 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt @@ -71,6 +71,8 @@ class CategoriesActivity : BaseActivity(), } private fun onCategoriesChanged(categories: List) { + // TODO check if not moved + adapter.items = categories binding.textViewHolder.isVisible = categories.isEmpty() } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesAdapter.kt index dff4d6501..aa6d262b0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesAdapter.kt @@ -12,6 +12,11 @@ class CategoriesAdapter( init { delegatesManager.addDelegate(categoryAD(onItemClickListener)) + setHasStableIds(true) + } + + override fun getItemId(position: Int): Long { + return items[position].id } private class DiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt index a02576547..36328223b 100644 --- a/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt +++ b/app/src/test/java/org/koitharu/kotatsu/parsers/RemoteRepositoryTest.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.parsers import kotlinx.coroutines.runBlocking +import okhttp3.CookieJar import okhttp3.OkHttpClient import org.junit.Assert import org.junit.BeforeClass @@ -11,10 +12,10 @@ import org.koin.core.context.startKoin import org.koin.dsl.module import org.koin.test.KoinTest import org.koin.test.get +import org.koitharu.kotatsu.base.domain.MangaLoaderContext import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.network.UserAgentInterceptor import org.koitharu.kotatsu.core.prefs.SourceSettings -import org.koitharu.kotatsu.base.domain.MangaLoaderContext import org.koitharu.kotatsu.utils.AssertX import java.util.concurrent.TimeUnit @@ -91,28 +92,27 @@ class RemoteRepositoryTest(source: MangaSource) : KoinTest { @BeforeClass fun initialize() { startKoin { - modules(listOf( + modules( module { + single { TemporaryCookieJar() } factory { OkHttpClient.Builder() - .cookieJar(TemporaryCookieJar()) + .cookieJar(get()) .addInterceptor(UserAgentInterceptor()) .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) .build() } - }, - module { single { - object : MangaLoaderContext() { + object : MangaLoaderContext(get(), get()) { override fun getSettings(source: MangaSource): SourceSettings { return SourceSettingsMock() } } } } - )) + ) } }