From 8d9426f2576c01f466d967f32b651510449fab6a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 8 Jan 2023 08:11:12 +0200 Subject: [PATCH] Add option to change favourites sort order #290 --- .../ui/list/FavouritesListFragment.kt | 11 ++-- .../ui/list/FavouritesListMenuProvider.kt | 56 +++++++++++++++++++ .../ui/list/FavouritesListViewModel.kt | 2 +- app/src/main/res/menu/opt_favourites.xml | 24 ++++++++ 4 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt create mode 100644 app/src/main/res/menu/opt_favourites.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt index 456874d52..80366111f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListFragment.kt @@ -7,15 +7,16 @@ import android.view.View import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.PopupMenu import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.list.ListSelectionController import org.koitharu.kotatsu.core.ui.titleRes import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.utils.ext.addMenuProvider import org.koitharu.kotatsu.utils.ext.assistedViewModels import org.koitharu.kotatsu.utils.ext.withArgs +import javax.inject.Inject @AndroidEntryPoint class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener { @@ -23,9 +24,7 @@ class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickLis @Inject lateinit var viewModelFactory: FavouritesListViewModel.Factory - override val viewModel by assistedViewModels { - viewModelFactory.create(categoryId) - } + override val viewModel by assistedViewModels { viewModelFactory.create(categoryId) } private val categoryId: Long get() = arguments?.getLong(ARG_CATEGORY_ID) ?: NO_ID @@ -34,6 +33,9 @@ class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickLis override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + if (viewModel.categoryId != NO_ID) { + addMenuProvider(FavouritesListMenuProvider(view.context, viewModel)) + } viewModel.sortOrder.observe(viewLifecycleOwner) { activity?.invalidateOptionsMenu() } } @@ -73,6 +75,7 @@ class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickLis mode.finish() true } + else -> super.onActionItemClicked(controller, mode, item) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt new file mode 100644 index 000000000..85e49c294 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt @@ -0,0 +1,56 @@ +package org.koitharu.kotatsu.favourites.ui.list + +import android.content.Context +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import androidx.core.view.MenuProvider +import androidx.core.view.forEach +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity +import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditActivity +import org.koitharu.kotatsu.parsers.model.SortOrder + +class FavouritesListMenuProvider( + private val context: Context, + private val viewModel: FavouritesListViewModel, +) : MenuProvider { + + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.opt_favourites, menu) + val subMenu = menu.findItem(R.id.action_order)?.subMenu ?: return + for (order in FavouriteCategoriesActivity.SORT_ORDERS) { + subMenu.add(R.id.group_order, Menu.NONE, order.ordinal, order.titleRes) + } + subMenu.setGroupCheckable(R.id.group_order, true, true) + } + + override fun onPrepareMenu(menu: Menu) { + super.onPrepareMenu(menu) + val order = viewModel.sortOrder.value ?: return + menu.findItem(R.id.action_order)?.subMenu?.forEach { item -> + if (item.order == order.ordinal) { + item.isChecked = true + } + } + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + if (menuItem.groupId == R.id.group_order) { + val order = enumValues()[menuItem.order] + viewModel.setSortOrder(order) + return true + } + return when (menuItem.itemId) { + R.id.action_edit -> { + context.startActivity( + FavouritesCategoryEditActivity.newIntent(context, viewModel.categoryId), + ) + true + } + + else -> false + } + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt index ee5a9d324..f9842b9d1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt @@ -31,7 +31,7 @@ import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.runCatchingCancellable class FavouritesListViewModel @AssistedInject constructor( - @Assisted private val categoryId: Long, + @Assisted val categoryId: Long, private val repository: FavouritesRepository, private val trackingRepository: TrackingRepository, private val historyRepository: HistoryRepository, diff --git a/app/src/main/res/menu/opt_favourites.xml b/app/src/main/res/menu/opt_favourites.xml new file mode 100644 index 000000000..1f6696c87 --- /dev/null +++ b/app/src/main/res/menu/opt_favourites.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + +