Skip to content

Commit

Permalink
Implement Navigator and connect with home and product detail. (#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
myung6024 authored Jul 14, 2023
1 parent 784d7d5 commit d212b3d
Show file tree
Hide file tree
Showing 16 changed files with 128 additions and 38 deletions.
18 changes: 18 additions & 0 deletions app/src/main/java/com/peonlee/NavigatorModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.peonlee

import com.peonlee.core.ui.Navigator
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class NavigatorModule {
@Binds
@Singleton
abstract fun bindNavigator(
navigator: PeonLeeNavigator
): Navigator
}
20 changes: 20 additions & 0 deletions app/src/main/java/com/peonlee/PeonLeeNavigator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.peonlee

import android.content.Context
import android.content.Intent
import com.peonlee.core.ui.Navigator
import com.peonlee.feature.detail.ProductDetailActivity
import com.peonlee.review.edit.EditReviewActivity
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class PeonLeeNavigator @Inject constructor() : Navigator {
override fun navigateToProductDetail(context: Context, productId: Int) {
ProductDetailActivity.startActivity(context, productId)
}

override fun navigateToEditReview(context: Context) {
context.startActivity(Intent(context, EditReviewActivity::class.java))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,12 @@ data class ProductDetail(
val price: Int,
val productId: Int,
val promotionList: List<Promotion>,
val score: Score
val score: Score,
val productRatingType: ProductRatingType
)

enum class ProductRatingType {
LIKE,
DISLIKE,
NONE
}
8 changes: 8 additions & 0 deletions core/ui/src/main/java/com/peonlee/core/ui/Navigator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.peonlee.core.ui

import android.content.Context

interface Navigator {
fun navigateToProductDetail(context: Context, productId: Int)
fun navigateToEditReview(context: Context)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.peonlee.core.ui.adapter.product
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.adapter.SingleTypeListAdapter
import com.peonlee.core.ui.databinding.ListItemProductBinding
import com.peonlee.core.ui.viewholder.CommonViewHolder
Expand All @@ -13,7 +14,8 @@ import com.peonlee.model.product.ProductUiModel
* 상품을 위한 Single Item Adapter
*/
class ProductAdapter(
private val rootLayoutParams: LayoutParams
private val rootLayoutParams: LayoutParams,
private val navigator: Navigator
) : SingleTypeListAdapter<ProductUiModel>({ it.id }) {
override fun onCreateViewHolder(parent: ViewGroup): CommonViewHolder<ProductUiModel> {
return ProductViewHolder(
Expand All @@ -22,7 +24,8 @@ class ProductAdapter(
LayoutInflater.from(parent.context),
parent,
false
)
),
navigator
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.peonlee.core.ui.viewholder.product

import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams
import androidx.core.view.isVisible
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.R
import com.peonlee.core.ui.databinding.ListItemProductBinding
import com.peonlee.core.ui.extensions.getStringWithArgs
Expand All @@ -11,8 +12,17 @@ import com.peonlee.model.product.ProductUiModel

class ProductViewHolder(
private val layoutParams: LayoutParams,
val binding: ListItemProductBinding
val binding: ListItemProductBinding,
val navigator: Navigator
) : CommonViewHolder<ProductUiModel>(binding) {
init {
binding.root.setOnClickListener {
getItem {
navigator.navigateToProductDetail(binding.root.context, it.id)
}
}
}

override fun onBindView(item: ProductUiModel) = with(binding) {
root.layoutParams = layoutParams
tvProductName.text = item.name
Expand Down
1 change: 0 additions & 1 deletion feature/detail/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ dependencies {
implementation(project(":core:common"))
implementation(project(":core:domain"))
implementation(project(":core:data"))
implementation(project(":feature:review"))
implementation("com.google.android.material:material:1.9.0")
implementation(libs.androidx.constraintlayout)
implementation(libs.kotlinx.coroutines.android)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import android.content.Context
import android.content.Intent
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.base.BaseActivity
import com.peonlee.data.handle
import com.peonlee.data.model.ProductRatingType
import com.peonlee.data.model.Score
import com.peonlee.data.product.ProductRepository
import com.peonlee.feature.detail.databinding.ActivityProductDetailBinding
import com.peonlee.review.edit.EditReviewActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject
Expand All @@ -31,10 +32,13 @@ class ProductDetailActivity : BaseActivity<ActivityProductDetailBinding>() {
@Inject
lateinit var productRepository: ProductRepository

@Inject
lateinit var navigator: Navigator

private val productId by lazy { intent.getIntExtra(EXTRA_PRODUCT_ID, DEFAULT_PRODUCT_ID) }

private val adapter by lazy {
ProductDetailListAdapter {
ProductDetailListAdapter(navigator) {
ReviewManageDialog().run {
show(supportFragmentManager, tag)
}
Expand All @@ -54,29 +58,29 @@ class ProductDetailActivity : BaseActivity<ActivityProductDetailBinding>() {
binding.btnUpvote.setOnClickListener {
lifecycleScope.launch {
productRepository.likeProduct(productId).handle({
handleVoteState(VoteType.UPVOTE)
handleVoteState(ProductRatingType.LIKE)
updateScore(it)
})
}
}
binding.btnDownvote.setOnClickListener {
lifecycleScope.launch {
productRepository.dislikeProduct(productId).handle({
handleVoteState(VoteType.DOWNVOTE)
handleVoteState(ProductRatingType.DISLIKE)
updateScore(it)
})
}
}
binding.btnCancel.setOnClickListener {
lifecycleScope.launch {
productRepository.cancelLikeProduct(productId).handle({
handleVoteState(VoteType.NONE)
handleVoteState(ProductRatingType.NONE)
updateScore(it)
})
}
}
binding.btnReviewWrite.setOnClickListener {
startActivity(Intent(this, EditReviewActivity::class.java))
navigator.navigateToEditReview(this)
}
binding.rvProductDetail.adapter = adapter
lifecycleScope.launch {
Expand Down Expand Up @@ -171,22 +175,16 @@ class ProductDetailActivity : BaseActivity<ActivityProductDetailBinding>() {
adapter.submitList(itemList)

binding.llVoteContainer.isVisible = true
handleVoteState(VoteType.NONE)
handleVoteState(ProductRatingType.NONE)
})
}
}

private enum class VoteType {
NONE,
UPVOTE,
DOWNVOTE
}

private fun handleVoteState(voteType: VoteType) {
binding.llAlreadyVoteContainer.isVisible = voteType != VoteType.NONE
binding.llUpvote.isVisible = voteType == VoteType.UPVOTE
binding.llDownvote.isVisible = voteType == VoteType.DOWNVOTE
binding.llNoneVoteContainer.isVisible = voteType == VoteType.NONE
private fun handleVoteState(voteType: ProductRatingType) {
binding.llAlreadyVoteContainer.isVisible = voteType != ProductRatingType.NONE
binding.llUpvote.isVisible = voteType == ProductRatingType.LIKE
binding.llDownvote.isVisible = voteType == ProductRatingType.DISLIKE
binding.llNoneVoteContainer.isVisible = voteType == ProductRatingType.NONE
}

private fun updateScore(score: Score) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import coil.load
import com.peonlee.common.util.TimeUtil
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.R
import com.peonlee.core.ui.adapter.MultiTypeListAdapter
import com.peonlee.core.ui.extensions.getString
Expand All @@ -28,6 +29,7 @@ import com.peonlee.feature.detail.databinding.ListItemReviewHeaderBinding
import java.time.LocalDateTime

class ProductDetailListAdapter(
private val navigator: Navigator,
private val showReviewManageDialog: (ProductDetailListItem.Review) -> Unit
) : MultiTypeListAdapter<ProductDetailListItem, ProductDetailListItem.ViewType>() {
override fun onCreateViewHolder(viewType: ProductDetailListItem.ViewType, parent: ViewGroup): CommonViewHolder<ProductDetailListItem> {
Expand Down Expand Up @@ -118,14 +120,16 @@ class ProductDetailListAdapter(
}
}

private inner class NoneReviewViewHolder(private val binding: ListItemNoneReviewBinding) : ViewOnlyViewHolder(binding) {
private inner class NoneReviewViewHolder(private val binding: ListItemNoneReviewBinding) : CommonViewHolder<ProductDetailListItem.NoneReview>(binding) {
init {
binding.tvWriteReviewButton.setOnClickListener {
getItem {
// TODO
navigator.navigateToEditReview(binding.root.context)
}
}
}

override fun onBindView(item: ProductDetailListItem.NoneReview) = Unit
}

private inner class RatingViewHolder(private val binding: ListItemRatingBinding) : CommonViewHolder<ProductDetailListItem.Score>(binding) {
Expand Down Expand Up @@ -157,6 +161,7 @@ class ProductDetailListAdapter(
}
}
}

override fun onBindView(item: ProductDetailListItem.Review) = with(binding) {
tvComment.text = item.reviewText
tvUserNameAndDate.text = getStringWithArgs(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.tabs.TabLayout
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.adapter.decoration.ContentPaddingDecoration
import com.peonlee.core.ui.adapter.product.ProductAdapter
import com.peonlee.core.ui.base.BaseFragment
Expand All @@ -18,9 +19,13 @@ import com.peonlee.model.product.PRODUCTS_TEST_DOUBLE
import com.peonlee.model.type.SortType
import com.peonlee.model.util.PaddingValues
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class ExploreFragment : BaseFragment<FragmentExploreBinding>() {
@Inject
lateinit var navigator: Navigator

private val exploreViewModel: ExploreViewModel by viewModels()

override fun bindingFactory(parent: ViewGroup): FragmentExploreBinding {
Expand All @@ -46,7 +51,8 @@ class ExploreFragment : BaseFragment<FragmentExploreBinding>() {

// 상품 리스트
val productAdapter = ProductAdapter(
rootLayoutParams = ConstraintLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
rootLayoutParams = ConstraintLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT),
navigator
)
rvProduct.apply {
layoutManager = GridLayoutManager(context, 2)
Expand Down
8 changes: 7 additions & 1 deletion feature/home/src/main/java/com/peonlee/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,28 @@ import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.base.BaseFragment
import com.peonlee.home.adapter.HomeAdapter
import com.peonlee.home.databinding.FragmentHomeBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject

@AndroidEntryPoint
class HomeFragment : BaseFragment<FragmentHomeBinding>() {
@Inject
lateinit var navigator: Navigator

private val homeViewModel: HomeViewModel by viewModels()

override fun bindingFactory(parent: ViewGroup): FragmentHomeBinding {
return FragmentHomeBinding.inflate(layoutInflater, parent, false)
}

override fun initViews() {
val adapter = HomeAdapter()
val adapter = HomeAdapter(navigator)
binding.rvHome.adapter = adapter

homeViewModel.products.flowWithLifecycle(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.peonlee.home.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.adapter.MultiTypeListAdapter
import com.peonlee.core.ui.viewholder.CommonViewHolder
import com.peonlee.home.adapter.viewholder.divider.HomeDividerViewHolder
Expand All @@ -17,7 +18,7 @@ import com.peonlee.home.databinding.ListItemTitleBinding
import com.peonlee.model.MainHomeListItem
import com.peonlee.model.MainHomeViewType

class HomeAdapter : MultiTypeListAdapter<MainHomeListItem, MainHomeViewType>() {
class HomeAdapter(private val navigator: Navigator) : MultiTypeListAdapter<MainHomeListItem, MainHomeViewType>() {
override fun onCreateViewHolder(
viewType: MainHomeViewType,
parent: ViewGroup
Expand All @@ -26,9 +27,9 @@ class HomeAdapter : MultiTypeListAdapter<MainHomeListItem, MainHomeViewType>() {
return when (viewType) {
MainHomeViewType.TITLE -> TitleViewHolder(ListItemTitleBinding.inflate(inflater, parent, false))
MainHomeViewType.DIVIDER -> HomeDividerViewHolder(ListItemHomeDividerBinding.inflate(inflater, parent, false))
MainHomeViewType.CONDITIONAL_PRODUCTS -> ConditionalProductsViewHolder(ListItemConditionalProductsBinding.inflate(inflater, parent, false))
MainHomeViewType.CONDITIONAL_PRODUCTS -> ConditionalProductsViewHolder(ListItemConditionalProductsBinding.inflate(inflater, parent, false), navigator)
MainHomeViewType.RECENT_REVIEW -> RecentReviewViewHolder(ListItemRecentReviewBinding.inflate(inflater, parent, false))
MainHomeViewType.EVENT_BY_STORE -> EventByStoresViewHolder(ListItemEventStoresBinding.inflate(inflater, parent, false))
MainHomeViewType.EVENT_BY_STORE -> EventByStoresViewHolder(ListItemEventStoresBinding.inflate(inflater, parent, false), navigator)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@ package com.peonlee.home.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.adapter.SingleTypeListAdapter
import com.peonlee.core.ui.viewholder.CommonViewHolder
import com.peonlee.home.adapter.viewholder.product.ProductsByStoreViewHolder
import com.peonlee.home.databinding.PagerItemProductsByStoreBinding
import com.peonlee.home.model.product.ProductsByStoreUiModel

class ProductsByStoreAdapter : SingleTypeListAdapter<ProductsByStoreUiModel>({ it.stores.name }) {
class ProductsByStoreAdapter(private val navigator: Navigator) : SingleTypeListAdapter<ProductsByStoreUiModel>({ it.stores.name }) {
override fun onCreateViewHolder(parent: ViewGroup): CommonViewHolder<ProductsByStoreUiModel> {
return ProductsByStoreViewHolder(
PagerItemProductsByStoreBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
),
navigator
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.peonlee.home.adapter.viewholder.product
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import androidx.constraintlayout.widget.ConstraintLayout
import com.peonlee.core.ui.Navigator
import com.peonlee.core.ui.adapter.decoration.ContentPaddingDecoration
import com.peonlee.core.ui.adapter.product.ProductAdapter
import com.peonlee.core.ui.extensions.getStringWithArgs
Expand All @@ -15,9 +16,10 @@ import com.peonlee.model.util.PaddingValues
private val rootLayoutParams = ConstraintLayout.LayoutParams(WRAP_CONTENT, MATCH_PARENT)

class ConditionalProductsViewHolder(
private val binding: ListItemConditionalProductsBinding
private val binding: ListItemConditionalProductsBinding,
private val navigator: Navigator
) : CommonViewHolder<ConditionalProductsUiModel>(binding) {
private var productAdapter = ProductAdapter(rootLayoutParams = rootLayoutParams)
private var productAdapter = ProductAdapter(rootLayoutParams = rootLayoutParams, navigator)

init {
with(binding) {
Expand Down
Loading

0 comments on commit d212b3d

Please sign in to comment.