From a5921aed2b7256b340737ae7ae87a0e59051cbab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=B4=EC=8B=9C?= <67777523+EmilyCh0@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:45:36 +0900 Subject: [PATCH] =?UTF-8?q?[AN/USER]=20feat:=20=EC=B6=95=EC=A0=9C=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=ED=99=94=EB=A9=B4=20=EC=A7=80=EC=97=AD?= =?UTF-8?q?=EB=B3=84=20=ED=95=84=ED=84=B0=EB=A7=81=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?(#768)=20(#800)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 지역 버튼 배경 * feat: SchoolRegionUiState 추가 * feat: RegionBottomSheetDialogFragment 구현 * feat: RegionBottomSheetDialogFragment 연결 * fix: 페이징 loadMore인 경우 구분 * refactor: "지역별" string 리소스 사용 * fix: 축제 loadMore 시 지역 필터링 유지 * fix: 새로고침시 지역 필터링 유지 * feat: 축제 목록 다른 탭 클릭 시 로딩중 임을 보여준다. * chore: ktlint check --------- Co-authored-by: vrexpert --- .../home/festivallist/FestivalListFragment.kt | 42 ++++++++++++- .../festivallist/FestivalListViewModel.kt | 52 +++++++++++++--- .../festivallist/bottomsheet/RegionAdapter.kt | 25 ++++++++ .../RegionBottomSheetDialogFragment.kt | 61 +++++++++++++++++++ .../bottomsheet/RegionItemViewHolder.kt | 40 ++++++++++++ .../festival/FestivalListAdapter.kt | 5 +- .../festival/FestivalListTabViewHolder.kt | 15 +++++ .../uistate/FestivalListUiState.kt | 3 + .../uistate/FestivalTabUiState.kt | 4 ++ .../uistate/SchoolRegionUiState.kt | 8 +++ .../main/res/drawable/bg_btn_region_check.xml | 8 +++ .../res/drawable/bg_btn_region_normal.xml | 8 +++ .../res/drawable/bg_region_bottom_sheet.xml | 7 +++ .../src/main/res/drawable/ic_pin_normal.xml | 20 ++++++ .../src/main/res/drawable/ic_pin_select.xml | 20 ++++++ .../main/res/drawable/selector_btn_region.xml | 5 ++ .../layout/fragment_region_bottom_sheet.xml | 34 +++++++++++ .../res/layout/item_festival_list_tab.xml | 37 ++++++++++- .../src/main/res/layout/item_region.xml | 31 ++++++++++ .../src/main/res/values/strings.xml | 3 + 20 files changed, 413 insertions(+), 15 deletions(-) create mode 100644 android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionAdapter.kt create mode 100644 android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionBottomSheetDialogFragment.kt create mode 100644 android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionItemViewHolder.kt create mode 100644 android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/SchoolRegionUiState.kt create mode 100644 android/festago/presentation/src/main/res/drawable/bg_btn_region_check.xml create mode 100644 android/festago/presentation/src/main/res/drawable/bg_btn_region_normal.xml create mode 100644 android/festago/presentation/src/main/res/drawable/bg_region_bottom_sheet.xml create mode 100644 android/festago/presentation/src/main/res/drawable/ic_pin_normal.xml create mode 100644 android/festago/presentation/src/main/res/drawable/ic_pin_select.xml create mode 100644 android/festago/presentation/src/main/res/drawable/selector_btn_region.xml create mode 100644 android/festago/presentation/src/main/res/layout/fragment_region_bottom_sheet.xml create mode 100644 android/festago/presentation/src/main/res/layout/item_region.xml diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListFragment.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListFragment.kt index edb26a588..5c97f0b39 100644 --- a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListFragment.kt +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListFragment.kt @@ -13,12 +13,15 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.festago.festago.domain.model.festival.SchoolRegion import com.festago.festago.presentation.databinding.FragmentFestivalListBinding import com.festago.festago.presentation.ui.home.festivallist.FestivalListFragmentDirections.actionFestivalListFragmentToSearchFragment +import com.festago.festago.presentation.ui.home.festivallist.bottomsheet.RegionBottomSheetDialogFragment import com.festago.festago.presentation.ui.home.festivallist.festival.FestivalListAdapter import com.festago.festago.presentation.ui.home.festivallist.uistate.FestivalListUiState import com.festago.festago.presentation.ui.home.festivallist.uistate.FestivalMoreItemUiState import com.festago.festago.presentation.ui.home.festivallist.uistate.FestivalTabUiState +import com.festago.festago.presentation.ui.home.festivallist.uistate.SchoolRegionUiState import com.festago.festago.presentation.ui.notificationlist.NotificationListActivity import com.festago.festago.presentation.util.repeatOnStarted import com.festago.festago.presentation.util.setOnApplyWindowInsetsCompatListener @@ -114,13 +117,17 @@ class FestivalListFragment : Fragment() { val festivalListUiState = vm.uiState.value as? FestivalListUiState.Success ?: return if (festivalListUiState.isLastPage) return + if (festivalListUiState.festivals.isEmpty()) return val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!.findLastCompletelyVisibleItemPosition() val itemTotalCount = recyclerView.adapter!!.itemCount - 1 if (lastVisibleItemPosition == itemTotalCount) { - vm.loadFestivals() + vm.loadFestivals( + schoolRegion = festivalListUiState.schoolRegion, + isLoadMore = true, + ) } } }) @@ -174,19 +181,50 @@ class FestivalListFragment : Fragment() { private fun handleSuccess(uiState: FestivalListUiState.Success) { val items = uiState.getItems() festivalListAdapter.submitList(items) + binding.rvFestivalList.itemAnimator = null } private fun FestivalListUiState.Success.getItems(): List { + val schoolRegions = SchoolRegion.values().map { + SchoolRegionUiState(it, it == this.schoolRegion) + } + val dialog = createRegionDialog(schoolRegions) + return mutableListOf().apply { if (popularFestivalUiState.festivals.isNotEmpty()) { add(popularFestivalUiState) } - add(FestivalTabUiState(festivalFilter) { vm.loadFestivals(it) }) + add( + FestivalTabUiState( + selectedFilter = festivalFilter, + selectedRegion = schoolRegion, + onFilterSelected = { vm.loadFestivals(it, schoolRegion) }, + ) { + dialog.show( + parentFragmentManager, + RegionBottomSheetDialogFragment::class.java.name, + ) + }, + ) addAll(festivals) if (!isLastPage) add(FestivalMoreItemUiState) }.toList() } + private fun FestivalListUiState.Success.createRegionDialog( + schoolRegions: List, + ) = RegionBottomSheetDialogFragment.newInstance( + items = schoolRegions, + listener = object : RegionBottomSheetDialogFragment.OnRegionSelectListener { + override fun onRegionSelect(region: SchoolRegion) { + vm.loadFestivals( + festivalFilterUiState = festivalFilter, + schoolRegion = if (region == schoolRegion) null else region, + ) + } + }, + ) + private fun showSchoolDetail() { findNavController().navigate(actionFestivalListFragmentToSearchFragment()) } diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListViewModel.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListViewModel.kt index aecc9cf8f..2b96deedd 100644 --- a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListViewModel.kt +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/FestivalListViewModel.kt @@ -6,6 +6,7 @@ import com.festago.festago.common.analytics.AnalyticsHelper import com.festago.festago.common.analytics.logNetworkFailure import com.festago.festago.domain.model.festival.Festival import com.festago.festago.domain.model.festival.FestivalFilter +import com.festago.festago.domain.model.festival.SchoolRegion import com.festago.festago.domain.repository.FestivalRepository import com.festago.festago.presentation.ui.home.festivallist.uistate.ArtistUiState import com.festago.festago.presentation.ui.home.festivallist.uistate.FestivalFilterUiState @@ -40,9 +41,13 @@ class FestivalListViewModel @Inject constructor( fun initFestivalList() { viewModelScope.launch { + val schoolRegion = (uiState.value as? FestivalListUiState.Success)?.schoolRegion val deferredPopularFestivals = async { festivalRepository.loadPopularFestivals() } val deferredFestivals = async { - festivalRepository.loadFestivals(festivalFilter = festivalFilter) + festivalRepository.loadFestivals( + schoolRegion = schoolRegion, + festivalFilter = festivalFilter, + ) } runCatching { val festivalsPage = deferredFestivals.await().getOrThrow() @@ -56,6 +61,7 @@ class FestivalListViewModel @Inject constructor( festivals = festivalsPage.festivals.map { it.toUiState() }, festivalFilter = festivalFilter.toUiState(), isLastPage = festivalsPage.isLastPage, + schoolRegion = schoolRegion, ) }.onFailure { _uiState.value = FestivalListUiState.Error @@ -67,30 +73,58 @@ class FestivalListViewModel @Inject constructor( } } - fun loadFestivals(festivalFilterUiState: FestivalFilterUiState? = null) { + fun loadFestivals( + festivalFilterUiState: FestivalFilterUiState? = null, + schoolRegion: SchoolRegion? = null, + isLoadMore: Boolean = false, + ) { val successUiState = uiState.value as? FestivalListUiState.Success ?: return viewModelScope.launch { val currentFestivals = getCurrentFestivals(festivalFilterUiState) + updateFestivalsState(festivalFilterUiState, successUiState) festivalRepository.loadFestivals( + schoolRegion = schoolRegion, festivalFilter = festivalFilter, - lastFestivalId = currentFestivals.lastOrNull()?.id, - lastStartDate = currentFestivals.lastOrNull()?.startDate, + lastFestivalId = if (isLoadMore) { + currentFestivals.lastOrNull()?.id + } else { + null + }, + lastStartDate = if (isLoadMore) { + currentFestivals.lastOrNull()?.startDate + } else { + null + }, ).onSuccess { festivalsPage -> _uiState.value = FestivalListUiState.Success( - PopularFestivalUiState( - title = successUiState.popularFestivalUiState.title, - festivals = successUiState.popularFestivalUiState.festivals, - ), - festivals = currentFestivals + festivalsPage.festivals.map { it.toUiState() }, + successUiState.popularFestivalUiState, + festivals = if (isLoadMore) { + currentFestivals + festivalsPage.festivals.map { it.toUiState() } + } else { + festivalsPage.festivals.map { it.toUiState() } + }, festivalFilter = festivalFilter.toUiState(), + schoolRegion = schoolRegion, isLastPage = festivalsPage.isLastPage, ) } } } + private fun updateFestivalsState( + festivalFilterUiState: FestivalFilterUiState?, + successUiState: FestivalListUiState.Success, + ) { + if (festivalFilterUiState == null) return + _uiState.value = successUiState.copy( + festivals = listOf(), + isLastPage = false, + festivalFilter = festivalFilterUiState, + ) + } + private fun getCurrentFestivals(festivalFilterUiState: FestivalFilterUiState?): List { var festivals = (uiState.value as? FestivalListUiState.Success)?.festivals ?: listOf() diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionAdapter.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionAdapter.kt new file mode 100644 index 000000000..146c7f479 --- /dev/null +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionAdapter.kt @@ -0,0 +1,25 @@ +package com.festago.festago.presentation.ui.home.festivallist.bottomsheet + +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.festago.festago.domain.model.festival.SchoolRegion +import com.festago.festago.presentation.ui.home.festivallist.uistate.SchoolRegionUiState + +class RegionAdapter( + private val items: List, + private val onRegionSelect: (SchoolRegion) -> Unit, + private val onDismiss: () -> Unit, +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return RegionItemViewHolder.of(parent, onRegionSelect, onDismiss) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + (holder as RegionItemViewHolder).bind(items[position]) + } +} diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionBottomSheetDialogFragment.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionBottomSheetDialogFragment.kt new file mode 100644 index 000000000..077392d94 --- /dev/null +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionBottomSheetDialogFragment.kt @@ -0,0 +1,61 @@ +package com.festago.festago.presentation.ui.home.festivallist.bottomsheet + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.festago.festago.domain.model.festival.SchoolRegion +import com.festago.festago.presentation.databinding.FragmentRegionBottomSheetBinding +import com.festago.festago.presentation.ui.home.festivallist.uistate.SchoolRegionUiState +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class RegionBottomSheetDialogFragment() : BottomSheetDialogFragment() { + + private var _binding: FragmentRegionBottomSheetBinding? = null + private val binding: FragmentRegionBottomSheetBinding get() = _binding!! + + private lateinit var listener: OnRegionSelectListener + private lateinit var items: List + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentRegionBottomSheetBinding.inflate(inflater) + binding.lifecycleOwner = viewLifecycleOwner + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + initView() + } + + private fun initView() { + binding.rvRegionList.adapter = RegionAdapter( + items = items, + onRegionSelect = listener::onRegionSelect + ) { dismiss() } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + interface OnRegionSelectListener { + fun onRegionSelect(region: SchoolRegion) + } + + companion object { + fun newInstance( + items: List, + listener: OnRegionSelectListener, + ): RegionBottomSheetDialogFragment = RegionBottomSheetDialogFragment().apply { + this.listener = listener + this.items = items + } + } +} diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionItemViewHolder.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionItemViewHolder.kt new file mode 100644 index 000000000..031a0f67b --- /dev/null +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/bottomsheet/RegionItemViewHolder.kt @@ -0,0 +1,40 @@ +package com.festago.festago.presentation.ui.home.festivallist.bottomsheet + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.festago.festago.domain.model.festival.SchoolRegion +import com.festago.festago.presentation.databinding.ItemRegionBinding +import com.festago.festago.presentation.ui.home.festivallist.uistate.SchoolRegionUiState + +class RegionItemViewHolder( + private val binding: ItemRegionBinding, + private val onRegionSelect: (SchoolRegion) -> Unit, + private val onDismiss: () -> Unit +) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: SchoolRegionUiState) { + binding.item = item + with(binding.tvRegion) { + this.isSelected = item.isSelected + setOnClickListener { + onRegionSelect(item.schoolRegion) + onDismiss.invoke() + } + } + } + + companion object { + fun of( + parent: ViewGroup, + onRegionSelect: (SchoolRegion) -> Unit, + onDismiss: () -> Unit + ): RegionItemViewHolder { + val binding = ItemRegionBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false, + ) + return RegionItemViewHolder(binding, onRegionSelect, onDismiss) + } + } +} diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListAdapter.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListAdapter.kt index abbb0c0b3..f2733c462 100644 --- a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListAdapter.kt +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListAdapter.kt @@ -47,7 +47,7 @@ class FestivalListAdapter( override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean = when { oldItem is PopularFestivalUiState && newItem is PopularFestivalUiState -> true oldItem is FestivalItemUiState && newItem is FestivalItemUiState -> oldItem.id == newItem.id - oldItem is FestivalTabUiState && newItem is FestivalTabUiState -> true + oldItem is FestivalTabUiState && newItem is FestivalTabUiState -> oldItem.selectedRegion == newItem.selectedRegion oldItem is FestivalMoreItemUiState && newItem is FestivalMoreItemUiState -> true else -> false } @@ -59,7 +59,8 @@ class FestivalListAdapter( oldItem is FestivalItemUiState && newItem is FestivalItemUiState -> oldItem as FestivalItemUiState == newItem - oldItem is FestivalTabUiState && newItem is FestivalTabUiState -> true + oldItem is FestivalTabUiState && newItem is FestivalTabUiState + -> oldItem as FestivalTabUiState == newItem oldItem is FestivalMoreItemUiState && newItem is FestivalMoreItemUiState -> true diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListTabViewHolder.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListTabViewHolder.kt index 9db20206a..2c3b8ca58 100644 --- a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListTabViewHolder.kt +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/festival/FestivalListTabViewHolder.kt @@ -38,6 +38,21 @@ class FestivalListTabViewHolder(val binding: ItemFestivalListTabBinding) : }, ) } + binding.schoolRegion = festivalTabUiState.selectedRegion + binding.tvRegion.setOnClickListener { + festivalTabUiState.onRegionClick.invoke() + } + if (festivalTabUiState.selectedRegion == null) { + binding.tvRegion.isSelected = false + binding.tvRegion.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_pin_normal, 0, 0, 0 + ) + } else { + binding.tvRegion.isSelected = true + binding.tvRegion.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_pin_select, 0, 0, 0 + ) + } } private fun getFestivalFilterAt(position: Int): FestivalFilterUiState = diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalListUiState.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalListUiState.kt index 0d90779c1..ec4645d27 100644 --- a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalListUiState.kt +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalListUiState.kt @@ -1,5 +1,7 @@ package com.festago.festago.presentation.ui.home.festivallist.uistate +import com.festago.festago.domain.model.festival.SchoolRegion + sealed interface FestivalListUiState { object Loading : FestivalListUiState @@ -8,6 +10,7 @@ sealed interface FestivalListUiState { val festivals: List, val festivalFilter: FestivalFilterUiState, val isLastPage: Boolean, + val schoolRegion: SchoolRegion? = null, ) : FestivalListUiState object Error : FestivalListUiState diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalTabUiState.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalTabUiState.kt index 214a38777..79601dfda 100644 --- a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalTabUiState.kt +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/FestivalTabUiState.kt @@ -1,6 +1,10 @@ package com.festago.festago.presentation.ui.home.festivallist.uistate +import com.festago.festago.domain.model.festival.SchoolRegion + data class FestivalTabUiState( val selectedFilter: FestivalFilterUiState, + val selectedRegion: SchoolRegion?, val onFilterSelected: (FestivalFilterUiState) -> Unit, + val onRegionClick: () -> Unit, ) diff --git a/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/SchoolRegionUiState.kt b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/SchoolRegionUiState.kt new file mode 100644 index 000000000..dc674bf84 --- /dev/null +++ b/android/festago/presentation/src/main/java/com/festago/festago/presentation/ui/home/festivallist/uistate/SchoolRegionUiState.kt @@ -0,0 +1,8 @@ +package com.festago.festago.presentation.ui.home.festivallist.uistate + +import com.festago.festago.domain.model.festival.SchoolRegion + +data class SchoolRegionUiState( + val schoolRegion: SchoolRegion, + val isSelected: Boolean, +) diff --git a/android/festago/presentation/src/main/res/drawable/bg_btn_region_check.xml b/android/festago/presentation/src/main/res/drawable/bg_btn_region_check.xml new file mode 100644 index 000000000..b513a8b9b --- /dev/null +++ b/android/festago/presentation/src/main/res/drawable/bg_btn_region_check.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/android/festago/presentation/src/main/res/drawable/bg_btn_region_normal.xml b/android/festago/presentation/src/main/res/drawable/bg_btn_region_normal.xml new file mode 100644 index 000000000..34b6f2806 --- /dev/null +++ b/android/festago/presentation/src/main/res/drawable/bg_btn_region_normal.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/android/festago/presentation/src/main/res/drawable/bg_region_bottom_sheet.xml b/android/festago/presentation/src/main/res/drawable/bg_region_bottom_sheet.xml new file mode 100644 index 000000000..fb5f2c657 --- /dev/null +++ b/android/festago/presentation/src/main/res/drawable/bg_region_bottom_sheet.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/android/festago/presentation/src/main/res/drawable/ic_pin_normal.xml b/android/festago/presentation/src/main/res/drawable/ic_pin_normal.xml new file mode 100644 index 000000000..6c804a1cb --- /dev/null +++ b/android/festago/presentation/src/main/res/drawable/ic_pin_normal.xml @@ -0,0 +1,20 @@ + + + + diff --git a/android/festago/presentation/src/main/res/drawable/ic_pin_select.xml b/android/festago/presentation/src/main/res/drawable/ic_pin_select.xml new file mode 100644 index 000000000..ec5d23a6f --- /dev/null +++ b/android/festago/presentation/src/main/res/drawable/ic_pin_select.xml @@ -0,0 +1,20 @@ + + + + diff --git a/android/festago/presentation/src/main/res/drawable/selector_btn_region.xml b/android/festago/presentation/src/main/res/drawable/selector_btn_region.xml new file mode 100644 index 000000000..62a91b582 --- /dev/null +++ b/android/festago/presentation/src/main/res/drawable/selector_btn_region.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/festago/presentation/src/main/res/layout/fragment_region_bottom_sheet.xml b/android/festago/presentation/src/main/res/layout/fragment_region_bottom_sheet.xml new file mode 100644 index 000000000..e07ab9b86 --- /dev/null +++ b/android/festago/presentation/src/main/res/layout/fragment_region_bottom_sheet.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/android/festago/presentation/src/main/res/layout/item_festival_list_tab.xml b/android/festago/presentation/src/main/res/layout/item_festival_list_tab.xml index 912b3eb68..baf6b2398 100644 --- a/android/festago/presentation/src/main/res/layout/item_festival_list_tab.xml +++ b/android/festago/presentation/src/main/res/layout/item_festival_list_tab.xml @@ -1,10 +1,18 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + + + @@ -29,5 +37,30 @@ android:layout_height="1dp" android:background="@color/background_gray_03" /> + + + + + + diff --git a/android/festago/presentation/src/main/res/layout/item_region.xml b/android/festago/presentation/src/main/res/layout/item_region.xml new file mode 100644 index 000000000..6a4038df5 --- /dev/null +++ b/android/festago/presentation/src/main/res/layout/item_region.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + diff --git a/android/festago/presentation/src/main/res/values/strings.xml b/android/festago/presentation/src/main/res/values/strings.xml index 9d27be328..fd3b7a6e8 100644 --- a/android/festago/presentation/src/main/res/values/strings.xml +++ b/android/festago/presentation/src/main/res/values/strings.xml @@ -33,6 +33,9 @@ D%1$s 종료 + + 지역별 + 학교명, 아티스트명, 축제명으로 입력하세요. 최근 검색어