Skip to content

Commit

Permalink
🔀 resolve conflicts from android dev branch
Browse files Browse the repository at this point in the history
  • Loading branch information
kmkim2689 committed Jul 26, 2024
2 parents 3e948b5 + 7c06b14 commit 7d20e77
Show file tree
Hide file tree
Showing 23 changed files with 261 additions and 91 deletions.
1 change: 1 addition & 0 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ plugins {
alias(libs.plugins.google.gms.google.services)
id("kotlin-kapt")
id("kotlin-parcelize")
id("androidx.navigation.safeargs.kotlin")
}

android {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class MainActivity : AppCompatActivity() {

navController.addOnDestinationChangedListener { _, destination, _ ->
when (destination.id) {
R.id.homeFragment -> bottomNav.visibility = View.VISIBLE
R.id.homeFragment, R.id.searchFragment, R.id.profileFragment, R.id.categoryFragment -> bottomNav.visibility = View.VISIBLE
else -> bottomNav.visibility = View.GONE
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import net.pengcook.android.R
import net.pengcook.android.databinding.FragmentCategoryBinding
import net.pengcook.android.presentation.core.style.GridSpacingItemDecoration
Expand Down Expand Up @@ -46,7 +47,11 @@ class CategoryFragment : Fragment() {
val uiEvent = event.getContentIfNotHandled() ?: return@observe
when (uiEvent) {
is CategoryUiEvent.NavigateToList -> {
// TODO Navigation
val action =
CategoryFragmentDirections.actionCategoryFragmentToCategoryFeedListFragment(
uiEvent.categoryCode,
)
findNavController().navigate(action)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,24 @@ import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import net.pengcook.android.databinding.ItemFeedBinding
import net.pengcook.android.presentation.core.model.Recipe
import net.pengcook.android.presentation.home.FeedRecyclerViewAdapter
import net.pengcook.android.presentation.home.holder.FeedViewHolder
import net.pengcook.android.presentation.home.listener.FeedItemEventListener

class CategoryFeedListAdapter :
PagingDataAdapter<Recipe, FeedRecyclerViewAdapter.ViewHolder>(diffCallback) {
class CategoryFeedListAdapter(
private val feedItemEventListener: FeedItemEventListener,
) :
PagingDataAdapter<Recipe, FeedViewHolder>(diffCallback) {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): FeedRecyclerViewAdapter.ViewHolder {
): FeedViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ItemFeedBinding.inflate(layoutInflater, parent, false)
return FeedRecyclerViewAdapter.ViewHolder(binding)
return FeedViewHolder(binding, feedItemEventListener)
}

override fun onBindViewHolder(
holder: FeedRecyclerViewAdapter.ViewHolder,
holder: FeedViewHolder,
position: Int,
) {
val item = getItem(position) ?: return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
Expand All @@ -20,14 +22,15 @@ class CategoryFeedListFragment : Fragment() {
private var _binding: FragmentCategoryFeedListBinding? = null
private val binding: FragmentCategoryFeedListBinding
get() = _binding!!
private val args: CategoryFeedListFragmentArgs by navArgs()
private val viewModel: CategoryFeedListViewModel by viewModels {
CategoryFeedListViewModelFactory(
DefaultFeedRepository(DefaultFeedRemoteDataSource(RetrofitClient.service(FeedService::class.java))),
"Dessert",
args.category,
)
}
private val adapter: CategoryFeedListAdapter by lazy {
CategoryFeedListAdapter()
CategoryFeedListAdapter(viewModel)
}

override fun onCreateView(
Expand Down Expand Up @@ -56,7 +59,7 @@ class CategoryFeedListFragment : Fragment() {

private fun setUpBindingVariables() {
binding.viewModel = viewModel
binding.categoryName = "Dessert"
binding.categoryName = args.category
binding.adapter = adapter
}

Expand All @@ -75,10 +78,15 @@ class CategoryFeedListFragment : Fragment() {
val newEvent = event.getContentIfNotHandled() ?: return@observe
when (newEvent) {
is CategoryFeedListUiEvent.NavigateBack -> {
// TODO implement navigation
findNavController().navigateUp()
}

is CategoryFeedListUiEvent.NavigateToDetail -> {
// TODO implement navigation
val action =
CategoryFeedListFragmentDirections.actionCategoryFeedListFragmentToDetailRecipeFragment(
newEvent.recipe,
)
findNavController().navigate(action)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import net.pengcook.android.databinding.FragmentDetailRecipeBinding
import net.pengcook.android.presentation.core.model.Recipe

class DetailRecipeFragment : Fragment() {
private val args: DetailRecipeFragmentArgs by navArgs()
private val binding by lazy { FragmentDetailRecipeBinding.inflate(layoutInflater) }
private val viewModel by lazy { DetailRecipeViewModel(recipe) }
private lateinit var recipe: Recipe
private val recipe: Recipe by lazy { args.recipe }

override fun onCreateView(
inflater: LayoutInflater,
Expand All @@ -25,14 +28,26 @@ class DetailRecipeFragment : Fragment() {
) {
super.onViewCreated(view, savedInstanceState)
fetchRecipe()
observeNavigationEvent()
}

private fun fetchRecipe() {
val argument = arguments?.getParcelable(RECIPE_KEY) as Recipe?
if (argument is Recipe) {
recipe = argument
private fun observeNavigationEvent() {
viewModel.navigateToStepEvent.observe(viewLifecycleOwner) { navigationEvent ->
val navigationAvailable = navigationEvent.getContentIfNotHandled() ?: return@observe
if (navigationAvailable) {
navigateToStep()
}
}
binding.recipe = recipe
}

private fun fetchRecipe() {
binding.recipe = args.recipe
binding.vm = viewModel
}

private fun navigateToStep() {
val action = DetailRecipeFragmentDirections.actionDetailRecipeFragmentToRecipeStepFragment()
findNavController().navigate(action)
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
package net.pengcook.android.presentation.detail

// DetailRecipeViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import net.pengcook.android.presentation.core.model.Recipe
import net.pengcook.android.presentation.core.util.Event

class DetailRecipeViewModel(
private val recipe: Recipe,
) : ViewModel()
) : ViewModel() {
private val _navigateToStepEvent = MutableLiveData<Event<Boolean>>()
val navigateToStepEvent: LiveData<Event<Boolean>> get() = _navigateToStepEvent

fun onNavigateToMakingStep() {
_navigateToStepEvent.value = Event(true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import net.pengcook.android.databinding.ItemFeedBinding
import net.pengcook.android.presentation.core.model.Recipe
import net.pengcook.android.presentation.home.holder.FeedViewHolder
import net.pengcook.android.presentation.home.listener.FeedItemEventListener

class FeedRecyclerViewAdapter(private val eventListener: FeedItemEventListener) :
PagingDataAdapter<Recipe, FeedRecyclerViewAdapter.ViewHolder>(diffCallback) {
PagingDataAdapter<Recipe, FeedViewHolder>(diffCallback) {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): ViewHolder {
): FeedViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = ItemFeedBinding.inflate(inflater, parent, false)
return ViewHolder(binding)
return FeedViewHolder(binding, eventListener)
}

override fun onBindViewHolder(
holder: ViewHolder,
holder: FeedViewHolder,
position: Int,
) {
val item = getItem(position)
Expand All @@ -30,13 +30,6 @@ class FeedRecyclerViewAdapter(private val eventListener: FeedItemEventListener)
}
}

class ViewHolder(private val binding: ItemFeedBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: Recipe) {
binding.recipe = item
binding.executePendingBindings()
}
}

companion object {
val diffCallback =
object : DiffUtil.ItemCallback<Recipe>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
Expand All @@ -15,6 +16,7 @@ import net.pengcook.android.data.remote.api.FeedService
import net.pengcook.android.data.repository.feed.DefaultFeedRepository
import net.pengcook.android.data.util.network.RetrofitClient
import net.pengcook.android.databinding.FragmentHomeBinding
import net.pengcook.android.presentation.core.model.Recipe

class HomeFragment : Fragment() {
private val viewModel: HomeViewModel by viewModels {
Expand Down Expand Up @@ -49,7 +51,23 @@ class HomeFragment : Fragment() {
super.onViewCreated(view, savedInstanceState)

initBinding()
observing()
}

private fun observing() {
observeFeedData()
observeUiEvent()
}

private fun observeUiEvent() {
viewModel.uiEvent.observe(viewLifecycleOwner) { event ->
val newEvent = event.getContentIfNotHandled() ?: return@observe
when (newEvent) {
is HomeEvent.NavigateToDetail -> {
onSingleMovieClicked(newEvent.recipe)
}
}
}
}

private fun observeFeedData() {
Expand All @@ -62,6 +80,11 @@ class HomeFragment : Fragment() {
}
}

private fun onSingleMovieClicked(recipe: Recipe) {
val action = HomeFragmentDirections.actionHomeFragmentToDetailRecipeFragment(recipe)
findNavController().navigate(action)
}

private fun initBinding() {
binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = viewModel
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.pengcook.android.presentation.home

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
Expand All @@ -11,11 +12,16 @@ import androidx.paging.liveData
import net.pengcook.android.data.datasource.FeedPagingSource
import net.pengcook.android.data.repository.feed.FeedRepository
import net.pengcook.android.presentation.core.model.Recipe
import net.pengcook.android.presentation.core.util.Event
import net.pengcook.android.presentation.home.listener.FeedItemEventListener

class HomeViewModel(
private val feedRepository: FeedRepository,
) : ViewModel(), FeedItemEventListener {
private val _uiEvent: MutableLiveData<Event<HomeEvent>> = MutableLiveData()
val uiEvent: LiveData<Event<HomeEvent>>
get() = _uiEvent

val feedData: LiveData<PagingData<Recipe>> =
Pager(
config = PagingConfig(pageSize = PAGE_SIZE, enablePlaceholders = false),
Expand All @@ -25,10 +31,14 @@ class HomeViewModel(
.cachedIn(viewModelScope)

override fun onNavigateToDetail(recipe: Recipe) {
// Navigate to detail page
_uiEvent.value = Event(HomeEvent.NavigateToDetail(recipe))
}

companion object {
private const val PAGE_SIZE = 10
}
}

sealed interface HomeEvent {
data class NavigateToDetail(val recipe: Recipe) : HomeEvent
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.pengcook.android.presentation.home.holder

import androidx.recyclerview.widget.RecyclerView
import net.pengcook.android.databinding.ItemFeedBinding
import net.pengcook.android.presentation.core.model.Recipe
import net.pengcook.android.presentation.home.listener.FeedItemEventListener

class FeedViewHolder(
private val binding: ItemFeedBinding,
private val eventListener: FeedItemEventListener,
) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: Recipe) {
binding.recipe = item
binding.eventListener = eventListener
binding.executePendingBindings()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import net.pengcook.android.databinding.FragmentRecipeMakingBinding

class RecipeMakingFragment : Fragment() {
Expand All @@ -29,13 +30,24 @@ class RecipeMakingFragment : Fragment() {
) {
super.onViewCreated(view, savedInstanceState)
initBinding()
viewModel.uiEvent.observe(viewLifecycleOwner) { event ->
val newEvent = event.getContentIfNotHandled() ?: return@observe
when (newEvent) {
is MakingEvent.NavigateToMakingStep -> onNextClicked()
}
}
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}

private fun onNextClicked() {
val action = RecipeMakingFragmentDirections.actionRecipeMakingFragmentToStepMakingFragment()
findNavController().navigate(action)
}

private fun initBinding() {
binding.lifecycleOwner = this
binding.vm = viewModel
Expand Down
Loading

0 comments on commit 7d20e77

Please sign in to comment.