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 786ba5138..dcc9b1097 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 @@ -3,8 +3,11 @@ package org.koitharu.kotatsu.favourites.ui.categories import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.yield import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.prefs.AppSettings @@ -25,7 +28,7 @@ class FavouritesCategoriesViewModel @Inject constructor( private val settings: AppSettings, ) : BaseViewModel() { - private var reorderJob: Job? = null + private var commitJob: Job? = null val content = MutableStateFlow>(listOf(LoadingState)) @@ -33,7 +36,7 @@ class FavouritesCategoriesViewModel @Inject constructor( launchJob(Dispatchers.Default) { repository.observeCategoriesWithCovers() .collectLatest { - reorderJob?.join() + commitJob?.join() updateContent(it) } } @@ -52,17 +55,10 @@ class FavouritesCategoriesViewModel @Inject constructor( fun isEmpty(): Boolean = content.value.none { it is CategoryListModel } fun reorderCategories(oldPos: Int, newPos: Int) { - val prevJob = reorderJob - reorderJob = launchJob(Dispatchers.Default) { - prevJob?.join() - val snapshot = content.requireValue().toMutableList() - snapshot.move(oldPos, newPos) - content.value = snapshot - val ids = snapshot.mapNotNullTo(ArrayList(snapshot.size)) { - (it as? CategoryListModel)?.category?.id - } - repository.reorderCategories(ids) - } + val snapshot = content.requireValue().toMutableList() + snapshot.move(oldPos, newPos) + content.value = snapshot + commit(snapshot) } fun setIsVisible(ids: Set, isVisible: Boolean) { @@ -80,6 +76,19 @@ class FavouritesCategoriesViewModel @Inject constructor( } } + private fun commit(snapshot: List) { + val prevJob = commitJob + commitJob = launchJob { + prevJob?.cancelAndJoin() + delay(500) + val ids = snapshot.mapNotNullTo(ArrayList(snapshot.size)) { + (it as? CategoryListModel)?.category?.id + } + repository.reorderCategories(ids) + yield() + } + } + private fun updateContent(categories: Map>) { content.value = categories.map { (category, covers) -> CategoryListModel( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt index ca149eb85..a3e01a2ae 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -141,9 +141,7 @@ class MainActivity : BaseActivity(), AppBarOwner, BottomNav viewModel.counters.observe(this, ::onCountersChanged) viewModel.appUpdate.observe(this, MenuInvalidator(this)) viewModel.onFirstStart.observeEvent(this) { - OnboardDialogFragment.showWelcome( - supportFragmentManager - ) + OnboardDialogFragment.show(supportFragmentManager) } searchSuggestionViewModel.isIncognitoModeEnabled.observe(this, this::onIncognitoModeChanged) }