diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt index 21c6a696..fae2537a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/HomeMainFragment.kt @@ -35,6 +35,8 @@ import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentDebut import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationUiState import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationBannerIntent import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationBannerRoute +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 @@ -55,7 +57,7 @@ class HomeMainFragment : BaseFragment( private val homeRecommendationViewModel: HomeRecommendationViewModel by viewModel() private val loadingDialog: LoadingDialog by lazy { LoadingDialog(requireActivity(), layoutInflater) } private val liveAdapter = HomeLiveAdapter() - private val recentActivityCreatorAdapter = HomeRecentActivityCreatorAdapter() + private val recentActivityCreatorAdapter = HomeRecentActivityCreatorAdapter { onRecentActivityClick(it) } private val recentDebutCreatorAdapter = HomeRecentDebutCreatorAdapter { openCreatorProfile(it.creatorId) } private val firstAudioAdapter = HomeFirstAudioAdapter { openAudioContentDetail(it) } private val aiCharacterAdapter = HomeAiCharacterAdapter { openCharacterDetail(it.characterId) } @@ -273,6 +275,11 @@ class HomeMainFragment : BaseFragment( startActivity(route.toHomeRecommendationBannerIntent(requireContext())) } + private fun onRecentActivityClick(item: HomeRecommendationRecentlyActiveCreatorUiModel) { + val route = item.toHomeRecommendationRecentlyActiveCreatorRoute() ?: return + startActivity(route.toHomeRecommendationRecentlyActiveCreatorIntent(requireContext())) + } + private fun openCreatorProfile(creatorId: Long) { startActivity( Intent(requireContext(), UserProfileActivity::class.java).apply { 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 98a7efb2..07e887c8 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 @@ -4,9 +4,11 @@ import android.content.Context import android.content.Intent import android.net.Uri 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.UserProfileActivity +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.widget.AudioContentTag @@ -137,6 +139,41 @@ data class HomeRecommendationRecentlyActiveCreatorUiModel( val targetId: Long? ) +sealed interface HomeRecommendationRecentlyActiveCreatorRoute { + data class AudioContent(val contentId: Long) : HomeRecommendationRecentlyActiveCreatorRoute + + data class Community(val creatorId: Long) : HomeRecommendationRecentlyActiveCreatorRoute +} + +fun HomeRecommendationRecentlyActiveCreatorUiModel.toHomeRecommendationRecentlyActiveCreatorRoute(): + HomeRecommendationRecentlyActiveCreatorRoute? { + val routeTargetId = targetId?.takeIf { it > 0 } ?: return null + return when (activityType) { + RecommendedActivityType.Live -> null + RecommendedActivityType.LiveReplay, + RecommendedActivityType.Audio -> HomeRecommendationRecentlyActiveCreatorRoute.AudioContent(routeTargetId) + RecommendedActivityType.Community -> HomeRecommendationRecentlyActiveCreatorRoute.Community(routeTargetId) + null -> null + } +} + +fun HomeRecommendationRecentlyActiveCreatorRoute.toHomeRecommendationRecentlyActiveCreatorIntent(context: Context): + Intent { + return when (this) { + is HomeRecommendationRecentlyActiveCreatorRoute.AudioContent -> { + Intent(context, AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId) + } + } + + is HomeRecommendationRecentlyActiveCreatorRoute.Community -> { + Intent(context, CreatorCommunityAllActivity::class.java).apply { + putExtra(Constants.EXTRA_COMMUNITY_CREATOR_ID, creatorId) + } + } + } +} + data class HomeRecommendationCreatorUiModel( val creatorId: Long, val nickname: String, 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 5842cd4c..b0579d9c 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 @@ -23,10 +23,12 @@ import androidx.recyclerview.widget.RecyclerView import androidx.test.core.app.ApplicationProvider import kr.co.vividnext.sodalive.R 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.common.formatUtcRelativeTimeText import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity +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.main.home.data.HomeActiveCreatorItem @@ -46,8 +48,13 @@ import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveUiModel import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationPopularCommunityPostSection import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationPopularCommunityPostUiModel import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationPaidStatus +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorRoute +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorUiModel +import kr.co.vividnext.sodalive.v2.main.home.model.RecommendedActivityType import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationBannerIntent import kr.co.vividnext.sodalive.v2.main.home.model.toHomeRecommendationBannerRoute +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.visibleHomePopularCommunityPosts import kr.co.vividnext.sodalive.v2.main.home.model.visibleHomeGenreCreatorGroups import kr.co.vividnext.sodalive.v2.main.home.data.HomePopularCommunityPostItem @@ -992,6 +999,62 @@ class HomeMainFragmentLayoutTest { assertEquals(null, homeBanner(link = "mailto:test@example.com").toHomeRecommendationBannerRoute()) } + @Test + fun `home recent activity route maps activity type to target destination`() { + assertEquals( + HomeRecommendationRecentlyActiveCreatorRoute.AudioContent(11L), + recentActivityCreator(RecommendedActivityType.LiveReplay, targetId = 11L) + .toHomeRecommendationRecentlyActiveCreatorRoute() + ) + assertEquals( + HomeRecommendationRecentlyActiveCreatorRoute.AudioContent(12L), + recentActivityCreator(RecommendedActivityType.Audio, targetId = 12L) + .toHomeRecommendationRecentlyActiveCreatorRoute() + ) + assertEquals( + HomeRecommendationRecentlyActiveCreatorRoute.Community(13L), + recentActivityCreator(RecommendedActivityType.Community, targetId = 13L) + .toHomeRecommendationRecentlyActiveCreatorRoute() + ) + } + + @Test + fun `home recent activity route ignores live unknown and missing target`() { + assertEquals( + null, + recentActivityCreator(RecommendedActivityType.Live, targetId = 10L) + .toHomeRecommendationRecentlyActiveCreatorRoute() + ) + assertEquals( + null, + recentActivityCreator(activityType = null, targetId = 10L).toHomeRecommendationRecentlyActiveCreatorRoute() + ) + assertEquals( + null, + recentActivityCreator(RecommendedActivityType.Audio, targetId = null) + .toHomeRecommendationRecentlyActiveCreatorRoute() + ) + assertEquals( + null, + recentActivityCreator(RecommendedActivityType.Community, targetId = 0L) + .toHomeRecommendationRecentlyActiveCreatorRoute() + ) + } + + @Test + fun `home recent activity route creates expected intents`() { + val context = ApplicationProvider.getApplicationContext() + val audioIntent = HomeRecommendationRecentlyActiveCreatorRoute.AudioContent(11L) + .toHomeRecommendationRecentlyActiveCreatorIntent(context) + val communityIntent = HomeRecommendationRecentlyActiveCreatorRoute.Community(13L) + .toHomeRecommendationRecentlyActiveCreatorIntent(context) + + 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)) + } + @Test fun `home popular community adapter does not load original image for locked paid post`() { val context = ApplicationProvider.getApplicationContext() @@ -1356,6 +1419,20 @@ class HomeMainFragmentLayoutTest { ) } + private fun recentActivityCreator( + activityType: RecommendedActivityType?, + targetId: Long? + ): HomeRecommendationRecentlyActiveCreatorUiModel { + return HomeRecommendationRecentlyActiveCreatorUiModel( + nickname = "크리에이터", + profileImage = "", + activityType = activityType, + activityLabelResId = activityType?.labelResId, + activityAt = "방금 전", + targetId = targetId + ) + } + private fun popularCommunityData( audioUrl: String?, createdAt: String = "2분 전"