Ignore load errors if wasn't loading

This commit is contained in:
Kirill Kamakin
2022-11-05 11:32:17 +01:00
parent 39ce70f964
commit d873bfa2ed
3 changed files with 36 additions and 11 deletions

View File

@@ -0,0 +1,23 @@
package gq.kirmanak.mealient.extensions
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
fun <T> Flow<T>.valueUpdatesOnly(): Flow<T> = when (this) {
is ValueUpdateOnlyFlowImpl<T> -> this
else -> ValueUpdateOnlyFlowImpl(this)
}
private class ValueUpdateOnlyFlowImpl<T>(private val upstream: Flow<T>) : Flow<T> {
override suspend fun collect(collector: FlowCollector<T>) {
var previousValue: T? = null
upstream.collect { value ->
if (previousValue != null && previousValue != value) {
collector.emit(value)
}
previousValue = value
}
}
}

View File

@@ -8,9 +8,10 @@ import androidx.paging.cachedIn
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.auth.AuthRepo import gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.recipes.RecipeRepo import gq.kirmanak.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.extensions.valueUpdatesOnly
import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.logging.Logger
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.runningReduce import kotlinx.coroutines.flow.onEach
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
@@ -26,12 +27,9 @@ class RecipeViewModel @Inject constructor(
val isAuthorized: LiveData<Boolean?> = _isAuthorized val isAuthorized: LiveData<Boolean?> = _isAuthorized
init { init {
authRepo.isAuthorizedFlow.runningReduce { wasAuthorized, isAuthorized -> authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach {
logger.v { "Authorization state changed from $wasAuthorized to $isAuthorized" } logger.v { "Authorization state changed to $it" }
if (wasAuthorized != isAuthorized) { _isAuthorized.postValue(it)
_isAuthorized.postValue(isAuthorized)
}
isAuthorized
}.launchIn(viewModelScope) }.launchIn(viewModelScope)
} }

View File

@@ -19,10 +19,14 @@ import gq.kirmanak.mealient.datasource.NetworkError
import gq.kirmanak.mealient.extensions.collectWhenViewResumed import gq.kirmanak.mealient.extensions.collectWhenViewResumed
import gq.kirmanak.mealient.extensions.refreshRequestFlow import gq.kirmanak.mealient.extensions.refreshRequestFlow
import gq.kirmanak.mealient.extensions.showLongToast import gq.kirmanak.mealient.extensions.showLongToast
import gq.kirmanak.mealient.extensions.valueUpdatesOnly
import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.logging.Logger
import gq.kirmanak.mealient.ui.activity.MainActivityViewModel import gq.kirmanak.mealient.ui.activity.MainActivityViewModel
import gq.kirmanak.mealient.ui.recipes.images.RecipePreloaderFactory 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 import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
@@ -133,7 +137,7 @@ private fun Throwable.toLoadErrorReasonText(): Int? = when (this) {
private fun <T : Any, VH : RecyclerView.ViewHolder> PagingDataAdapter<T, VH>.refreshErrors(): Flow<Throwable> { private fun <T : Any, VH : RecyclerView.ViewHolder> PagingDataAdapter<T, VH>.refreshErrors(): Flow<Throwable> {
return loadStateFlow return loadStateFlow
.map { it.refresh } .map { it.refresh }
.distinctUntilChanged() .valueUpdatesOnly()
.filterIsInstance<LoadState.Error>() .filterIsInstance<LoadState.Error>()
.map { it.error } .map { it.error }
} }
@@ -141,7 +145,7 @@ private fun <T : Any, VH : RecyclerView.ViewHolder> PagingDataAdapter<T, VH>.ref
private fun <T : Any, VH : RecyclerView.ViewHolder> PagingDataAdapter<T, VH>.appendPaginationEnd(): Flow<Unit> { private fun <T : Any, VH : RecyclerView.ViewHolder> PagingDataAdapter<T, VH>.appendPaginationEnd(): Flow<Unit> {
return loadStateFlow return loadStateFlow
.map { it.append.endOfPaginationReached } .map { it.append.endOfPaginationReached }
.distinctUntilChanged() .valueUpdatesOnly()
.filter { it } .filter { it }
.map { } .map { }
} }