From 691aa65108793d86097449ecbd06200e74692e8b Mon Sep 17 00:00:00 2001 From: jooyyoo Date: Mon, 26 Feb 2024 11:39:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[mod]=20#233=20=EB=B9=84=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EC=9D=B4=20=EB=82=B4=20=ED=95=84=ED=84=B0=EB=A5=BC=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=ED=95=98=EB=A9=B4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=9C=A0=EB=8F=84=20=EB=B0=94=ED=85=80=20=EC=8B=9C=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=EB=9D=84=EC=9A=B0=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/bakeryList/BakeryListFragment.kt | 9 ++++++++- .../presentation/bakeryList/BakeryListViewModel.kt | 12 ++++++++++-- app/src/main/res/layout/fragment_bakery_list.xml | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt index 5ab5d2f4..2361d82c 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt @@ -61,12 +61,13 @@ class BakeryListFragment : val isFilterSelectedMember = bakeryListViewModel.userRoleType.value == UserRoleType.FILTER_SELECTED_MEMBER.name + val isNoneMember = bakeryListViewModel.userRoleType.value == UserRoleType.NONE_MEMBER.name with(binding) { includeHomeSpeechBubble.root.setVisibility(bakeryListViewModel.userRoleType.value == UserRoleType.FILTER_UNSELECTED_MEMBER.name) checkBakeryListMyFilter.isEnabled = isFilterSelectedMember checkBakeryListMyFilter.isChecked = isFilterSelectedMember - layoutBakeryListMyFiltaerApply.isEnabled = isFilterSelectedMember + layoutBakeryListMyFilterApply.isEnabled = isFilterSelectedMember or isNoneMember } } @@ -141,6 +142,12 @@ class BakeryListFragment : } } .launchIn(viewLifecycleOwner.lifecycleScope) + + bakeryListViewModel.showLoginNeed.flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { + if (it) { + showLoginNeedDialog() + } + }.launchIn(viewLifecycleOwner.lifecycleScope) } private fun initBreadTypeChips(chipGroup: ChipGroup, breadFilterList: List) { diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt index e4e7a901..8e4f3589 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt @@ -10,6 +10,7 @@ import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.BakeryListFilterType import com.sopt.geonppang.presentation.type.BakeryCategoryType import com.sopt.geonppang.presentation.type.BakerySortType +import com.sopt.geonppang.presentation.type.UserRoleType import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -28,6 +29,9 @@ class BakeryListViewModel @Inject constructor( private val _userRoleType = MutableStateFlow(gpDataSource.userRoleType) val userRoleType get() = _userRoleType + private val _showLoginNeed = MutableStateFlow(false) + val showLoginNeed get() = _showLoginNeed + fun setBakerySortType(bakerySortType: BakerySortType) { _bakeryListFilterState.update { it.copy(sortType = bakerySortType) @@ -36,8 +40,12 @@ class BakeryListViewModel @Inject constructor( // TODO: dana update 로직 수정 필요 fun setIsPersonalFilterAppliedState() { - _bakeryListFilterState.update { - it.copy(isPersonalFilterApplied = it.isPersonalFilterApplied == false) + if (_userRoleType.value == UserRoleType.NONE_MEMBER.name) { + _showLoginNeed.value = true + } else { + _bakeryListFilterState.update { + it.copy(isPersonalFilterApplied = it.isPersonalFilterApplied == false) + } } } diff --git a/app/src/main/res/layout/fragment_bakery_list.xml b/app/src/main/res/layout/fragment_bakery_list.xml index bc680647..a0013538 100644 --- a/app/src/main/res/layout/fragment_bakery_list.xml +++ b/app/src/main/res/layout/fragment_bakery_list.xml @@ -149,7 +149,7 @@ app:layout_constraintTop_toBottomOf="@id/view_line_bottom"> Date: Wed, 28 Feb 2024 22:17:32 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[mod]=20#233=20=EA=B1=B4=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=82=B4=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9=20UI=20=EB=B6=84=EA=B8=B0=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/BakeryListFilterType.kt | 2 +- .../bakeryList/BakeryListFragment.kt | 39 +++++++++++-------- .../bakeryList/BakeryListViewModel.kt | 17 ++++---- .../main/res/layout/fragment_bakery_list.xml | 5 ++- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/BakeryListFilterType.kt b/app/src/main/java/com/sopt/geonppang/domain/model/BakeryListFilterType.kt index 576ade4c..a6991b37 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/BakeryListFilterType.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/BakeryListFilterType.kt @@ -4,7 +4,7 @@ import com.sopt.geonppang.presentation.type.BakerySortType data class BakeryListFilterType( val sortType: BakerySortType = BakerySortType.DEFAULT, - val isPersonalFilterApplied: Boolean? = null, + val isPersonalFilterApplied: Boolean, val isHard: Boolean = false, val isDessert: Boolean = false, val isBrunch: Boolean = false diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt index 2361d82c..e15dab91 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt @@ -59,15 +59,12 @@ class BakeryListFragment : addItemDecoration(CustomItemDecoration(requireContext())) } - val isFilterSelectedMember = - bakeryListViewModel.userRoleType.value == UserRoleType.FILTER_SELECTED_MEMBER.name - val isNoneMember = bakeryListViewModel.userRoleType.value == UserRoleType.NONE_MEMBER.name + val isFilterUnSelectedMember = + bakeryListViewModel.userRoleType.value == UserRoleType.FILTER_UNSELECTED_MEMBER.name with(binding) { - includeHomeSpeechBubble.root.setVisibility(bakeryListViewModel.userRoleType.value == UserRoleType.FILTER_UNSELECTED_MEMBER.name) - checkBakeryListMyFilter.isEnabled = isFilterSelectedMember - checkBakeryListMyFilter.isChecked = isFilterSelectedMember - layoutBakeryListMyFilterApply.isEnabled = isFilterSelectedMember or isNoneMember + includeHomeSpeechBubble.root.setVisibility(isFilterUnSelectedMember) + layoutBakeryListMyFilterApply.isEnabled = !isFilterUnSelectedMember } } @@ -92,15 +89,20 @@ class BakeryListFragment : // 비회원, 회원 분기처리 binding.ivBakeryListFilter.setOnClickListener { - val isMember = bakeryListViewModel.userRoleType.value == UserRoleType.NONE_MEMBER.name + val isNoneMember = + bakeryListViewModel.userRoleType.value == UserRoleType.NONE_MEMBER.name - if (isMember) { + if (isNoneMember) { showLoginNeedDialog() } else { moveToFilter() AmplitudeUtils.trackEvent(START_FILTER_LIST) } } + + binding.layoutBakeryListMyFilterApply.setOnClickListener { + onApplyPersonalFilterClicked() + } } private fun collectData() { @@ -117,7 +119,7 @@ class BakeryListFragment : .map { it.isPersonalFilterApplied } .distinctUntilChanged() .flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { isPersonalFilterApplied -> - if (isPersonalFilterApplied == false) { + if (!isPersonalFilterApplied) { AmplitudeUtils.trackEvent(CLICK_PERSONAL_FILTER_APPLY_OFF) } }.launchIn(viewLifecycleOwner.lifecycleScope) @@ -142,12 +144,6 @@ class BakeryListFragment : } } .launchIn(viewLifecycleOwner.lifecycleScope) - - bakeryListViewModel.showLoginNeed.flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { - if (it) { - showLoginNeedDialog() - } - }.launchIn(viewLifecycleOwner.lifecycleScope) } private fun initBreadTypeChips(chipGroup: ChipGroup, breadFilterList: List) { @@ -207,6 +203,17 @@ class BakeryListFragment : bakeryListViewModel.setBakerySortType(bakerySortType) } + private fun onApplyPersonalFilterClicked() { + val isNoneMember = + bakeryListViewModel.userRoleType.value == UserRoleType.NONE_MEMBER.name + + if (isNoneMember) { + showLoginNeedDialog() + } else { + bakeryListViewModel.setIsPersonalFilterAppliedState() + } + } + companion object { const val BAKERY_ID = "bakeryId" const val FILTER_INFO = "filterInfo" diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt index 8e4f3589..20c56f4f 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListViewModel.kt @@ -23,15 +23,16 @@ class BakeryListViewModel @Inject constructor( private val bakeryListPagingRepository: BakeryListPagingRepository, private val gpDataSource: GPDataSource ) : ViewModel() { - private var _bakeryListFilterState = MutableStateFlow(BakeryListFilterType()) + private var _bakeryListFilterState = MutableStateFlow( + BakeryListFilterType( + isPersonalFilterApplied = gpDataSource.userRoleType == UserRoleType.FILTER_SELECTED_MEMBER.name + ) + ) val bakeryListFilterType get() = _bakeryListFilterState.asStateFlow() private val _userRoleType = MutableStateFlow(gpDataSource.userRoleType) val userRoleType get() = _userRoleType - private val _showLoginNeed = MutableStateFlow(false) - val showLoginNeed get() = _showLoginNeed - fun setBakerySortType(bakerySortType: BakerySortType) { _bakeryListFilterState.update { it.copy(sortType = bakerySortType) @@ -40,12 +41,8 @@ class BakeryListViewModel @Inject constructor( // TODO: dana update 로직 수정 필요 fun setIsPersonalFilterAppliedState() { - if (_userRoleType.value == UserRoleType.NONE_MEMBER.name) { - _showLoginNeed.value = true - } else { - _bakeryListFilterState.update { - it.copy(isPersonalFilterApplied = it.isPersonalFilterApplied == false) - } + _bakeryListFilterState.update { + it.copy(isPersonalFilterApplied = !it.isPersonalFilterApplied) } } diff --git a/app/src/main/res/layout/fragment_bakery_list.xml b/app/src/main/res/layout/fragment_bakery_list.xml index a0013538..88ea14a0 100644 --- a/app/src/main/res/layout/fragment_bakery_list.xml +++ b/app/src/main/res/layout/fragment_bakery_list.xml @@ -153,7 +153,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing24" - android:onClick="@{() -> viewModel.setIsPersonalFilterAppliedState()}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -163,7 +162,9 @@ style="@style/Style.CheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:onClick="@{() -> viewModel.setIsPersonalFilterAppliedState()}" /> + android:checked="@{viewModel.bakeryListFilterType.personalFilterApplied}" + android:clickable="false" + android:focusable="false" /> Date: Wed, 28 Feb 2024 22:24:57 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[mod]=20#233=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 826a20fa..3d9e757f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { applicationId "com.sopt.geonppang" minSdk 28 targetSdk 34 - versionCode 5 + versionCode 6 versionName "1.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"