diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt index c4a0d9d5..c820e7cd 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt @@ -41,7 +41,6 @@ import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationAiCharacter import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerSection import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCheerCreatorSection -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationGenreCreatorGroupUiModel import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationGenreCreatorSection import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveSection import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveUiModel @@ -57,7 +56,6 @@ import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationAiCharact import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationAiCharacterRoute import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationRecentlyActiveCreatorIntent import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationRecentlyActiveCreatorRoute -import kr.co.vividnext.sodalive.v2.main.home.model.visibleHomeGenreCreatorGroups import kr.co.vividnext.sodalive.v2.main.home.ui.HomeAiCharacterAdapter import kr.co.vividnext.sodalive.v2.main.home.ui.HomeBannerBinder import kr.co.vividnext.sodalive.v2.main.home.ui.HomeBusinessInfoBinder @@ -100,10 +98,7 @@ class HomeMainFragment : BaseFragment( private val recentActivityCreatorAdapter = HomeRecentActivityCreatorAdapter { onRecentActivityClick(it) } private val recentDebutCreatorAdapter = HomeRecentDebutCreatorAdapter { openCreatorProfile(it.creatorId) } private val aiCharacterAdapter = HomeAiCharacterAdapter { onAiCharacterClick(it) } - private val genreCreatorAdapter = HomeGenreCreatorAdapter( - onFollowAllClick = { creatorIds -> onGenreFollowAllClick(creatorIds) }, - onCreatorClick = { creator -> openCreatorProfile(creator.creatorId) } - ) + private val genreCreatorAdapter = HomeGenreCreatorAdapter(onFollowAllClick = {}) private val cheerCreatorAdapter = HomeCheerCreatorAdapter( onFollowAllClick = { creatorIds -> onCheerFollowAllClick(creatorIds) }, onCreatorClick = { creator -> openCreatorProfile(creator.creatorId) } @@ -119,7 +114,6 @@ class HomeMainFragment : BaseFragment( private val followingScheduleAdapter = HomeFollowingScheduleAdapter { onFollowingScheduleClick(it) } private val followingNewsAdapter = HomeFollowingNewsAdapter { onFollowingNewsClick(it) } private var bannerBinder: HomeBannerBinder? = null - private var onGenreFollowAllClick: (List) -> Unit = {} private var onCheerFollowAllClick: (List) -> Unit = {} private var hasLoadedCreatorRankings = false private var hasLoadedFollowing = false @@ -218,9 +212,6 @@ class HomeMainFragment : BaseFragment( layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) adapter = popularCommunityAdapter } - onGenreFollowAllClick = { creatorIds -> - homeRecommendationViewModel.followCreators(genreSectionKey(creatorIds), creatorIds) - } onCheerFollowAllClick = { creatorIds -> homeRecommendationViewModel.followCreators(SECTION_KEY_CHEER_CREATORS, creatorIds) } @@ -458,9 +449,8 @@ class HomeMainFragment : BaseFragment( } private fun bindGenreCreatorSection(section: HomeRecommendationGenreCreatorSection) { - val visibleGroups = section.visibleHomeGenreCreatorGroups() - binding.llHomeGenreCreatorSection.visibility = visibleGroups.toSectionVisibility() - genreCreatorAdapter.submitGroups(visibleGroups) + binding.llHomeGenreCreatorSection.visibility = View.GONE + genreCreatorAdapter.submitGroups(emptyList()) } private fun bindCheerCreatorSection(section: HomeRecommendationCheerCreatorSection) { @@ -634,19 +624,6 @@ class HomeMainFragment : BaseFragment( ?: toastMessage.resId?.let { resId -> showToast(getString(resId)) } } - private fun genreSectionKey(creatorIds: List): String { - val group = currentVisibleGenreGroups().firstOrNull { group -> - group.creators.map { it.creatorId } == creatorIds - } - return "$SECTION_KEY_GENRE_CREATORS:${group?.genre.orEmpty()}" - } - - private fun currentVisibleGenreGroups(): List { - val content = homeRecommendationViewModel.recommendationStateLiveData.value as? HomeRecommendationUiState.Content - ?: return emptyList() - return content.genreCreators.visibleHomeGenreCreatorGroups() - } - private fun emptyHomeRecommendationContent(): HomeRecommendationUiState.Content { return HomeRecommendationUiState.Content( lives = HomeRecommendationLiveSection(emptyList()), @@ -667,7 +644,6 @@ class HomeMainFragment : BaseFragment( const val HOME_TAB_RANKING = 1 const val HOME_TAB_FOLLOWING = 2 const val SECTION_KEY_CHEER_CREATORS = "cheerCreators" - const val SECTION_KEY_GENRE_CREATORS = "genreCreators" } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeRecommendationViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeRecommendationViewModel.kt index 7475d054..5277adbe 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeRecommendationViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeRecommendationViewModel.kt @@ -11,7 +11,6 @@ import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.ToastMessage import kr.co.vividnext.sodalive.v2.main.home.data.FollowRecommendedCreatorsRequest import kr.co.vividnext.sodalive.v2.main.home.data.HomeRecommendationRepository -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationGenreCreatorSection import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationUiState import kr.co.vividnext.sodalive.v2.main.home.model.toContent @@ -94,22 +93,10 @@ class HomeRecommendationViewModel( private fun updateFollowCompleted(sectionKey: String) { val content = _recommendationStateLiveData.value as? HomeRecommendationUiState.Content ?: return - _recommendationStateLiveData.value = when (sectionKey) { - SECTION_KEY_CHEER_CREATORS -> content.copy( - cheerCreators = content.cheerCreators.copy(isFollowCompleted = true) - ) - else -> content.copy( - genreCreators = HomeRecommendationGenreCreatorSection( - groups = content.genreCreators.groups.map { group -> - if (group.genre == sectionKey || sectionKey == "$SECTION_KEY_GENRE_CREATORS:${group.genre}") { - group.copy(isFollowCompleted = true) - } else { - group - } - } - ) - ) - } + if (sectionKey != SECTION_KEY_CHEER_CREATORS) return + _recommendationStateLiveData.value = content.copy( + cheerCreators = content.cheerCreators.copy(isFollowCompleted = true) + ) } private fun showUnknownError(message: String?) { @@ -121,6 +108,5 @@ class HomeRecommendationViewModel( private companion object { const val SECTION_KEY_CHEER_CREATORS = "cheerCreators" - const val SECTION_KEY_GENRE_CREATORS = "genreCreators" } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt index afe07654..d0115e4c 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt @@ -19,7 +19,6 @@ sealed interface HomeRecommendationUiState { recentlyActiveCreators.items, recentDebutCreators.items, aiCharacters.items, - genreCreators.groups, cheerCreators.items, popularCommunityPosts.items ).all { it.isEmpty() } diff --git a/app/src/main/res/layout/fragment_v2_main_home.xml b/app/src/main/res/layout/fragment_v2_main_home.xml index 815d07f4..da243f7f 100644 --- a/app/src/main/res/layout/fragment_v2_main_home.xml +++ b/app/src/main/res/layout/fragment_v2_main_home.xml @@ -141,7 +141,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_48" - android:orientation="vertical"> + android:orientation="vertical" + android:visibility="gone"> (R.id.ll_home_business_info)) } + @Test + fun `home recommendation does not display genre creator section`() { + val root = inflateView(R.layout.fragment_v2_main_home) + val layoutSource = homeMainLayoutSource() + val source = homeMainFragmentSource() + val genreSection = root.findViewById(R.id.ll_home_genre_creator_section) + + assertEquals(View.GONE, genreSection.visibility) + assertTrue(layoutSource.contains("android:id=\"@+id/ll_home_genre_creator_section\"")) + assertTrue(layoutSource.contains("android:visibility=\"gone\"")) + assertTrue(source.contains("private fun bindGenreCreatorSection(section: HomeRecommendationGenreCreatorSection)")) + assertTrue(source.contains("binding.llHomeGenreCreatorSection.visibility = View.GONE")) + assertTrue(source.contains("genreCreatorAdapter.submitGroups(emptyList())")) + } + + @Test + fun `home recommendation empty state ignores hidden genre creators`() { + val content = HomeRecommendationUiState.Content( + lives = HomeRecommendationLiveSection(emptyList()), + banners = HomeRecommendationBannerSection(emptyList()), + recentlyActiveCreators = HomeRecommendationRecentlyActiveCreatorSection(emptyList()), + recentDebutCreators = HomeRecommendationRecentDebutCreatorSection(emptyList()), + aiCharacters = HomeRecommendationAiCharacterSection(emptyList()), + genreCreators = HomeRecommendationGenreCreatorSection(listOf(genreGroup("genre", genreCreators(1L)))), + cheerCreators = HomeRecommendationCheerCreatorSection(emptyList()), + popularCommunityPosts = HomeRecommendationPopularCommunityPostSection(emptyList()) + ) + + assertTrue(content.isEmpty) + } + @Test fun `home phase6 item layouts expose required binding views`() { val recentActivity = inflateView(R.layout.item_home_recent_activity_creator) @@ -437,17 +472,6 @@ class HomeMainFragmentLayoutTest { assertEquals(14f, nickname.textSize / nickname.resources.displayMetrics.scaledDensity) } - @Test - fun `home genre creator section uses pager snapping list`() { - val root = inflateView(R.layout.fragment_v2_main_home) - val genreList = root.findViewById(R.id.rv_home_genre_creators) - - assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, genreList.layoutParams.height) - assertEquals(14.dpToPx(), genreList.paddingStart) - assertEquals(14.dpToPx(), genreList.paddingEnd) - assertNotNull(genreList.onFlingListener) - } - @Test fun `genre creator adapter renders max five non empty genre groups`() { val context = ApplicationProvider.getApplicationContext() @@ -474,22 +498,6 @@ class HomeMainFragmentLayoutTest { assertEquals(8, viewHolder.itemView.findViewById(R.id.gl_home_genre_creator_profiles).childCount) } - @Test - fun `genre creator adapter follow all uses ids from its page group`() { - val context = ApplicationProvider.getApplicationContext() - val parent = RecyclerView(context) - parent.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) - val clickedCreatorIds = mutableListOf() - val adapter = HomeGenreCreatorAdapter(onFollowAllClick = { clickedCreatorIds.addAll(it) }) - adapter.submitGroups(listOf(genreGroup("genre", genreCreators(10L)))) - val viewHolder = adapter.onCreateViewHolder(parent, 0) - - adapter.onBindViewHolder(viewHolder, 0) - viewHolder.itemView.findViewById(R.id.view_home_genre_group_follow_all).performClick() - - assertEquals((10L..17L).toList(), clickedCreatorIds) - } - @Test fun `cheer creator group item matches figma card structure`() { val group = inflateViewWithParent(R.layout.item_home_cheer_creator_group) @@ -1257,7 +1265,7 @@ class HomeMainFragmentLayoutTest { assertTrue(source.contains("toastLiveData.observe(viewLifecycleOwner)")) assertTrue(source.contains("showToast")) assertTrue(source.contains("followCreators(SECTION_KEY_CHEER_CREATORS")) - assertTrue(source.contains("followCreators(genreSectionKey")) + assertFalse(source.contains("followCreators(genreSectionKey")) } @Test