From 7f530d0476939fe7ac285be05c1ff660796c12c9 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 9 Jan 2023 11:19:17 +0200 Subject: [PATCH] Fix list mode changing --- .../ui/list/FavouritesListViewModel.kt | 2 +- .../kotatsu/history/ui/HistoryListViewModel.kt | 2 +- .../kotatsu/list/ui/ListModeBottomSheet.kt | 3 +++ .../kotatsu/list/ui/MangaListViewModel.kt | 18 +++++++----------- .../kotatsu/local/ui/LocalListViewModel.kt | 2 +- .../remotelist/ui/RemoteListViewModel.kt | 2 +- .../kotatsu/search/ui/SearchViewModel.kt | 2 +- .../suggestions/ui/SuggestionsViewModel.kt | 5 +++-- .../tracker/ui/updates/UpdatesViewModel.kt | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) 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 f9842b9d1..a73142563 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 @@ -55,7 +55,7 @@ class FavouritesListViewModel @AssistedInject constructor( } else { repository.observeAll(categoryId) }, - createListModeFlow(), + listModeFlow, ) { list, mode -> when { list.isEmpty() -> listOf( diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index bb7bb0e1d..8806ea2d2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -48,7 +48,7 @@ class HistoryListViewModel @Inject constructor( override val content = combine( repository.observeAllWithHistory(), historyGrouping, - createListModeFlow(), + listModeFlow, ) { list, grouped, mode -> when { list.isEmpty() -> listOf( diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt index 042d30bc3..37339aac2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt @@ -49,6 +49,9 @@ class ListModeBottomSheet : } override fun onButtonChecked(group: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean) { + if (!isChecked) { + return + } val mode = when (checkedId) { R.id.button_list -> ListMode.LIST R.id.button_list_detailed -> ListMode.DETAILED_LIST diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt index f71ccac22..03ec95536 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt @@ -1,26 +1,29 @@ package org.koitharu.kotatsu.list.ui import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.plus import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.base.ui.util.ReversibleAction import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.core.prefs.observeAsFlow import org.koitharu.kotatsu.core.prefs.observeAsLiveData import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.utils.SingleLiveEvent +import org.koitharu.kotatsu.utils.asFlowLiveData abstract class MangaListViewModel( private val settings: AppSettings, ) : BaseViewModel() { abstract val content: LiveData> - val listMode = MutableLiveData() + protected val listModeFlow = settings.observeAsFlow(AppSettings.KEY_LIST_MODE) { listMode } + .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, settings.listMode) + val listMode = listModeFlow.asFlowLiveData(viewModelScope.coroutineContext) val onActionDone = SingleLiveEvent() val gridScale = settings.observeAsLiveData( context = viewModelScope.coroutineContext + Dispatchers.Default, @@ -30,13 +33,6 @@ abstract class MangaListViewModel( open fun onUpdateFilter(tags: Set) = Unit - protected fun createListModeFlow() = settings.observeAsFlow(AppSettings.KEY_LIST_MODE) { listMode } - .onEach { - if (listMode.value != it) { - listMode.postValue(it) - } - } - abstract fun onRefresh() abstract fun onRetry() diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index 467f87f1b..499ed4b6d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -57,7 +57,7 @@ class LocalListViewModel @Inject constructor( override val content = combine( mangaList, - createListModeFlow(), + listModeFlow, sortOrder.asFlow(), selectedTags, listError, diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index 386808b28..aef575033 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -63,7 +63,7 @@ class RemoteListViewModel @AssistedInject constructor( override val content = combine( mangaList, - createListModeFlow(), + listModeFlow, createHeaderFlow(), listError, hasNextPage, diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt index 37301cd11..b959f65a7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchViewModel.kt @@ -39,7 +39,7 @@ class SearchViewModel @AssistedInject constructor( override val content = combine( mangaList, - createListModeFlow(), + listModeFlow, listError, hasNextPage, ) { list, mode, error, hasNext -> diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt index 25941f2e3..2eca00df8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/ui/SuggestionsViewModel.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.suggestions.ui import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine @@ -17,6 +16,7 @@ import org.koitharu.kotatsu.list.ui.model.toUi import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository import org.koitharu.kotatsu.utils.asFlowLiveData import org.koitharu.kotatsu.utils.ext.onFirst +import javax.inject.Inject @HiltViewModel class SuggestionsViewModel @Inject constructor( @@ -26,7 +26,7 @@ class SuggestionsViewModel @Inject constructor( override val content = combine( repository.observeAll(), - createListModeFlow(), + listModeFlow, ) { list, mode -> when { list.isEmpty() -> listOf( @@ -37,6 +37,7 @@ class SuggestionsViewModel @Inject constructor( actionStringRes = 0, ), ) + else -> list.toUi(mode) } }.onStart { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt index 586ef35c2..6a649cd38 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt @@ -34,7 +34,7 @@ class UpdatesViewModel @Inject constructor( override val content = combine( repository.observeUpdatedManga(), - createListModeFlow(), + listModeFlow, ) { mangaMap, mode -> when { mangaMap.isEmpty() -> listOf(