diff --git a/app/src/main/java/gq/kirmanak/mealient/extensions/FlowExtensions.kt b/app/src/main/java/gq/kirmanak/mealient/extensions/FlowExtensions.kt new file mode 100644 index 0000000..eedafc0 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/extensions/FlowExtensions.kt @@ -0,0 +1,23 @@ +package gq.kirmanak.mealient.extensions + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.FlowCollector + +fun Flow.valueUpdatesOnly(): Flow = when (this) { + is ValueUpdateOnlyFlowImpl -> this + else -> ValueUpdateOnlyFlowImpl(this) +} + +private class ValueUpdateOnlyFlowImpl(private val upstream: Flow) : Flow { + + override suspend fun collect(collector: FlowCollector) { + var previousValue: T? = null + upstream.collect { value -> + if (previousValue != null && previousValue != value) { + collector.emit(value) + } + previousValue = value + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt index 998af6d..7e3a733 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt @@ -8,9 +8,10 @@ import androidx.paging.cachedIn import dagger.hilt.android.lifecycle.HiltViewModel import gq.kirmanak.mealient.data.auth.AuthRepo import gq.kirmanak.mealient.data.recipes.RecipeRepo +import gq.kirmanak.mealient.extensions.valueUpdatesOnly import gq.kirmanak.mealient.logging.Logger import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.runningReduce +import kotlinx.coroutines.flow.onEach import javax.inject.Inject @HiltViewModel @@ -26,12 +27,9 @@ class RecipeViewModel @Inject constructor( val isAuthorized: LiveData = _isAuthorized init { - authRepo.isAuthorizedFlow.runningReduce { wasAuthorized, isAuthorized -> - logger.v { "Authorization state changed from $wasAuthorized to $isAuthorized" } - if (wasAuthorized != isAuthorized) { - _isAuthorized.postValue(isAuthorized) - } - isAuthorized + authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach { + logger.v { "Authorization state changed to $it" } + _isAuthorized.postValue(it) }.launchIn(viewModelScope) } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt index 3260b53..b0fe05b 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt @@ -19,10 +19,14 @@ import gq.kirmanak.mealient.datasource.NetworkError import gq.kirmanak.mealient.extensions.collectWhenViewResumed import gq.kirmanak.mealient.extensions.refreshRequestFlow import gq.kirmanak.mealient.extensions.showLongToast +import gq.kirmanak.mealient.extensions.valueUpdatesOnly import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.ui.activity.MainActivityViewModel import gq.kirmanak.mealient.ui.recipes.images.RecipePreloaderFactory -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.map import javax.inject.Inject @AndroidEntryPoint @@ -133,7 +137,7 @@ private fun Throwable.toLoadErrorReasonText(): Int? = when (this) { private fun PagingDataAdapter.refreshErrors(): Flow { return loadStateFlow .map { it.refresh } - .distinctUntilChanged() + .valueUpdatesOnly() .filterIsInstance() .map { it.error } } @@ -141,7 +145,7 @@ private fun PagingDataAdapter.ref private fun PagingDataAdapter.appendPaginationEnd(): Flow { return loadStateFlow .map { it.append.endOfPaginationReached } - .distinctUntilChanged() + .valueUpdatesOnly() .filter { it } .map { } -} \ No newline at end of file +}