Fully migrate to AdapterDelegates and cleanup code

This commit is contained in:
Koitharu
2020-11-28 11:05:27 +02:00
parent 53e36d23b1
commit 5ed4d0b6b7
48 changed files with 416 additions and 479 deletions

View File

@@ -0,0 +1,10 @@
package org.koitharu.kotatsu.widget
import org.koin.android.viewmodel.dsl.viewModel
import org.koin.dsl.module
import org.koitharu.kotatsu.widget.shelf.ShelfConfigViewModel
val appWidgetModule
get() = module {
viewModel { ShelfConfigViewModel(get()) }
}

View File

@@ -1,35 +0,0 @@
package org.koitharu.kotatsu.widget.shelf
import android.view.ViewGroup
import org.koitharu.kotatsu.base.ui.list.BaseRecyclerAdapter
import org.koitharu.kotatsu.base.ui.list.OnRecyclerItemClickListener
import org.koitharu.kotatsu.core.model.FavouriteCategory
class CategorySelectAdapter(onItemClickListener: OnRecyclerItemClickListener<FavouriteCategory>? = null) :
BaseRecyclerAdapter<FavouriteCategory, Boolean>(onItemClickListener) {
var checkedItemId = 0L
private set
fun setCheckedId(id: Long) {
val oldId = checkedItemId
checkedItemId = id
val oldPos = findItemPositionById(oldId)
val newPos = findItemPositionById(id)
if (newPos != -1) {
notifyItemChanged(newPos)
}
if (oldPos != -1) {
notifyItemChanged(oldPos)
}
}
override fun getExtra(item: FavouriteCategory, position: Int) =
checkedItemId == item.id
override fun onCreateViewHolder(parent: ViewGroup) = CategorySelectHolder(
parent
)
override fun onGetItemId(item: FavouriteCategory) = item.id
}

View File

@@ -1,16 +0,0 @@
package org.koitharu.kotatsu.widget.shelf
import android.view.ViewGroup
import kotlinx.android.synthetic.main.item_category_checkable.*
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.list.BaseViewHolder
import org.koitharu.kotatsu.core.model.FavouriteCategory
class CategorySelectHolder(parent: ViewGroup) :
BaseViewHolder<FavouriteCategory, Boolean>(parent, R.layout.item_category_checkable_single) {
override fun onBind(data: FavouriteCategory, extra: Boolean) {
checkedTextView.text = data.title
checkedTextView.isChecked = extra
}
}

View File

@@ -17,17 +17,15 @@ import kotlinx.android.synthetic.main.activity_categories.*
import org.koin.android.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BaseActivity
import org.koitharu.kotatsu.base.ui.list.OnRecyclerItemClickListener
import org.koitharu.kotatsu.core.model.FavouriteCategory
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.prefs.AppWidgetConfig
import org.koitharu.kotatsu.favourites.ui.categories.FavouritesCategoriesViewModel
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import java.util.*
import kotlin.collections.ArrayList
import org.koitharu.kotatsu.widget.shelf.adapter.CategorySelectAdapter
import org.koitharu.kotatsu.widget.shelf.model.CategoryItem
class ShelfConfigActivity : BaseActivity(), OnRecyclerItemClickListener<FavouriteCategory> {
class ShelfConfigActivity : BaseActivity(), OnListItemClickListener<CategoryItem> {
private val viewModel by viewModel<FavouritesCategoriesViewModel>()
private val viewModel by viewModel<ShelfConfigViewModel>()
private lateinit var adapter: CategorySelectAdapter
private lateinit var config: AppWidgetConfig
@@ -50,10 +48,10 @@ class ShelfConfigActivity : BaseActivity(), OnRecyclerItemClickListener<Favourit
return
}
config = AppWidgetConfig.getInstance(this, appWidgetId)
adapter.setCheckedId(config.categoryId)
viewModel.checkedId = config.categoryId
viewModel.categories.observe(this, ::onCategoriesChanged)
viewModel.onError.observe(this, ::onError)
viewModel.content.observe(this, this::onContentChanged)
viewModel.onError.observe(this, this::onError)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
@@ -63,7 +61,7 @@ class ShelfConfigActivity : BaseActivity(), OnRecyclerItemClickListener<Favourit
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.action_done -> {
config.categoryId = adapter.checkedItemId
config.categoryId = viewModel.checkedId
updateWidget()
setResult(
Activity.RESULT_OK,
@@ -75,15 +73,12 @@ class ShelfConfigActivity : BaseActivity(), OnRecyclerItemClickListener<Favourit
else -> super.onOptionsItemSelected(item)
}
override fun onItemClick(item: FavouriteCategory, position: Int, view: View) {
adapter.setCheckedId(item.id)
override fun onItemClick(item: CategoryItem, view: View) {
viewModel.checkedId = item.id
}
private fun onCategoriesChanged(categories: List<FavouriteCategory>) {
val data = ArrayList<FavouriteCategory>(categories.size + 1)
data += FavouriteCategory(0L, getString(R.string.all_favourites), -1, Date())
data += categories
adapter.replaceData(data)
private fun onContentChanged(categories: List<CategoryItem>) {
adapter.items = categories
}
private fun onError(e: Throwable) {

View File

@@ -0,0 +1,32 @@
package org.koitharu.kotatsu.widget.shelf
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import org.koitharu.kotatsu.base.ui.BaseViewModel
import org.koitharu.kotatsu.favourites.domain.FavouritesRepository
import org.koitharu.kotatsu.widget.shelf.model.CategoryItem
import java.util.*
class ShelfConfigViewModel(
favouritesRepository: FavouritesRepository
) : BaseViewModel() {
private val selectedCategoryId = MutableStateFlow(0L)
val content = combine(
favouritesRepository.observeCategories(),
selectedCategoryId
) { categories, selectedId ->
val list = ArrayList<CategoryItem>(categories.size + 1)
list += CategoryItem(0L, null, selectedId == 0L)
categories.mapTo(list) {
CategoryItem(it.id, it.title, selectedId == it.id)
}
list
}.asLiveData(viewModelScope.coroutineContext + Dispatchers.Default)
var checkedId: Long by selectedCategoryId::value
}

View File

@@ -0,0 +1,33 @@
package org.koitharu.kotatsu.widget.shelf.adapter
import androidx.recyclerview.widget.DiffUtil
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.widget.shelf.model.CategoryItem
class CategorySelectAdapter(
clickListener: OnListItemClickListener<CategoryItem>
) : AsyncListDifferDelegationAdapter<CategoryItem>(DiffCallback()) {
init {
delegatesManager.addDelegate(categorySelectItemAD(clickListener))
}
private class DiffCallback : DiffUtil.ItemCallback<CategoryItem>() {
override fun areItemsTheSame(oldItem: CategoryItem, newItem: CategoryItem): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: CategoryItem, newItem: CategoryItem): Boolean {
return oldItem == newItem
}
override fun getChangePayload(oldItem: CategoryItem, newItem: CategoryItem): Any? {
if (oldItem.isSelected != newItem.isSelected) {
return newItem.isSelected
}
return super.getChangePayload(oldItem, newItem)
}
}
}

View File

@@ -0,0 +1,23 @@
package org.koitharu.kotatsu.widget.shelf.adapter
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer
import kotlinx.android.synthetic.main.item_category_checkable.*
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.widget.shelf.model.CategoryItem
fun categorySelectItemAD(
clickListener: OnListItemClickListener<CategoryItem>
) = adapterDelegateLayoutContainer<CategoryItem, CategoryItem>(
R.layout.item_category_checkable_single
) {
itemView.setOnClickListener {
clickListener.onItemClick(item, it)
}
bind {
checkedTextView.text = item.name ?: getString(R.string.all_favourites)
checkedTextView.isChecked = item.isSelected
}
}

View File

@@ -0,0 +1,7 @@
package org.koitharu.kotatsu.widget.shelf.model
data class CategoryItem(
val id: Long,
val name: String?,
val isSelected: Boolean
)