|
|
|
@ -1,25 +1,31 @@
|
|
|
|
package org.koitharu.kotatsu.favourites.ui.container
|
|
|
|
package org.koitharu.kotatsu.favourites.ui.container
|
|
|
|
|
|
|
|
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.AdapterListUpdateCallback
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.AsyncDifferConfig
|
|
|
|
import androidx.recyclerview.widget.AsyncListDiffer
|
|
|
|
import androidx.recyclerview.widget.AsyncListDiffer
|
|
|
|
import androidx.recyclerview.widget.DiffUtil
|
|
|
|
import androidx.recyclerview.widget.DiffUtil
|
|
|
|
import androidx.viewpager2.adapter.FragmentStateAdapter
|
|
|
|
import androidx.viewpager2.adapter.FragmentStateAdapter
|
|
|
|
import com.google.android.material.tabs.TabLayout
|
|
|
|
import com.google.android.material.tabs.TabLayout
|
|
|
|
import com.google.android.material.tabs.TabLayoutMediator.TabConfigurationStrategy
|
|
|
|
import com.google.android.material.tabs.TabLayoutMediator.TabConfigurationStrategy
|
|
|
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
|
|
|
import kotlinx.coroutines.asExecutor
|
|
|
|
import kotlinx.coroutines.flow.FlowCollector
|
|
|
|
import kotlinx.coroutines.flow.FlowCollector
|
|
|
|
import org.koitharu.kotatsu.core.model.FavouriteCategory
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ContinuationResumeRunnable
|
|
|
|
import org.koitharu.kotatsu.core.util.ContinuationResumeRunnable
|
|
|
|
import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment
|
|
|
|
import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment
|
|
|
|
import kotlin.coroutines.suspendCoroutine
|
|
|
|
import kotlin.coroutines.suspendCoroutine
|
|
|
|
|
|
|
|
|
|
|
|
class FavouritesContainerAdapter(fragment: Fragment) : FragmentStateAdapter(
|
|
|
|
class FavouritesContainerAdapter(fragment: Fragment) :
|
|
|
|
fragment.childFragmentManager,
|
|
|
|
FragmentStateAdapter(fragment.childFragmentManager, fragment.viewLifecycleOwner.lifecycle),
|
|
|
|
fragment.viewLifecycleOwner.lifecycle,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
TabConfigurationStrategy,
|
|
|
|
TabConfigurationStrategy,
|
|
|
|
FlowCollector<List<FavouriteCategory>> {
|
|
|
|
FlowCollector<List<FavouriteTabModel>> {
|
|
|
|
|
|
|
|
|
|
|
|
private val differ = AsyncListDiffer(this, DiffCallback())
|
|
|
|
private val differ = AsyncListDiffer(
|
|
|
|
|
|
|
|
AdapterListUpdateCallback(this),
|
|
|
|
|
|
|
|
AsyncDifferConfig.Builder(DiffCallback())
|
|
|
|
|
|
|
|
.setBackgroundThreadExecutor(Dispatchers.Default.limitedParallelism(2).asExecutor())
|
|
|
|
|
|
|
|
.build(),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
override fun getItemCount(): Int = differ.currentList.size
|
|
|
|
override fun getItemCount(): Int = differ.currentList.size
|
|
|
|
|
|
|
|
|
|
|
|
@ -27,8 +33,13 @@ class FavouritesContainerAdapter(fragment: Fragment) : FragmentStateAdapter(
|
|
|
|
return differ.currentList[position].id
|
|
|
|
return differ.currentList[position].id
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun containsItem(itemId: Long): Boolean {
|
|
|
|
|
|
|
|
return differ.currentList.any { x -> x.id == itemId }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun createFragment(position: Int): Fragment {
|
|
|
|
override fun createFragment(position: Int): Fragment {
|
|
|
|
return FavouritesListFragment.newInstance(getItemId(position))
|
|
|
|
val item = differ.currentList[position]
|
|
|
|
|
|
|
|
return FavouritesListFragment.newInstance(item.id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
|
|
|
|
override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
|
|
|
|
@ -37,18 +48,18 @@ class FavouritesContainerAdapter(fragment: Fragment) : FragmentStateAdapter(
|
|
|
|
tab.tag = item
|
|
|
|
tab.tag = item
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun emit(value: List<FavouriteCategory>) = suspendCoroutine { cont ->
|
|
|
|
override suspend fun emit(value: List<FavouriteTabModel>) = suspendCoroutine { cont ->
|
|
|
|
differ.submitList(value, ContinuationResumeRunnable(cont))
|
|
|
|
differ.submitList(value, ContinuationResumeRunnable(cont))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private class DiffCallback : DiffUtil.ItemCallback<FavouriteCategory>() {
|
|
|
|
private class DiffCallback : DiffUtil.ItemCallback<FavouriteTabModel>() {
|
|
|
|
|
|
|
|
|
|
|
|
override fun areItemsTheSame(oldItem: FavouriteCategory, newItem: FavouriteCategory): Boolean {
|
|
|
|
override fun areItemsTheSame(oldItem: FavouriteTabModel, newItem: FavouriteTabModel): Boolean {
|
|
|
|
return oldItem.id == newItem.id
|
|
|
|
return oldItem.id == newItem.id
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun areContentsTheSame(oldItem: FavouriteCategory, newItem: FavouriteCategory): Boolean {
|
|
|
|
override fun areContentsTheSame(oldItem: FavouriteTabModel, newItem: FavouriteTabModel): Boolean {
|
|
|
|
return oldItem.title == newItem.title
|
|
|
|
return oldItem == newItem
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|