From b293fee74249f274db988075a7b45f39ddccb935 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 12 Jul 2022 14:34:08 +0300 Subject: [PATCH] Move favourites order from menu to header --- .../ui/list/FavouritesListFragment.kt | 25 ++++++---- .../ui/list/FavouritesListMenuProvider.kt | 48 ------------------- .../ui/list/FavouritesListViewModel.kt | 28 +++++------ .../kotatsu/list/ui/MangaListFragment.kt | 2 +- .../kotatsu/list/ui/adapter/ListHeader2AD.kt | 2 +- .../kotatsu/list/ui/adapter/ListHeaderAD.kt | 2 +- .../list/ui/adapter/MangaListListener.kt | 3 +- .../list/ui/model/ListModelConversionExt.kt | 36 +++++++------- .../remotelist/ui/RemoteListFragment.kt | 4 +- .../search/ui/multi/MultiSearchActivity.kt | 2 +- .../kotatsu/tracker/ui/FeedFragment.kt | 2 +- app/src/main/res/menu/opt_favourites_list.xml | 19 -------- 12 files changed, 58 insertions(+), 115 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt delete mode 100644 app/src/main/res/menu/opt_favourites_list.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 4d55137a2..1fef50c93 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 @@ -1,19 +1,20 @@ package org.koitharu.kotatsu.favourites.ui.list -import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View import androidx.appcompat.view.ActionMode +import androidx.appcompat.widget.PopupMenu import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf import org.koitharu.kotatsu.R +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.withArgs -class FavouritesListFragment : MangaListFragment() { +class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickListener { override val viewModel by viewModel { parametersOf(categoryId) @@ -24,16 +25,22 @@ class FavouritesListFragment : MangaListFragment() { override val isSwipeRefreshEnabled = false - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - viewModel.sortOrder.observe(viewLifecycleOwner) { activity?.invalidateOptionsMenu() } + override fun onScrolledToEnd() = Unit - if (categoryId != NO_ID) { - addMenuProvider(FavouritesListMenuProvider(viewModel)) + override fun onFilterClick(view: View?) { + val menu = PopupMenu(view?.context ?: return, view) + menu.setOnMenuItemClickListener(this) + for ((i, item) in FavouriteCategoriesActivity.SORT_ORDERS.withIndex()) { + menu.menu.add(Menu.NONE, Menu.NONE, i, item.titleRes) } + menu.show() } - override fun onScrolledToEnd() = Unit + override fun onMenuItemClick(item: MenuItem): Boolean { + val order = FavouriteCategoriesActivity.SORT_ORDERS.getOrNull(item.order) ?: return false + viewModel.setSortOrder(order) + return true + } override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { mode.menuInflater.inflate(R.menu.mode_favourites, menu) 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 deleted file mode 100644 index 4c8fc4398..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.koitharu.kotatsu.favourites.ui.list - -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import androidx.core.view.MenuProvider -import androidx.core.view.iterator -import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.ui.titleRes -import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity - -class FavouritesListMenuProvider( - private val viewModel: FavouritesListViewModel, -) : MenuProvider { - - override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { - menuInflater.inflate(R.menu.opt_favourites_list, menu) - menu.findItem(R.id.action_order)?.subMenu?.let { submenu -> - for ((i, item) in FavouriteCategoriesActivity.SORT_ORDERS.withIndex()) { - val menuItem = submenu.add(R.id.group_order, Menu.NONE, i, item.titleRes) - menuItem.isCheckable = true - } - submenu.setGroupCheckable(R.id.group_order, true, true) - } - } - - override fun onPrepareMenu(menu: Menu) { - menu.findItem(R.id.action_order)?.subMenu?.let { submenu -> - val selectedOrder = viewModel.sortOrder.value - for (item in submenu) { - val order = FavouriteCategoriesActivity.SORT_ORDERS.getOrNull(item.order) - item.isChecked = order == selectedOrder - } - } - } - - override fun onMenuItemSelected(menuItem: MenuItem): Boolean { - return when { - menuItem.itemId == R.id.action_order -> false - menuItem.groupId == R.id.group_order -> { - val order = FavouriteCategoriesActivity.SORT_ORDERS.getOrNull(menuItem.order) ?: return false - viewModel.setSortOrder(order) - true - } - else -> false - } - } -} \ No newline at end of file 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 44f89c767..9558207ec 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 @@ -1,12 +1,9 @@ package org.koitharu.kotatsu.favourites.ui.list -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.plus import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.favourites.domain.FavouritesRepository @@ -15,10 +12,7 @@ import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.PROGRESS_NONE import org.koitharu.kotatsu.list.domain.ListExtraProvider import org.koitharu.kotatsu.list.ui.MangaListViewModel -import org.koitharu.kotatsu.list.ui.model.EmptyState -import org.koitharu.kotatsu.list.ui.model.LoadingState -import org.koitharu.kotatsu.list.ui.model.toErrorState -import org.koitharu.kotatsu.list.ui.model.toUi +import org.koitharu.kotatsu.list.ui.model.* import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.tracker.domain.TrackingRepository import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct @@ -31,12 +25,12 @@ class FavouritesListViewModel( private val settings: AppSettings, ) : MangaListViewModel(settings), ListExtraProvider { - var sortOrder: LiveData = if (categoryId == NO_ID) { - MutableLiveData(null) + private val sortOrder: StateFlow = if (categoryId == NO_ID) { + MutableStateFlow(null) } else { repository.observeCategory(categoryId) .map { it?.order } - .asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default) + .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null) } override val content = combine( @@ -45,8 +39,9 @@ class FavouritesListViewModel( } else { repository.observeAll(categoryId) }, + sortOrder, createListModeFlow() - ) { list, mode -> + ) { list, order, mode -> when { list.isEmpty() -> listOf( EmptyState( @@ -60,7 +55,12 @@ class FavouritesListViewModel( actionStringRes = 0, ) ) - else -> list.toUi(mode, this) + else -> buildList(list.size + 1) { + if (order != null) { + add(ListHeader2(emptyList(), order, false)) + } + list.toUi(this, mode, this@FavouritesListViewModel) + } } }.catch { emit(listOf(it.toErrorState(canRetry = false))) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index 1fd7574cc..e765f1c14 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -197,7 +197,7 @@ abstract class MangaListFragment : } } - override fun onFilterClick() = Unit + override fun onFilterClick(view: View?) = Unit override fun onEmptyActionClick() = Unit diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt index 843c1f18f..ba37506f5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt @@ -16,7 +16,7 @@ fun listHeader2AD( var ignoreChecking = false binding.textViewFilter.setOnClickListener { - listener.onFilterClick() + listener.onFilterClick(it) } binding.chipsTags.setOnCheckedStateChangeListener { _, _ -> if (!ignoreChecking) { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt index ec44f2ab9..3e5faa413 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeaderAD.kt @@ -32,7 +32,7 @@ fun listHeaderWithFilterAD( ) { binding.textViewFilter.setOnClickListener { - listener.onFilterClick() + listener.onFilterClick(it) } bind { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt index ece5efc5b..89553be7f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.list.ui.adapter +import android.view.View import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag @@ -8,5 +9,5 @@ interface MangaListListener : OnListItemClickListener, ListStateHolderLis fun onUpdateFilter(tags: Set) - fun onFilterClick() + fun onFilterClick(view: View?) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt index 8768bb80e..a7a8c26f6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt @@ -44,27 +44,13 @@ fun Manga.toGridModel(counter: Int, progress: Float) = MangaGridModel( suspend fun List.toUi( mode: ListMode, extraProvider: ListExtraProvider, -): List = when (mode) { - ListMode.LIST -> map { - it.toListModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) - } - ListMode.DETAILED_LIST -> map { - it.toListDetailedModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) - } - ListMode.GRID -> map { - it.toGridModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) - } -} +): List = toUi(ArrayList(size), mode, extraProvider) fun List.toUi( mode: ListMode, -): List = when (mode) { - ListMode.LIST -> map { it.toListModel(0, PROGRESS_NONE) } - ListMode.DETAILED_LIST -> map { it.toListDetailedModel(0, PROGRESS_NONE) } - ListMode.GRID -> map { it.toGridModel(0, PROGRESS_NONE) } -} +): List = toUi(ArrayList(size), mode) -fun > List.toUi( +fun > List.toUi( destination: C, mode: ListMode, ): C = when (mode) { @@ -73,6 +59,22 @@ fun > List.toUi( ListMode.GRID -> mapTo(destination) { it.toGridModel(0, PROGRESS_NONE) } } +suspend fun > List.toUi( + destination: C, + mode: ListMode, + extraProvider: ListExtraProvider, +): C = when (mode) { + ListMode.LIST -> mapTo(destination) { + it.toListModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) + } + ListMode.DETAILED_LIST -> mapTo(destination) { + it.toListDetailedModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) + } + ListMode.GRID -> mapTo(destination) { + it.toGridModel(extraProvider.getCounter(it.id), extraProvider.getProgress(it.id)) + } +} + fun Throwable.toErrorState(canRetry: Boolean = true) = ErrorState( exception = this, icon = getErrorIcon(this), diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt index 8c93470bf..670abd225 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt @@ -42,7 +42,7 @@ class RemoteListFragment : MangaListFragment() { return super.onCreateActionMode(mode, menu) } - override fun onFilterClick() { + override fun onFilterClick(view: View?) { FilterBottomSheet.show(childFragmentManager) } @@ -69,7 +69,7 @@ class RemoteListFragment : MangaListFragment() { true } R.id.action_filter -> { - onFilterClick() + onFilterClick(null) true } else -> false diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt index c4bec6cb5..34c8600dd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt @@ -105,7 +105,7 @@ class MultiSearchActivity : BaseActivity(), MangaLis override fun onUpdateFilter(tags: Set) = Unit - override fun onFilterClick() = Unit + override fun onFilterClick(view: View?) = Unit override fun onEmptyActionClick() = Unit diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt index 41fc975b0..7a7004e6e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt @@ -89,7 +89,7 @@ class FeedFragment : override fun onUpdateFilter(tags: Set) = Unit - override fun onFilterClick() = Unit + override fun onFilterClick(view: View?) = Unit override fun onEmptyActionClick() = Unit diff --git a/app/src/main/res/menu/opt_favourites_list.xml b/app/src/main/res/menu/opt_favourites_list.xml deleted file mode 100644 index 269569df7..000000000 --- a/app/src/main/res/menu/opt_favourites_list.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file