From 1bf653a5d888d75fc7d4414e3d9c360552c3c603 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 10 Nov 2025 19:38:48 +0900 Subject: [PATCH] =?UTF-8?q?fix(home):=20=ED=99=88=EC=97=90=20=ED=8F=AC?= =?UTF-8?q?=EC=9D=B8=ED=8A=B8=20=EB=8C=80=EC=97=AC=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=84=B9=EC=85=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 무료 콘텐츠 아래 동일 UI로 섹션 추가 - 제목 ‘포인트’ 컬러 강조(무료 섹션과 동일) - GetHomeResponse.pointAvailableContentList 사용해 데이터 바인딩 - 섹션 우측 ‘전체보기’ 텍스트 추가(클릭 액션 TODO) --- .../sodalive/home/GetHomeResponse.kt | 1 + .../vividnext/sodalive/home/HomeFragment.kt | 69 +++++++++++++++++++ .../vividnext/sodalive/home/HomeViewModel.kt | 5 ++ app/src/main/res/layout/fragment_home.xml | 45 ++++++++++++ 4 files changed, 120 insertions(+) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/GetHomeResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/GetHomeResponse.kt index d7e6a663..84a2fcbe 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/GetHomeResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/GetHomeResponse.kt @@ -25,5 +25,6 @@ data class GetHomeResponse( @SerializedName("contentRanking") val contentRanking: List, @SerializedName("recommendChannelList") val recommendChannelList: List, @SerializedName("freeContentList") val freeContentList: List, + @SerializedName("pointAvailableContentList") val pointAvailableContentList: List, @SerializedName("curationList") val curationList: List ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt index 44988dd7..6fbc64b1 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt @@ -86,6 +86,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl private lateinit var weelyChartAdapter: HomeWeeklyChartAdapter private lateinit var recommendChannelAdapter: HomeRecommendChannelAdapter private lateinit var homeFreeContentAdapter: HomeContentAdapter + private lateinit var homePointContentAdapter: HomeContentAdapter private lateinit var curationAdapter: HomeCurationAdapter private val handler = Handler(Looper.getMainLooper()) @@ -190,6 +191,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl setupWeelyChart() setupRecommendChannel() setupFreeContent() + setupPointContent() setupCuration() } @@ -1089,6 +1091,73 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl } } + private fun setupPointContent() { + val spSectionTitle = SpannableString(binding.tvPointContent.text) + spSectionTitle.setSpan( + ForegroundColorSpan( + ContextCompat.getColor( + requireContext(), + R.color.color_3bb9f1 + ) + ), + 0, + 3, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + binding.tvPointContent.text = spSectionTitle + + homePointContentAdapter = HomeContentAdapter { + if (SharedPreferenceManager.token.isNotBlank()) { + startActivity( + Intent(requireContext(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it) + } + ) + } else { + (requireActivity() as MainActivity).showLoginActivity() + } + } + + val rvContent = binding.rvPointContent + rvContent.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + rvContent.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.top = 8f.dpToPx().toInt() + outRect.bottom = 8f.dpToPx().toInt() + + val position = parent.getChildAdapterPosition(view) + + if (position == 0) { + outRect.left = 0f.dpToPx().toInt() + } else { + outRect.left = 8f.dpToPx().toInt() + } + + outRect.right = 8f.dpToPx().toInt() + } + }) + rvContent.adapter = homePointContentAdapter + + viewModel.pointAvailableContentListLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.llPointContent.visibility = View.VISIBLE + homePointContentAdapter.addItems(it) + } else { + binding.llPointContent.visibility = View.GONE + } + } + + binding.tvPointContentAll.setOnClickListener { + // TODO: 전체보기 클릭 액션은 추후에 추가 예정 + } + } + private fun setupCuration() { curationAdapter = HomeCurationAdapter( onClickItem = { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt index da56dafb..9b3d0237 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt @@ -80,6 +80,10 @@ class HomeViewModel( val curationListLiveData: LiveData> get() = _curationListLiveData + private var _pointAvailableContentListLiveData = MutableLiveData>() + val pointAvailableContentListLiveData: LiveData> + get() = _pointAvailableContentListLiveData + fun fetchData() { _isLoading.value = true @@ -106,6 +110,7 @@ class HomeViewModel( _popularCharacters.value = data.popularCharacters _contentRankingLiveData.value = data.contentRanking _freeContentListLiveData.value = data.freeContentList + _pointAvailableContentListLiveData.value = data.pointAvailableContentList _curationListLiveData.value = data.curationList _recommendChannelListLiveData.value = data.recommendChannelList } else { diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 7add2f8c..dc6c53fd 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -389,6 +389,51 @@ android:paddingHorizontal="24dp" /> + + + + + + + + + + + + +