Fix absent recipe refresh on authorization

This commit is contained in:
Kirill Kamakin
2022-11-13 15:38:45 +01:00
parent 280f282972
commit 32d366b8fd
5 changed files with 33 additions and 36 deletions

View File

@@ -15,4 +15,6 @@ interface RecipeRepo {
suspend fun loadRecipeInfo(recipeId: String): FullRecipeEntity? suspend fun loadRecipeInfo(recipeId: String): FullRecipeEntity?
fun updateNameQuery(name: String?) fun updateNameQuery(name: String?)
suspend fun refreshRecipes()
} }

View File

@@ -25,7 +25,11 @@ class RecipeRepoImpl @Inject constructor(
override fun createPager(): Pager<Int, RecipeSummaryEntity> { override fun createPager(): Pager<Int, RecipeSummaryEntity> {
logger.v { "createPager() called" } logger.v { "createPager() called" }
val pagingConfig = PagingConfig(pageSize = LOAD_PAGE_SIZE, enablePlaceholders = true) val pagingConfig = PagingConfig(
pageSize = LOAD_PAGE_SIZE,
enablePlaceholders = true,
initialLoadSize = INITIAL_LOAD_PAGE_SIZE,
)
return Pager( return Pager(
config = pagingConfig, config = pagingConfig,
remoteMediator = mediator, remoteMediator = mediator,
@@ -59,7 +63,17 @@ class RecipeRepoImpl @Inject constructor(
pagingSourceFactory.setQuery(name) pagingSourceFactory.setQuery(name)
} }
override suspend fun refreshRecipes() {
logger.v { "refreshRecipes() called" }
runCatchingExceptCancel {
storage.refreshAll(dataSource.requestRecipes(0, INITIAL_LOAD_PAGE_SIZE))
}.onFailure {
logger.e(it) { "Can't refresh recipes" }
}
}
companion object { companion object {
private const val LOAD_PAGE_SIZE = 50 private const val LOAD_PAGE_SIZE = 50
private const val INITIAL_LOAD_PAGE_SIZE = LOAD_PAGE_SIZE * 3
} }
} }

View File

@@ -123,15 +123,6 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) {
logger.v { "setupRecipeAdapter: received refresh request" } logger.v { "setupRecipeAdapter: received refresh request" }
recipesAdapter.refresh() recipesAdapter.refresh()
} }
viewModel.isAuthorized.observe(viewLifecycleOwner) { isAuthorized ->
logger.v { "setupRecipeAdapter: isAuthorized changed to $isAuthorized" }
if (isAuthorized != null) {
if (isAuthorized) recipesAdapter.refresh()
// else is ignored to avoid the removal of the non-public recipes
viewModel.onAuthorizationChangeHandled()
}
}
} }
private fun onLoadFailure(error: Throwable) { private fun onLoadFailure(error: Throwable) {

View File

@@ -1,6 +1,9 @@
package gq.kirmanak.mealient.ui.recipes package gq.kirmanak.mealient.ui.recipes
import androidx.lifecycle.* import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
import androidx.lifecycle.viewModelScope
import androidx.paging.cachedIn 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
@@ -20,21 +23,13 @@ class RecipesListViewModel @Inject constructor(
val pagingData = recipeRepo.createPager().flow.cachedIn(viewModelScope) val pagingData = recipeRepo.createPager().flow.cachedIn(viewModelScope)
private val _isAuthorized = MutableLiveData<Boolean?>(null)
val isAuthorized: LiveData<Boolean?> = _isAuthorized
init { init {
authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach { authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach { hasAuthorized ->
logger.v { "Authorization state changed to $it" } logger.v { "Authorization state changed to $hasAuthorized" }
_isAuthorized.postValue(it) if (hasAuthorized) recipeRepo.refreshRecipes()
}.launchIn(viewModelScope) }.launchIn(viewModelScope)
} }
fun onAuthorizationChangeHandled() {
logger.v { "onAuthorizationSuccessHandled() called" }
_isAuthorized.postValue(null)
}
fun refreshRecipeInfo(recipeSlug: String): LiveData<Result<Unit>> { fun refreshRecipeInfo(recipeSlug: String): LiveData<Result<Unit>> {
logger.v { "refreshRecipeInfo called with: recipeSlug = $recipeSlug" } logger.v { "refreshRecipeInfo called with: recipeSlug = $recipeSlug" }
return liveData { return liveData {

View File

@@ -25,29 +25,24 @@ class RecipesListViewModelTest : BaseUnitTest() {
lateinit var recipeRepo: RecipeRepo lateinit var recipeRepo: RecipeRepo
@Test @Test
fun `when authRepo isAuthorized changes to true expect isAuthorized update`() { fun `when authRepo isAuthorized changes to true expect that recipes are refreshed`() {
every { authRepo.isAuthorizedFlow } returns flowOf(false, true) every { authRepo.isAuthorizedFlow } returns flowOf(false, true)
assertThat(createSubject().isAuthorized.value).isTrue() createSubject()
coVerify { recipeRepo.refreshRecipes() }
} }
@Test @Test
fun `when authRepo isAuthorized changes to false expect isAuthorized update`() { fun `when authRepo isAuthorized changes to false expect that recipes are not refreshed`() {
every { authRepo.isAuthorizedFlow } returns flowOf(true, false) every { authRepo.isAuthorizedFlow } returns flowOf(true, false)
assertThat(createSubject().isAuthorized.value).isFalse() createSubject()
coVerify(inverse = true) { recipeRepo.refreshRecipes() }
} }
@Test @Test
fun `when authRepo isAuthorized doesn't change expect isAuthorized null`() { fun `when authRepo isAuthorized doesn't change expect that recipes are not refreshed`() {
every { authRepo.isAuthorizedFlow } returns flowOf(true) every { authRepo.isAuthorizedFlow } returns flowOf(true)
assertThat(createSubject().isAuthorized.value).isNull() createSubject()
} coVerify(inverse = true) { recipeRepo.refreshRecipes() }
@Test
fun `when isAuthorization change is handled expect isAuthorized null`() {
every { authRepo.isAuthorizedFlow } returns flowOf(true, false)
val subject = createSubject()
subject.onAuthorizationChangeHandled()
assertThat(subject.isAuthorized.value).isNull()
} }
@Test @Test