Refactor ListModel
parent
80db817ff2
commit
942d4fe5ab
@ -1,29 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.explore.ui.adapter
|
|
||||||
|
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
|
||||||
import org.koitharu.kotatsu.explore.ui.model.ExploreItem
|
|
||||||
|
|
||||||
class ExploreDiffCallback : DiffUtil.ItemCallback<ExploreItem>() {
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: ExploreItem, newItem: ExploreItem): Boolean {
|
|
||||||
return when {
|
|
||||||
oldItem.javaClass != newItem.javaClass -> false
|
|
||||||
oldItem is ExploreItem.Buttons && newItem is ExploreItem.Buttons -> true
|
|
||||||
oldItem is ExploreItem.Loading && newItem is ExploreItem.Loading -> true
|
|
||||||
oldItem is ExploreItem.EmptyHint && newItem is ExploreItem.EmptyHint -> true
|
|
||||||
oldItem is ExploreItem.Source && newItem is ExploreItem.Source -> {
|
|
||||||
oldItem.source == newItem.source && oldItem.isGrid == newItem.isGrid
|
|
||||||
}
|
|
||||||
|
|
||||||
oldItem is ExploreItem.Header && newItem is ExploreItem.Header -> {
|
|
||||||
oldItem.titleResId == newItem.titleResId
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: ExploreItem, newItem: ExploreItem): Boolean {
|
|
||||||
return oldItem == newItem
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,9 +1,7 @@
|
|||||||
package org.koitharu.kotatsu.explore.ui.adapter
|
package org.koitharu.kotatsu.explore.ui.adapter
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import org.koitharu.kotatsu.list.ui.adapter.ListHeaderClickListener
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener
|
import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener
|
||||||
|
|
||||||
interface ExploreListEventListener : ListStateHolderListener, View.OnClickListener {
|
interface ExploreListEventListener : ListStateHolderListener, View.OnClickListener, ListHeaderClickListener
|
||||||
|
|
||||||
fun onManageClick(view: View)
|
|
||||||
}
|
|
||||||
|
|||||||
@ -0,0 +1,19 @@
|
|||||||
|
package org.koitharu.kotatsu.explore.ui.model
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
|
||||||
|
class ExploreButtons : ListModel {
|
||||||
|
|
||||||
|
override fun areItemsTheSame(other: ListModel): Boolean {
|
||||||
|
return other is ExploreButtons
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
return javaClass == other?.javaClass
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return javaClass.hashCode()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,104 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.explore.ui.model
|
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes
|
|
||||||
import androidx.annotation.StringRes
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.EmptyState
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
|
||||||
|
|
||||||
sealed interface ExploreItem : ListModel {
|
|
||||||
|
|
||||||
class Buttons(
|
|
||||||
val isSuggestionsEnabled: Boolean
|
|
||||||
) : ExploreItem {
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (javaClass != other?.javaClass) return false
|
|
||||||
|
|
||||||
other as Buttons
|
|
||||||
|
|
||||||
return isSuggestionsEnabled == other.isSuggestionsEnabled
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
return isSuggestionsEnabled.hashCode()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Header(
|
|
||||||
@StringRes val titleResId: Int,
|
|
||||||
val isButtonVisible: Boolean,
|
|
||||||
) : ExploreItem {
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (javaClass != other?.javaClass) return false
|
|
||||||
|
|
||||||
other as Header
|
|
||||||
|
|
||||||
if (titleResId != other.titleResId) return false
|
|
||||||
return isButtonVisible == other.isButtonVisible
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
var result = titleResId
|
|
||||||
result = 31 * result + isButtonVisible.hashCode()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Recommendation(
|
|
||||||
val manga: Manga
|
|
||||||
) : ExploreItem {
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (javaClass != other?.javaClass) return false
|
|
||||||
|
|
||||||
other as Recommendation
|
|
||||||
|
|
||||||
return manga == other.manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
return 31 * manga.hashCode()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class Source(
|
|
||||||
val source: MangaSource,
|
|
||||||
val isGrid: Boolean,
|
|
||||||
) : ExploreItem {
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
if (this === other) return true
|
|
||||||
if (javaClass != other?.javaClass) return false
|
|
||||||
|
|
||||||
other as Source
|
|
||||||
|
|
||||||
if (source != other.source) return false
|
|
||||||
return isGrid == other.isGrid
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
var result = source.hashCode()
|
|
||||||
result = 31 * result + isGrid.hashCode()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class EmptyHint(
|
|
||||||
@DrawableRes icon: Int,
|
|
||||||
@StringRes textPrimary: Int,
|
|
||||||
@StringRes textSecondary: Int,
|
|
||||||
@StringRes actionStringRes: Int,
|
|
||||||
) : EmptyState(icon, textPrimary, textSecondary, actionStringRes), ExploreItem
|
|
||||||
|
|
||||||
object Loading : ExploreItem {
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = other === Loading
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package org.koitharu.kotatsu.explore.ui.model
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
|
|
||||||
|
class MangaSourceItem(
|
||||||
|
val source: MangaSource,
|
||||||
|
val isGrid: Boolean,
|
||||||
|
) : ListModel {
|
||||||
|
|
||||||
|
override fun areItemsTheSame(other: ListModel): Boolean {
|
||||||
|
return other is MangaSourceItem && other.source == source
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as MangaSourceItem
|
||||||
|
|
||||||
|
if (source != other.source) return false
|
||||||
|
return isGrid == other.isGrid
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var result = source.hashCode()
|
||||||
|
result = 31 * result + isGrid.hashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package org.koitharu.kotatsu.explore.ui.model
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
|
|
||||||
|
class RecommendationsItem(
|
||||||
|
val manga: Manga
|
||||||
|
) : ListModel {
|
||||||
|
|
||||||
|
override fun areItemsTheSame(other: ListModel): Boolean {
|
||||||
|
return other is RecommendationsItem
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as RecommendationsItem
|
||||||
|
|
||||||
|
return manga == other.manga
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return 31 * manga.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,61 +1,25 @@
|
|||||||
package org.koitharu.kotatsu.favourites.ui.categories.adapter
|
package org.koitharu.kotatsu.favourites.ui.categories.adapter
|
||||||
|
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
|
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
|
||||||
import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesListListener
|
import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesListListener
|
||||||
|
import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener
|
import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD
|
import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD
|
import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
import kotlin.jvm.internal.Intrinsics
|
|
||||||
|
|
||||||
class CategoriesAdapter(
|
class CategoriesAdapter(
|
||||||
coil: ImageLoader,
|
coil: ImageLoader,
|
||||||
lifecycleOwner: LifecycleOwner,
|
lifecycleOwner: LifecycleOwner,
|
||||||
onItemClickListener: FavouriteCategoriesListListener,
|
onItemClickListener: FavouriteCategoriesListListener,
|
||||||
listListener: ListStateHolderListener,
|
listListener: ListStateHolderListener,
|
||||||
) : AsyncListDifferDelegationAdapter<ListModel>(DiffCallback()) {
|
) : AsyncListDifferDelegationAdapter<ListModel>(ListModelDiffCallback) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
delegatesManager.addDelegate(categoryAD(coil, lifecycleOwner, onItemClickListener))
|
delegatesManager.addDelegate(categoryAD(coil, lifecycleOwner, onItemClickListener))
|
||||||
.addDelegate(emptyStateListAD(coil, lifecycleOwner, listListener))
|
.addDelegate(emptyStateListAD(coil, lifecycleOwner, listListener))
|
||||||
.addDelegate(loadingStateAD())
|
.addDelegate(loadingStateAD())
|
||||||
}
|
}
|
||||||
|
|
||||||
private class DiffCallback : DiffUtil.ItemCallback<ListModel>() {
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {
|
|
||||||
return when {
|
|
||||||
oldItem is CategoryListModel && newItem is CategoryListModel -> {
|
|
||||||
oldItem.category.id == newItem.category.id
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> oldItem.javaClass == newItem.javaClass
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {
|
|
||||||
return Intrinsics.areEqual(oldItem, newItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getChangePayload(oldItem: ListModel, newItem: ListModel): Any? {
|
|
||||||
return when {
|
|
||||||
oldItem is CategoryListModel && newItem is CategoryListModel -> {
|
|
||||||
if (oldItem.category == newItem.category &&
|
|
||||||
oldItem.mangaCount == newItem.mangaCount &&
|
|
||||||
oldItem.covers == newItem.covers &&
|
|
||||||
oldItem.isReorderMode != newItem.isReorderMode
|
|
||||||
) {
|
|
||||||
Unit
|
|
||||||
} else {
|
|
||||||
super.getChangePayload(oldItem, newItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> super.getChangePayload(oldItem, newItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,41 @@
|
|||||||
package org.koitharu.kotatsu.favourites.ui.categories.select.model
|
package org.koitharu.kotatsu.favourites.ui.categories.select.model
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
|
||||||
data class MangaCategoryItem(
|
class MangaCategoryItem(
|
||||||
val id: Long,
|
val id: Long,
|
||||||
val name: String,
|
val name: String,
|
||||||
val isChecked: Boolean,
|
val isChecked: Boolean,
|
||||||
) : ListModel
|
) : ListModel {
|
||||||
|
|
||||||
|
override fun areItemsTheSame(other: ListModel): Boolean {
|
||||||
|
return other is MangaCategoryItem && other.id == id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getChangePayload(previousState: ListModel): Any? {
|
||||||
|
return if (previousState is MangaCategoryItem && previousState.isChecked != isChecked) {
|
||||||
|
ListModelDiffCallback.PAYLOAD_CHECKED_CHANGED
|
||||||
|
} else {
|
||||||
|
super.getChangePayload(previousState)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as MangaCategoryItem
|
||||||
|
|
||||||
|
if (id != other.id) return false
|
||||||
|
if (name != other.name) return false
|
||||||
|
return isChecked == other.isChecked
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var result = id.hashCode()
|
||||||
|
result = 31 * result + name.hashCode()
|
||||||
|
result = 31 * result + isChecked.hashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -0,0 +1,22 @@
|
|||||||
|
package org.koitharu.kotatsu.list.ui
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
|
||||||
|
object ListModelDiffCallback : DiffUtil.ItemCallback<ListModel>() {
|
||||||
|
|
||||||
|
val PAYLOAD_CHECKED_CHANGED = Any()
|
||||||
|
val PAYLOAD_NESTED_LIST_CHANGED = Any()
|
||||||
|
|
||||||
|
override fun areItemsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {
|
||||||
|
return oldItem.areItemsTheSame(newItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {
|
||||||
|
return oldItem == newItem
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getChangePayload(oldItem: ListModel, newItem: ListModel): Any? {
|
||||||
|
return newItem.getChangePayload(oldItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,36 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.list.ui.adapter
|
|
||||||
|
|
||||||
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
|
|
||||||
import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
|
|
||||||
import org.koitharu.kotatsu.databinding.FragmentFilterHeaderBinding
|
|
||||||
import org.koitharu.kotatsu.filter.ui.model.FilterHeaderModel
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
|
||||||
|
|
||||||
@Deprecated("")
|
|
||||||
fun listHeader2AD(
|
|
||||||
listener: MangaListListener,
|
|
||||||
) = adapterDelegateViewBinding<FilterHeaderModel, ListModel, FragmentFilterHeaderBinding>(
|
|
||||||
{ layoutInflater, parent -> FragmentFilterHeaderBinding.inflate(layoutInflater, parent, false) },
|
|
||||||
) {
|
|
||||||
|
|
||||||
var ignoreChecking = false
|
|
||||||
binding.chipsTags.setOnCheckedStateChangeListener { _, _ ->
|
|
||||||
if (!ignoreChecking) {
|
|
||||||
listener.onUpdateFilter(binding.chipsTags.getCheckedData(MangaTag::class.java))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bind { payloads ->
|
|
||||||
if (payloads.isNotEmpty()) {
|
|
||||||
if (context.isAnimationsEnabled) {
|
|
||||||
binding.scrollView.smoothScrollTo(0, 0)
|
|
||||||
} else {
|
|
||||||
binding.scrollView.scrollTo(0, 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ignoreChecking = true
|
|
||||||
binding.chipsTags.setChips(item.chips) // TODO use recyclerview
|
|
||||||
ignoreChecking = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.list.ui.adapter
|
|
||||||
|
|
||||||
import android.widget.TextView
|
|
||||||
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate
|
|
||||||
import org.koitharu.kotatsu.R
|
|
||||||
import org.koitharu.kotatsu.core.ui.model.DateTimeAgo
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
|
||||||
|
|
||||||
fun relatedDateItemAD() = adapterDelegate<DateTimeAgo, ListModel>(R.layout.item_header) {
|
|
||||||
|
|
||||||
bind {
|
|
||||||
(itemView as TextView).text = item.format(context.resources)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,12 +1,38 @@
|
|||||||
package org.koitharu.kotatsu.list.ui.model
|
package org.koitharu.kotatsu.list.ui.model
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.list.ui.adapter.MangaListAdapter
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
|
|
||||||
data class MangaGridModel(
|
class MangaGridModel(
|
||||||
override val id: Long,
|
override val id: Long,
|
||||||
override val title: String,
|
override val title: String,
|
||||||
override val coverUrl: String,
|
override val coverUrl: String,
|
||||||
override val manga: Manga,
|
override val manga: Manga,
|
||||||
override val counter: Int,
|
override val counter: Int,
|
||||||
override val progress: Float,
|
override val progress: Float,
|
||||||
) : MangaItemModel
|
) : MangaItemModel() {
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as MangaGridModel
|
||||||
|
|
||||||
|
if (id != other.id) return false
|
||||||
|
if (title != other.title) return false
|
||||||
|
if (coverUrl != other.coverUrl) return false
|
||||||
|
if (manga != other.manga) return false
|
||||||
|
if (counter != other.counter) return false
|
||||||
|
return progress == other.progress
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var result = id.hashCode()
|
||||||
|
result = 31 * result + title.hashCode()
|
||||||
|
result = 31 * result + coverUrl.hashCode()
|
||||||
|
result = 31 * result + manga.hashCode()
|
||||||
|
result = 31 * result + counter
|
||||||
|
result = 31 * result + progress.hashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,17 +1,31 @@
|
|||||||
package org.koitharu.kotatsu.list.ui.model
|
package org.koitharu.kotatsu.list.ui.model
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.list.ui.adapter.MangaListAdapter
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
|
|
||||||
sealed interface MangaItemModel : ListModel {
|
sealed class MangaItemModel : ListModel {
|
||||||
|
|
||||||
val id: Long
|
abstract val id: Long
|
||||||
val manga: Manga
|
abstract val manga: Manga
|
||||||
val title: String
|
abstract val title: String
|
||||||
val coverUrl: String
|
abstract val coverUrl: String
|
||||||
val counter: Int
|
abstract val counter: Int
|
||||||
val progress: Float
|
abstract val progress: Float
|
||||||
|
|
||||||
val source: MangaSource
|
val source: MangaSource
|
||||||
get() = manga.source
|
get() = manga.source
|
||||||
|
|
||||||
|
override fun areItemsTheSame(other: ListModel): Boolean {
|
||||||
|
return other is MangaItemModel && other.javaClass == javaClass && id == other.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getChangePayload(previousState: ListModel): Any? {
|
||||||
|
return when {
|
||||||
|
previousState !is MangaItemModel -> super.getChangePayload(previousState)
|
||||||
|
progress != previousState.progress -> MangaListAdapter.PAYLOAD_PROGRESS
|
||||||
|
counter != previousState.counter -> Unit
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,30 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.shelf.ui.adapter
|
|
||||||
|
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.MangaListAdapter
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.MangaItemModel
|
|
||||||
import kotlin.jvm.internal.Intrinsics
|
|
||||||
|
|
||||||
class MangaItemDiffCallback : DiffUtil.ItemCallback<ListModel>() {
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {
|
|
||||||
oldItem as MangaItemModel
|
|
||||||
newItem as MangaItemModel
|
|
||||||
return oldItem.javaClass == newItem.javaClass && oldItem.id == newItem.id
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {
|
|
||||||
return Intrinsics.areEqual(oldItem, newItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getChangePayload(oldItem: ListModel, newItem: ListModel): Any? {
|
|
||||||
oldItem as MangaItemModel
|
|
||||||
newItem as MangaItemModel
|
|
||||||
return when {
|
|
||||||
oldItem.progress != newItem.progress -> MangaListAdapter.PAYLOAD_PROGRESS
|
|
||||||
oldItem.counter != newItem.counter -> Unit
|
|
||||||
else -> super.getChangePayload(oldItem, newItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,41 +1,15 @@
|
|||||||
package org.koitharu.kotatsu.shelf.ui.config
|
package org.koitharu.kotatsu.shelf.ui.config
|
||||||
|
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
|
||||||
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
|
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
|
||||||
|
import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
|
||||||
class ShelfSettingsAdapter(
|
class ShelfSettingsAdapter(
|
||||||
listener: ShelfSettingsListener,
|
listener: ShelfSettingsListener,
|
||||||
) : AsyncListDifferDelegationAdapter<ShelfSettingsItemModel>(DiffCallback()) {
|
) : AsyncListDifferDelegationAdapter<ListModel>(ListModelDiffCallback) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
delegatesManager.addDelegate(shelfCategoryAD(listener))
|
delegatesManager.addDelegate(shelfCategoryAD(listener))
|
||||||
.addDelegate(shelfSectionAD(listener))
|
.addDelegate(shelfSectionAD(listener))
|
||||||
}
|
}
|
||||||
|
|
||||||
class DiffCallback : DiffUtil.ItemCallback<ShelfSettingsItemModel>() {
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: ShelfSettingsItemModel, newItem: ShelfSettingsItemModel): Boolean {
|
|
||||||
return when {
|
|
||||||
oldItem is ShelfSettingsItemModel.Section && newItem is ShelfSettingsItemModel.Section -> {
|
|
||||||
oldItem.section == newItem.section
|
|
||||||
}
|
|
||||||
|
|
||||||
oldItem is ShelfSettingsItemModel.FavouriteCategory && newItem is ShelfSettingsItemModel.FavouriteCategory -> {
|
|
||||||
oldItem.id == newItem.id
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: ShelfSettingsItemModel, newItem: ShelfSettingsItemModel): Boolean {
|
|
||||||
return oldItem == newItem
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getChangePayload(oldItem: ShelfSettingsItemModel, newItem: ShelfSettingsItemModel): Any? {
|
|
||||||
return if (oldItem.isChecked == newItem.isChecked) {
|
|
||||||
super.getChangePayload(oldItem, newItem)
|
|
||||||
} else Unit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue