From 05241f73d9a6dd0100790a45c02f31d1a3a7a813 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 31 Aug 2023 18:59:18 +0300 Subject: [PATCH] Improve categories managing --- .../categories/FavouriteCategoriesActivity.kt | 25 ++++++++++++++++--- .../FavouriteCategoriesListListener.kt | 3 +++ .../FavouritesCategoriesViewModel.kt | 9 +++---- .../categories/adapter/CategoriesAdapter.kt | 6 ++--- .../ui/categories/adapter/CategoryAD.kt | 10 ++++++-- .../categories/adapter/CategoryListModel.kt | 4 +++ app/src/main/res/layout/item_category.xml | 15 ++++++++++- 7 files changed, 57 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt index 1c719cf5a..3931f89eb 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt @@ -21,6 +21,7 @@ import org.koitharu.kotatsu.core.ui.list.ListSelectionController import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.core.util.ext.observeEvent import org.koitharu.kotatsu.databinding.ActivityCategoriesBinding +import org.koitharu.kotatsu.favourites.ui.FavouritesActivity import org.koitharu.kotatsu.favourites.ui.categories.adapter.CategoriesAdapter import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener @@ -77,6 +78,14 @@ class FavouriteCategoriesActivity : } override fun onItemClick(item: FavouriteCategory, view: View) { + if (selectionController.onItemClick(item.id)) { + return + } + val intent = FavouritesActivity.newIntent(view.context, item) + startActivity(intent) + } + + override fun onEditClick(item: FavouriteCategory, view: View) { if (selectionController.onItemClick(item.id)) { return } @@ -112,8 +121,8 @@ class FavouriteCategoriesActivity : ) } - private fun onCategoriesChanged(categories: List) { - adapter.items = categories + private suspend fun onCategoriesChanged(categories: List) { + adapter.emit(categories) invalidateOptionsMenu() } @@ -128,7 +137,14 @@ class FavouriteCategoriesActivity : recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder, - ): Boolean = viewHolder.itemViewType == target.itemViewType + ): Boolean { + if (viewHolder.itemViewType != target.itemViewType) { + return false + } + val fromPos = viewHolder.bindingAdapterPosition + val toPos = target.bindingAdapterPosition + return fromPos != toPos && fromPos != RecyclerView.NO_POSITION && toPos != RecyclerView.NO_POSITION + } override fun canDropOver( recyclerView: RecyclerView, @@ -153,7 +169,8 @@ class FavouriteCategoriesActivity : override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { super.onSelectedChanged(viewHolder, actionState) - viewBinding.recyclerView.isNestedScrollingEnabled = actionState == ItemTouchHelper.ACTION_STATE_IDLE + viewBinding.recyclerView.isNestedScrollingEnabled = + actionState == ItemTouchHelper.ACTION_STATE_IDLE } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt index f85ff122e..e778d42f4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesListListener.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.favourites.ui.categories +import android.view.View import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener @@ -7,4 +8,6 @@ import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener interface FavouriteCategoriesListListener : OnListItemClickListener { fun onDragHandleTouch(holder: RecyclerView.ViewHolder): Boolean + + fun onEditClick(item: FavouriteCategory, view: View) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt index 396163140..b49dace7c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt @@ -17,7 +17,7 @@ import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.categories.adapter.CategoryListModel import org.koitharu.kotatsu.list.ui.model.EmptyState import org.koitharu.kotatsu.list.ui.model.LoadingState -import java.util.Collections +import org.koitharu.kotatsu.parsers.util.move import javax.inject.Inject @HiltViewModel @@ -65,12 +65,11 @@ class FavouritesCategoriesViewModel @Inject constructor( val prevJob = reorderJob reorderJob = launchJob(Dispatchers.Default) { prevJob?.join() - val items = categories.requireValue() - val ids = items.mapNotNullTo(ArrayList(items.size)) { + val snapshot = categories.requireValue().toMutableList() + snapshot.move(oldPos, newPos) + val ids = snapshot.mapNotNullTo(ArrayList(snapshot.size)) { (it as? CategoryListModel)?.category?.id } - Collections.swap(ids, oldPos, newPos) - ids.remove(0L) repository.reorderCategories(ids) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt index df5767f7b..46111fbe0 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoriesAdapter.kt @@ -18,8 +18,8 @@ class CategoriesAdapter( ) : BaseListAdapter() { init { - addDelegate(ListItemType.CATEGORY_LARGE ,categoryAD(coil, lifecycleOwner, onItemClickListener)) - addDelegate(ListItemType.STATE_EMPTY ,emptyStateListAD(coil, lifecycleOwner, listListener)) - addDelegate(ListItemType.STATE_LOADING ,loadingStateAD()) + addDelegate(ListItemType.CATEGORY_LARGE, categoryAD(coil, lifecycleOwner, onItemClickListener)) + addDelegate(ListItemType.STATE_EMPTY, emptyStateListAD(coil, lifecycleOwner, listListener)) + addDelegate(ListItemType.STATE_LOADING, loadingStateAD()) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt index 02f7c735e..ec93fcaef 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryAD.kt @@ -34,8 +34,13 @@ fun categoryAD( { inflater, parent -> ItemCategoryBinding.inflate(inflater, parent, false) }, ) { val eventListener = object : OnClickListener, OnLongClickListener, OnTouchListener { - override fun onClick(v: View) = clickListener.onItemClick(item.category, itemView) - override fun onLongClick(v: View) = clickListener.onItemLongClick(item.category, itemView) + override fun onClick(v: View) = if (v.id == R.id.imageView_edit) { + clickListener.onEditClick(item.category, v) + } else { + clickListener.onItemClick(item.category, v) + } + + override fun onLongClick(v: View) = clickListener.onItemLongClick(item.category, v) override fun onTouch(v: View?, event: MotionEvent): Boolean = event.actionMasked == MotionEvent.ACTION_DOWN && clickListener.onDragHandleTouch(this@adapterDelegateViewBinding) } @@ -57,6 +62,7 @@ fun categoryAD( val crossFadeDuration = context.getAnimationDuration(R.integer.config_defaultAnimTime).toInt() itemView.setOnClickListener(eventListener) itemView.setOnLongClickListener(eventListener) + binding.imageViewEdit.setOnClickListener(eventListener) binding.imageViewHandle.setOnTouchListener(eventListener) bind { payloads -> diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryListModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryListModel.kt index 6f513ac49..c60243594 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryListModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/categories/adapter/CategoryListModel.kt @@ -46,4 +46,8 @@ class CategoryListModel( result = 31 * result + category.isVisibleInLibrary.hashCode() return result } + + override fun toString(): String { + return "CategoryListModel(categoryId=${category.id})" + } } diff --git a/app/src/main/res/layout/item_category.xml b/app/src/main/res/layout/item_category.xml index 99e0fa846..cf7b3ccd9 100644 --- a/app/src/main/res/layout/item_category.xml +++ b/app/src/main/res/layout/item_category.xml @@ -72,7 +72,7 @@ android:singleLine="true" android:textAppearance="?attr/textAppearanceBodyLarge" app:layout_constraintBottom_toTopOf="@id/textView_subtitle" - app:layout_constraintEnd_toStartOf="@id/imageView_handle" + app:layout_constraintEnd_toStartOf="@id/imageView_edit" app:layout_constraintStart_toEndOf="@id/imageView_cover3" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" @@ -120,10 +120,23 @@ app:layout_constraintTop_toTopOf="@id/textView_subtitle" app:srcCompat="@drawable/ic_eye" /> + +