Some fixes for favourites

pull/26/head
Koitharu 5 years ago
parent 6b529f806f
commit 71a5801a0c

@ -3,15 +3,14 @@ package org.koitharu.kotatsu.base.domain
import okhttp3.* import okhttp3.*
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.get import org.koin.core.component.get
import org.koin.core.component.inject
import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.core.prefs.SourceSettings import org.koitharu.kotatsu.core.prefs.SourceSettings
import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.await
open class MangaLoaderContext : KoinComponent { open class MangaLoaderContext(
private val okHttp: OkHttpClient,
private val okHttp by inject<OkHttpClient>() private val cookieJar: CookieJar
private val cookieJar by inject<CookieJar>() ) : KoinComponent {
suspend fun httpGet(url: String): Response { suspend fun httpGet(url: String): Response {
val request = Request.Builder() val request = Request.Builder()

@ -9,7 +9,7 @@ import org.koitharu.kotatsu.core.parser.site.*
val parserModule val parserModule
get() = module { get() = module {
single { MangaLoaderContext() } single { MangaLoaderContext(get(), get()) }
factory<MangaRepository>(named(MangaSource.READMANGA_RU)) { ReadmangaRepository(get()) } factory<MangaRepository>(named(MangaSource.READMANGA_RU)) { ReadmangaRepository(get()) }
factory<MangaRepository>(named(MangaSource.MINTMANGA)) { MintMangaRepository(get()) } factory<MangaRepository>(named(MangaSource.MINTMANGA)) { MintMangaRepository(get()) }

@ -1,6 +1,7 @@
package org.koitharu.kotatsu.favourites.ui package org.koitharu.kotatsu.favourites.ui
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.view.* import android.view.*
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
@ -21,14 +22,15 @@ class FavouritesContainerFragment : BaseFragment<FragmentFavouritesBinding>(),
FavouritesTabLongClickListener, CategoriesEditDelegate.CategoriesEditCallback { FavouritesTabLongClickListener, CategoriesEditDelegate.CategoriesEditCallback {
private val viewModel by viewModel<FavouritesCategoriesViewModel>() private val viewModel by viewModel<FavouritesCategoriesViewModel>()
private val editDelegate by lazy(LazyThreadSafetyMode.NONE) { private val editDelegate by lazy(LazyThreadSafetyMode.NONE) {
CategoriesEditDelegate(requireContext(), this) CategoriesEditDelegate(requireContext(), this)
} }
private var adapterState: Parcelable? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
adapterState = savedInstanceState?.getParcelable(KEY_ADAPTER_STATE) ?: adapterState
} }
override fun onInflateView( override fun onInflateView(
@ -39,6 +41,7 @@ class FavouritesContainerFragment : BaseFragment<FragmentFavouritesBinding>(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val adapter = FavouritesPagerAdapter(this, this) val adapter = FavouritesPagerAdapter(this, this)
adapterState?.let(adapter::restoreState)
binding.pager.adapter = adapter binding.pager.adapter = adapter
TabLayoutMediator(binding.tabs, binding.pager, adapter).attach() TabLayoutMediator(binding.tabs, binding.pager, adapter).attach()
@ -46,6 +49,16 @@ class FavouritesContainerFragment : BaseFragment<FragmentFavouritesBinding>(),
viewModel.onError.observe(viewLifecycleOwner, ::onError) 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<FavouriteCategory>) { private fun onCategoriesChanged(categories: List<FavouriteCategory>) {
val data = ArrayList<FavouriteCategory>(categories.size + 1) val data = ArrayList<FavouriteCategory>(categories.size + 1)
data += FavouriteCategory(0L, getString(R.string.all_favourites), -1, Date()) data += FavouriteCategory(0L, getString(R.string.all_favourites), -1, Date())
@ -103,6 +116,8 @@ class FavouritesContainerFragment : BaseFragment<FragmentFavouritesBinding>(),
companion object { companion object {
private const val KEY_ADAPTER_STATE = "adapter_state"
fun newInstance() = FavouritesContainerFragment() fun newInstance() = FavouritesContainerFragment()
} }
} }

@ -71,6 +71,8 @@ class CategoriesActivity : BaseActivity<ActivityCategoriesBinding>(),
} }
private fun onCategoriesChanged(categories: List<FavouriteCategory>) { private fun onCategoriesChanged(categories: List<FavouriteCategory>) {
// TODO check if not moved
adapter.items = categories adapter.items = categories
binding.textViewHolder.isVisible = categories.isEmpty() binding.textViewHolder.isVisible = categories.isEmpty()
} }

@ -12,6 +12,11 @@ class CategoriesAdapter(
init { init {
delegatesManager.addDelegate(categoryAD(onItemClickListener)) delegatesManager.addDelegate(categoryAD(onItemClickListener))
setHasStableIds(true)
}
override fun getItemId(position: Int): Long {
return items[position].id
} }
private class DiffCallback : DiffUtil.ItemCallback<FavouriteCategory>() { private class DiffCallback : DiffUtil.ItemCallback<FavouriteCategory>() {

@ -1,6 +1,7 @@
package org.koitharu.kotatsu.parsers package org.koitharu.kotatsu.parsers
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import okhttp3.CookieJar
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.junit.Assert import org.junit.Assert
import org.junit.BeforeClass import org.junit.BeforeClass
@ -11,10 +12,10 @@ import org.koin.core.context.startKoin
import org.koin.dsl.module import org.koin.dsl.module
import org.koin.test.KoinTest import org.koin.test.KoinTest
import org.koin.test.get import org.koin.test.get
import org.koitharu.kotatsu.base.domain.MangaLoaderContext
import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.core.network.UserAgentInterceptor import org.koitharu.kotatsu.core.network.UserAgentInterceptor
import org.koitharu.kotatsu.core.prefs.SourceSettings import org.koitharu.kotatsu.core.prefs.SourceSettings
import org.koitharu.kotatsu.base.domain.MangaLoaderContext
import org.koitharu.kotatsu.utils.AssertX import org.koitharu.kotatsu.utils.AssertX
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -91,28 +92,27 @@ class RemoteRepositoryTest(source: MangaSource) : KoinTest {
@BeforeClass @BeforeClass
fun initialize() { fun initialize() {
startKoin { startKoin {
modules(listOf( modules(
module { module {
single<CookieJar> { TemporaryCookieJar() }
factory { factory {
OkHttpClient.Builder() OkHttpClient.Builder()
.cookieJar(TemporaryCookieJar()) .cookieJar(get())
.addInterceptor(UserAgentInterceptor()) .addInterceptor(UserAgentInterceptor())
.connectTimeout(20, TimeUnit.SECONDS) .connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS)
.build() .build()
} }
},
module {
single<MangaLoaderContext> { single<MangaLoaderContext> {
object : MangaLoaderContext() { object : MangaLoaderContext(get(), get()) {
override fun getSettings(source: MangaSource): SourceSettings { override fun getSettings(source: MangaSource): SourceSettings {
return SourceSettingsMock() return SourceSettingsMock()
} }
} }
} }
} }
)) )
} }
} }

Loading…
Cancel
Save