From a20694e7fda9b291947e67781afcb4ab87b56d2f Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Wed, 14 Dec 2022 22:14:28 +0100 Subject: [PATCH] Hide/show favorite icon on sign-out/sign-in --- .../mealient/ui/recipes/RecipeViewHolder.kt | 22 ++++++++++------- .../ui/recipes/RecipesListFragment.kt | 8 ++++--- .../ui/recipes/RecipesListViewModel.kt | 3 ++- .../ui/recipes/RecipesPagingAdapter.kt | 24 ++++++++++--------- .../main/res/layout/view_holder_recipe.xml | 4 +++- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewHolder.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewHolder.kt index cd263b7..12496c1 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewHolder.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewHolder.kt @@ -2,7 +2,11 @@ package gq.kirmanak.mealient.ui.recipes import android.view.View import androidx.annotation.StringRes +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import dagger.hilt.android.scopes.FragmentScoped import gq.kirmanak.mealient.R import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity @@ -10,25 +14,24 @@ import gq.kirmanak.mealient.databinding.ViewHolderRecipeBinding import gq.kirmanak.mealient.extensions.resources import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.ui.recipes.images.RecipeImageLoader -import javax.inject.Inject -class RecipeViewHolder private constructor( +class RecipeViewHolder @AssistedInject constructor( private val logger: Logger, - private val binding: ViewHolderRecipeBinding, + @Assisted private val binding: ViewHolderRecipeBinding, private val recipeImageLoader: RecipeImageLoader, - private val clickListener: (ClickEvent) -> Unit, + @Assisted private val showFavoriteIcon: Boolean, + @Assisted private val clickListener: (ClickEvent) -> Unit, ) : RecyclerView.ViewHolder(binding.root) { @FragmentScoped - class Factory @Inject constructor( - private val recipeImageLoader: RecipeImageLoader, - private val logger: Logger, - ) { + @AssistedFactory + interface Factory { fun build( + showFavoriteIcon: Boolean, binding: ViewHolderRecipeBinding, clickListener: (ClickEvent) -> Unit, - ) = RecipeViewHolder(logger, binding, recipeImageLoader, clickListener) + ): RecipeViewHolder } @@ -59,6 +62,7 @@ class RecipeViewHolder private constructor( logger.d { "bind: item clicked $entity" } clickListener(ClickEvent.RecipeClick(entity)) } + binding.favoriteIcon.isVisible = showFavoriteIcon binding.favoriteIcon.setOnClickListener { clickListener(ClickEvent.FavoriteClick(entity)) } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt index f6f08f1..2df441c 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListFragment.kt @@ -55,7 +55,9 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) { checkedMenuItemId = R.id.recipes_list ) } - setupRecipeAdapter() + viewModel.showFavoriteIcon.observe(viewLifecycleOwner) { showFavoriteIcon -> + setupRecipeAdapter(showFavoriteIcon) + } hideKeyboardOnScroll() } @@ -87,10 +89,10 @@ class RecipesListFragment : Fragment(R.layout.fragment_recipes_list) { return findNavController().currentDestination?.id != R.id.recipesListFragment } - private fun setupRecipeAdapter() { + private fun setupRecipeAdapter(showFavoriteIcon: Boolean) { logger.v { "setupRecipeAdapter() called" } - val recipesAdapter = recipePagingAdapterFactory.build { + val recipesAdapter = recipePagingAdapterFactory.build(showFavoriteIcon) { when (it) { is RecipeViewHolder.ClickEvent.FavoriteClick -> { onFavoriteClick(it) diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt index 7534550..f120965 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesListViewModel.kt @@ -2,6 +2,7 @@ package gq.kirmanak.mealient.ui.recipes import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.asLiveData import androidx.lifecycle.liveData import androidx.lifecycle.viewModelScope import androidx.paging.cachedIn @@ -23,6 +24,7 @@ class RecipesListViewModel @Inject constructor( ) : ViewModel() { val pagingData = recipeRepo.createPager().flow.cachedIn(viewModelScope) + val showFavoriteIcon = authRepo.isAuthorizedFlow.asLiveData() init { authRepo.isAuthorizedFlow.valueUpdatesOnly().onEach { hasAuthorized -> @@ -40,7 +42,6 @@ class RecipesListViewModel @Inject constructor( } } - // TODO hide favourite icons if not authorized fun onFavoriteIconClick(recipeSummaryEntity: RecipeSummaryEntity) = liveData { logger.v { "onFavoriteIconClick() called with: recipeSummaryEntity = $recipeSummaryEntity" } recipeRepo.updateIsRecipeFavorite( diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesPagingAdapter.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesPagingAdapter.kt index 6dd858b..2a15df8 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesPagingAdapter.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesPagingAdapter.kt @@ -4,27 +4,29 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import dagger.hilt.android.scopes.FragmentScoped import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity import gq.kirmanak.mealient.databinding.ViewHolderRecipeBinding import gq.kirmanak.mealient.logging.Logger -import javax.inject.Inject -class RecipesPagingAdapter private constructor( +class RecipesPagingAdapter @AssistedInject constructor( private val logger: Logger, private val recipeViewHolderFactory: RecipeViewHolder.Factory, - private val clickListener: (RecipeViewHolder.ClickEvent) -> Unit + @Assisted private val showFavoriteIcon: Boolean, + @Assisted private val clickListener: (RecipeViewHolder.ClickEvent) -> Unit ) : PagingDataAdapter(RecipeDiffCallback) { @FragmentScoped - class Factory @Inject constructor( - private val logger: Logger, - private val recipeViewHolderFactory: RecipeViewHolder.Factory, - ) { + @AssistedFactory + interface Factory { - fun build(clickListener: (RecipeViewHolder.ClickEvent) -> Unit) = RecipesPagingAdapter( - logger, recipeViewHolderFactory, clickListener - ) + fun build( + showFavoriteIcon: Boolean, + clickListener: (RecipeViewHolder.ClickEvent) -> Unit, + ): RecipesPagingAdapter } override fun onBindViewHolder(holder: RecipeViewHolder, position: Int) { @@ -37,7 +39,7 @@ class RecipesPagingAdapter private constructor( logger.v { "onCreateViewHolder() called with: parent = $parent, viewType = $viewType" } val inflater = LayoutInflater.from(parent.context) val binding = ViewHolderRecipeBinding.inflate(inflater, parent, false) - return recipeViewHolderFactory.build(binding, clickListener) + return recipeViewHolderFactory.build(showFavoriteIcon, binding, clickListener) } private object RecipeDiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/main/res/layout/view_holder_recipe.xml b/app/src/main/res/layout/view_holder_recipe.xml index 9749daa..2121cfd 100644 --- a/app/src/main/res/layout/view_holder_recipe.xml +++ b/app/src/main/res/layout/view_holder_recipe.xml @@ -40,6 +40,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/favorite_icon" app:layout_constraintVertical_chainStyle="packed" + app:layout_goneMarginTop="@dimen/margin_medium" app:shapeAppearance="?shapeAppearanceCornerMedium" tools:srcCompat="@drawable/placeholder_recipe" /> @@ -52,6 +53,7 @@ app:layout_constraintBottom_toTopOf="@+id/image" app:layout_constraintEnd_toEndOf="@id/image" app:layout_constraintTop_toTopOf="parent" - tools:srcCompat="@drawable/ic_favorite_unfilled" /> + tools:srcCompat="@drawable/ic_favorite_unfilled" + tools:visibility="gone" /> \ No newline at end of file