From 17f77351ad816d7e618239564af4bcbb7c936c36 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 10 Jul 2026 10:38:42 +0900 Subject: [PATCH] =?UTF-8?q?fix(home):=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=EC=83=81=EC=84=B8=20=EC=9D=B4=EB=8F=99=EC=9D=84=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/v2/main/home/HomeMainFragment.kt | 12 +--- .../home/model/HomeRecommendationUiModels.kt | 11 ++-- .../main/home/HomeMainFragmentLayoutTest.kt | 6 +- .../HomeMainFragmentLoginGuardSourceTest.kt | 63 ++++++++++++++++--- 4 files changed, 63 insertions(+), 29 deletions(-) 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 4d628d76..c0e6f861 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 @@ -6,14 +6,12 @@ import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment -import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.ToastMessage import kr.co.vividnext.sodalive.common.formatUtcRelativeTimeText import kr.co.vividnext.sodalive.databinding.FragmentV2MainHomeBinding import kr.co.vividnext.sodalive.databinding.ViewSectionTitleBinding -import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCommunityAllActivity import kr.co.vividnext.sodalive.following.FollowingCreatorActivity import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomActivity import kr.co.vividnext.sodalive.home.pushnotification.PushNotificationListActivity @@ -22,6 +20,7 @@ import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity import kr.co.vividnext.sodalive.search.SearchActivity import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivity import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveCoordinator +import kr.co.vividnext.sodalive.v2.creator.channel.community.detail.CreatorChannelCommunityDetailActivity import kr.co.vividnext.sodalive.v2.live.onair.HomeOnAirLiveActivity import kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomActivity import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomListUiItem @@ -617,16 +616,9 @@ class HomeMainFragment : BaseFragment( } private fun openPopularCommunityPost(item: FeedItem.Community) { - val creatorId = item.creatorId.toLongOrNull() ?: return val postId = item.postId.toLongOrNull() ?: return ensureMainV2NavigationAllowed { - startActivity( - Intent(requireContext(), CreatorCommunityAllActivity::class.java).apply { - putExtra(Constants.EXTRA_COMMUNITY_CREATOR_ID, creatorId) - putExtra(Constants.EXTRA_COMMUNITY_POST_ID, postId) - putExtra(Constants.EXTRA_COMMUNITY_EXIST_ORDERED, item.existOrdered) - } - ) + startActivity(CreatorChannelCommunityDetailActivity.newIntent(requireContext(), postId)) } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt index acf37006..399d3d75 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt @@ -7,11 +7,11 @@ import kr.co.vividnext.sodalive.BuildConfig import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.common.Constants -import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCommunityAllActivity import kr.co.vividnext.sodalive.settings.event.EventDetailActivity import kr.co.vividnext.sodalive.settings.event.EventItem import kr.co.vividnext.sodalive.v2.common.CreatorActivityType import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivity +import kr.co.vividnext.sodalive.v2.creator.channel.community.detail.CreatorChannelCommunityDetailActivity import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem import kr.co.vividnext.sodalive.v2.widget.feed.FeedItem import java.util.Locale @@ -136,7 +136,7 @@ data class HomeRecommendationRecentlyActiveCreatorUiModel( sealed interface HomeRecommendationRecentlyActiveCreatorRoute { data class AudioContent(val contentId: Long) : HomeRecommendationRecentlyActiveCreatorRoute - data class Community(val creatorId: Long) : HomeRecommendationRecentlyActiveCreatorRoute + data class Community(val postId: Long) : HomeRecommendationRecentlyActiveCreatorRoute } fun HomeRecommendationRecentlyActiveCreatorUiModel.toHomeRecommendationRecentlyActiveCreatorRoute(): @@ -160,11 +160,8 @@ fun HomeRecommendationRecentlyActiveCreatorRoute.toHomeRecommendationRecentlyAct } } - is HomeRecommendationRecentlyActiveCreatorRoute.Community -> { - Intent(context, CreatorCommunityAllActivity::class.java).apply { - putExtra(Constants.EXTRA_COMMUNITY_CREATOR_ID, creatorId) - } - } + is HomeRecommendationRecentlyActiveCreatorRoute.Community -> + CreatorChannelCommunityDetailActivity.newIntent(context, postId) } } diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt index 5143e54c..edfe4afe 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt @@ -27,10 +27,10 @@ import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.formatUtcRelativeTimeText -import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCommunityAllActivity import kr.co.vividnext.sodalive.settings.event.EventDetailActivity import kr.co.vividnext.sodalive.settings.event.EventItem import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivity +import kr.co.vividnext.sodalive.v2.creator.channel.community.detail.CreatorChannelCommunityDetailActivity import kr.co.vividnext.sodalive.v2.main.home.data.HomeActiveCreatorItem import kr.co.vividnext.sodalive.v2.main.home.data.HomeAiCharacterItem import kr.co.vividnext.sodalive.v2.main.home.data.HomeBannerItem @@ -948,8 +948,8 @@ class HomeMainFragmentLayoutTest { assertEquals(AudioContentDetailActivity::class.java.name, audioIntent.component?.className) assertEquals(11L, audioIntent.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0L)) - assertEquals(CreatorCommunityAllActivity::class.java.name, communityIntent.component?.className) - assertEquals(13L, communityIntent.getLongExtra(Constants.EXTRA_COMMUNITY_CREATOR_ID, 0L)) + assertEquals(CreatorChannelCommunityDetailActivity::class.java.name, communityIntent.component?.className) + assertEquals(13L, communityIntent.getLongExtra("extra_post_id", 0L)) } @Test diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt index 073d04b9..b722eb57 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt @@ -35,11 +35,24 @@ class HomeMainFragmentLoginGuardSourceTest { assertBeforeGuard(source, "val route = item.toHomeRecommendationBannerRoute() ?: return") assertBeforeGuard(source, "val route = item.toHomeRecommendationRecentlyActiveCreatorRoute() ?: return") assertBeforeGuard(source, "val route = item.toHomeRecommendationAiCharacterRoute() ?: return") - assertBeforeGuard(source, "val creatorId = item.creatorId.toLongOrNull() ?: return") assertBeforeGuard(source, "val postId = item.postId.toLongOrNull() ?: return") assertFalse(source.contains("requiresAdultContentAccess = true")) } + @Test + fun `HomeMainFragment 인기 커뮤니티는 커뮤니티 상세로 이동한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt" + ).readText() + + val clickSource = source.substringFrom("private fun openPopularCommunityPost(item: FeedItem.Community)") + assertTrue(clickSource.contains("CreatorChannelCommunityDetailActivity.newIntent(requireContext(), postId)")) + assertFalse(clickSource.contains("CreatorCommunityAllActivity")) + assertFalse(clickSource.contains("EXTRA_COMMUNITY_CREATOR_ID")) + assertFalse(clickSource.contains("EXTRA_COMMUNITY_POST_ID")) + assertFalse(clickSource.contains("EXTRA_COMMUNITY_EXIST_ORDERED")) + } + @Test fun `HomeMainFragment 팔로잉 탭 선택은 로그인 가드 통과 후 탭을 전환한다`() { val source = projectFile( @@ -86,9 +99,21 @@ class HomeMainFragmentLoginGuardSourceTest { val clickSource = source.substringFrom("private fun onLiveClick(item: HomeRecommendationLiveUiModel)") assertTrue(clickSource.contains("ensureMainV2NavigationAllowed")) assertTrue(clickSource.contains("liveViewModel.getRoomDetail(item.roomId) { roomDetail ->")) - assertBefore(clickSource, "if (!isAdded || view == null) return@getRoomDetail", "requiresAdultContentAccess = roomDetail.isAdult") - assertBefore(clickSource, "liveViewModel.getRoomDetail(item.roomId) { roomDetail ->", "requiresAdultContentAccess = roomDetail.isAdult") - assertBefore(clickSource, "requiresAdultContentAccess = roomDetail.isAdult", "liveCoordinator.enterLiveRoom(item.roomId, roomDetail)") + assertBefore( + clickSource, + "if (!isAdded || view == null) return@getRoomDetail", + "requiresAdultContentAccess = roomDetail.isAdult" + ) + assertBefore( + clickSource, + "liveViewModel.getRoomDetail(item.roomId) { roomDetail ->", + "requiresAdultContentAccess = roomDetail.isAdult" + ) + assertBefore( + clickSource, + "requiresAdultContentAccess = roomDetail.isAdult", + "liveCoordinator.enterLiveRoom(item.roomId, roomDetail)" + ) assertFalse(clickSource.contains("= Unit")) assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveCoordinator")) @@ -107,14 +132,34 @@ class HomeMainFragmentLoginGuardSourceTest { assertTrue(source.contains("private var isLiveEntryLoading = false")) val updateSource = source.substringFrom("private fun updateLoadingDialog()") - assertTrue(updateSource.contains("isRecommendationLoading || isCreatorRankingLoading || isFollowingLoading || isLiveEntryLoading")) + val expectedLoadingExpression = "isRecommendationLoading || " + + "isCreatorRankingLoading || " + + "isFollowingLoading || " + + "isLiveEntryLoading" + assertTrue(updateSource.contains(expectedLoadingExpression)) assertTrue(updateSource.contains("loadingDialog.show(screenWidth)")) assertTrue(updateSource.contains("loadingDialog.dismiss()")) - assertLoadingObserverUsesUpdate(source, "homeRecommendationViewModel.isLoading.observe(viewLifecycleOwner)", "isRecommendationLoading = isLoading") - assertLoadingObserverUsesUpdate(source, "homeCreatorRankingViewModel.isLoading.observe(viewLifecycleOwner)", "isCreatorRankingLoading = isLoading") - assertLoadingObserverUsesUpdate(source, "homeFollowingViewModel.isLoading.observe(viewLifecycleOwner)", "isFollowingLoading = isLoading") - assertLoadingObserverUsesUpdate(source, "liveViewModel.isLoading.observe(viewLifecycleOwner)", "isLiveEntryLoading = isLoading") + assertLoadingObserverUsesUpdate( + source, + "homeRecommendationViewModel.isLoading.observe(viewLifecycleOwner)", + "isRecommendationLoading = isLoading" + ) + assertLoadingObserverUsesUpdate( + source, + "homeCreatorRankingViewModel.isLoading.observe(viewLifecycleOwner)", + "isCreatorRankingLoading = isLoading" + ) + assertLoadingObserverUsesUpdate( + source, + "homeFollowingViewModel.isLoading.observe(viewLifecycleOwner)", + "isFollowingLoading = isLoading" + ) + assertLoadingObserverUsesUpdate( + source, + "liveViewModel.isLoading.observe(viewLifecycleOwner)", + "isLiveEntryLoading = isLoading" + ) } private fun assertGuardedStartActivity(source: String, functionSignature: String) {