From 77a201e13963206f5d379e9ff1896dab750b4d26 Mon Sep 17 00:00:00 2001 From: klaus Date: Sat, 27 Jun 2026 09:04:41 +0900 Subject: [PATCH] =?UTF-8?q?feat(content):=20New&Hot=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20=EC=9D=B4=EB=8F=99=EC=9D=84=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/main/content/ContentMainFragment.kt | 11 +++++++++ .../content/ContentMainFragmentSourceTest.kt | 23 +++++++++++++++++-- .../ContentOverviewActivitySourceTest.kt | 7 +++--- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt index c5234996..4635152e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt @@ -48,6 +48,8 @@ import kr.co.vividnext.sodalive.v2.main.content.model.toContentBannerIntent import kr.co.vividnext.sodalive.v2.main.content.model.toContentBannerRoute import kr.co.vividnext.sodalive.v2.main.content.model.usesDayOfWeekQuery import kr.co.vividnext.sodalive.v2.main.content.model.usesSeriesItems +import kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivity +import kr.co.vividnext.sodalive.v2.main.content.overview.data.ContentOverviewType import kr.co.vividnext.sodalive.v2.main.content.ui.CONTENT_ALL_GRID_SPAN_COUNT import kr.co.vividnext.sodalive.v2.main.content.ui.CONTENT_RECOMMENDED_GRID_SPAN_COUNT import kr.co.vividnext.sodalive.v2.main.content.ui.ContentAllAudioCardAdapter @@ -554,6 +556,9 @@ class ContentMainFragment : BaseFragment( binding.viewContentLatestAudioTitle.ivSectionTitleChevron.setOnClickListener { openContentAllTab(MainContentAllType.AUDIO, ContentSort.LATEST) } + binding.viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener { + openContentOverview(ContentOverviewType.NEW_AND_HOT_AUDIO) + } binding.viewContentFreeAudioTitle.ivSectionTitleChevron.setOnClickListener { openContentAllTab(MainContentAllType.FREE, ContentSort.POPULAR) } @@ -583,6 +588,12 @@ class ContentMainFragment : BaseFragment( } } + private fun openContentOverview(type: ContentOverviewType) { + ensureMainV2NavigationAllowed { + startActivity(ContentOverviewActivity.newIntent(requireContext(), type)) + } + } + private fun openAudioContentDetail(item: ContentAudioCardUiModel) { openAudioContentDetail(item.audioContentId, item.showAdultBadge) } diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt index 40c836d7..78d99cff 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt @@ -332,7 +332,7 @@ class ContentMainFragmentSourceTest { "binding.viewContentRecommendedAudioTitle.setTitle(" + "R.string.content_recommendation_section_recommended_audio)" ) - assertFalse(source.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener")) + assertTrue(source.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener")) } @Test @@ -376,7 +376,17 @@ class ContentMainFragmentSourceTest { assertSourceContains(source, "openContentAllTab(MainContentAllType.FREE, ContentSort.POPULAR)") assertSourceContains(source, "binding.viewContentPointAudioTitle.ivSectionTitleChevron.setOnClickListener") assertSourceContains(source, "openContentAllTab(MainContentAllType.POINT, ContentSort.POPULAR)") - assertFalse(source.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener")) + assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.main.content.overview.ContentOverviewActivity")) + assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.main.content.overview.data.ContentOverviewType")) + assertTrue(source.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener")) + assertTrue(source.contains("openContentOverview(ContentOverviewType.NEW_AND_HOT_AUDIO)")) + val functionSource = source.substringFrom("private fun openContentOverview(type: ContentOverviewType)") + assertTrue(functionSource.contains("ensureMainV2NavigationAllowed")) + assertTrue(functionSource.contains("startActivity(ContentOverviewActivity.newIntent(requireContext(), type))")) + assertTrue( + functionSource.indexOf("ensureMainV2NavigationAllowed") < + functionSource.indexOf("startActivity(") + ) } @Test @@ -525,6 +535,15 @@ class ContentMainFragmentSourceTest { assertTrue(message ?: "Expected source to contain: $expected", source.contains(expected)) } + private fun String.substringFrom(marker: String): String { + val startIndex = indexOf(marker) + assertTrue("Missing function: $marker", startIndex >= 0) + val nextFunctionIndex = indexOf("\n private fun ", startIndex + marker.length) + .takeIf { it >= 0 } + ?: length + return substring(startIndex, nextFunctionIndex) + } + private fun projectFile(relativePath: String): File { val candidates = listOf(File(relativePath), File("../$relativePath")) return candidates.firstOrNull { it.exists() } diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivitySourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivitySourceTest.kt index 22886964..114317fe 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivitySourceTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/overview/ContentOverviewActivitySourceTest.kt @@ -1,7 +1,6 @@ package kr.co.vividnext.sodalive.v2.main.content.overview import android.app.Application -import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith @@ -85,7 +84,7 @@ class ContentOverviewActivitySourceTest { } @Test - fun `manifest registers ContentOverviewActivity and Phase 7 routing is not added`() { + fun `manifest registers ContentOverviewActivity and Phase 7 routing is added`() { val manifest = projectFile("app/src/main/AndroidManifest.xml").readText() val homeSource = projectFile( "app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt" @@ -95,8 +94,8 @@ class ContentOverviewActivitySourceTest { ).readText() assertTrue(manifest.contains(".v2.main.content.overview.ContentOverviewActivity")) - assertFalse(homeSource.contains("viewHomeFirstAudioTitle.ivSectionTitleChevron.setOnClickListener")) - assertFalse(contentSource.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener")) + assertTrue(homeSource.contains("viewHomeFirstAudioTitle.ivSectionTitleChevron.setOnClickListener")) + assertTrue(contentSource.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener")) } private fun projectFile(relativePath: String): File {