refactor(content): 콘텐츠 접근 가드를 공통화한다
This commit is contained in:
@@ -29,7 +29,8 @@ import kr.co.vividnext.sodalive.v2.common.data.ContentSort
|
|||||||
import kr.co.vividnext.sodalive.v2.creator.channel.model.toLabelResId
|
import kr.co.vividnext.sodalive.v2.creator.channel.model.toLabelResId
|
||||||
import kr.co.vividnext.sodalive.v2.creator.channel.ui.CreatorChannelSortPopup
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.CreatorChannelSortPopup
|
||||||
import kr.co.vividnext.sodalive.v2.main.MainV2Activity
|
import kr.co.vividnext.sodalive.v2.main.MainV2Activity
|
||||||
import kr.co.vividnext.sodalive.v2.main.ensureMainV2NavigationAllowed
|
import kr.co.vividnext.sodalive.v2.access.AccessRequirement
|
||||||
|
import kr.co.vividnext.sodalive.v2.access.ensureV2Access
|
||||||
import kr.co.vividnext.sodalive.v2.main.content.data.AudioRankingType
|
import kr.co.vividnext.sodalive.v2.main.content.data.AudioRankingType
|
||||||
import kr.co.vividnext.sodalive.v2.main.content.data.MainContentAllType
|
import kr.co.vividnext.sodalive.v2.main.content.data.MainContentAllType
|
||||||
import kr.co.vividnext.sodalive.v2.main.content.model.AudioRankingsUiState
|
import kr.co.vividnext.sodalive.v2.main.content.model.AudioRankingsUiState
|
||||||
@@ -147,7 +148,7 @@ class ContentMainFragment : BaseFragment<FragmentV2MainContentBinding>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun openWithLoginGuard(activityClass: Class<*>) {
|
private fun openWithLoginGuard(activityClass: Class<*>) {
|
||||||
ensureMainV2NavigationAllowed {
|
ensureV2Access(AccessRequirement.Login) {
|
||||||
startActivity(Intent(requireContext(), activityClass))
|
startActivity(Intent(requireContext(), activityClass))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -615,19 +616,19 @@ class ContentMainFragment : BaseFragment<FragmentV2MainContentBinding>(
|
|||||||
|
|
||||||
private fun onBannerClick(item: ContentBannerUiModel) {
|
private fun onBannerClick(item: ContentBannerUiModel) {
|
||||||
val route = item.toContentBannerRoute() ?: return
|
val route = item.toContentBannerRoute() ?: return
|
||||||
ensureMainV2NavigationAllowed {
|
ensureV2Access(AccessRequirement.Login) {
|
||||||
startActivity(route.toContentBannerIntent(requireContext()))
|
startActivity(route.toContentBannerIntent(requireContext()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openContentAllTab(type: MainContentAllType, sort: ContentSort) {
|
private fun openContentAllTab(type: MainContentAllType, sort: ContentSort) {
|
||||||
ensureMainV2NavigationAllowed {
|
ensureV2Access(AccessRequirement.Login) {
|
||||||
(activity as? MainV2Activity)?.openContentAllTab(type, sort)
|
(activity as? MainV2Activity)?.openContentAllTab(type, sort)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openContentOverview(type: ContentOverviewType) {
|
private fun openContentOverview(type: ContentOverviewType) {
|
||||||
ensureMainV2NavigationAllowed {
|
ensureV2Access(AccessRequirement.Login) {
|
||||||
startActivity(ContentOverviewActivity.newIntent(requireContext(), type))
|
startActivity(ContentOverviewActivity.newIntent(requireContext(), type))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -645,7 +646,7 @@ class ContentMainFragment : BaseFragment<FragmentV2MainContentBinding>(
|
|||||||
requiresAdultContentAccess: Boolean = false
|
requiresAdultContentAccess: Boolean = false
|
||||||
) {
|
) {
|
||||||
if (audioContentId <= 0L) return
|
if (audioContentId <= 0L) return
|
||||||
ensureMainV2NavigationAllowed(requiresAdultContentAccess = requiresAdultContentAccess) {
|
ensureV2Access(AccessRequirement.forAdultContent(requiresAdultContentAccess)) {
|
||||||
startActivity(
|
startActivity(
|
||||||
Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
|
Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
|
||||||
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, audioContentId)
|
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, audioContentId)
|
||||||
@@ -669,7 +670,7 @@ class ContentMainFragment : BaseFragment<FragmentV2MainContentBinding>(
|
|||||||
requiresAdultContentAccess: Boolean = false
|
requiresAdultContentAccess: Boolean = false
|
||||||
) {
|
) {
|
||||||
if (seriesId <= 0L) return
|
if (seriesId <= 0L) return
|
||||||
ensureMainV2NavigationAllowed(requiresAdultContentAccess = requiresAdultContentAccess) {
|
ensureV2Access(AccessRequirement.forAdultContent(requiresAdultContentAccess)) {
|
||||||
startActivity(
|
startActivity(
|
||||||
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
|
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
|
||||||
putExtra(Constants.EXTRA_SERIES_ID, seriesId)
|
putExtra(Constants.EXTRA_SERIES_ID, seriesId)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class ContentMainFragmentLoginGuardSourceTest {
|
|||||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt"
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt"
|
||||||
).readText()
|
).readText()
|
||||||
|
|
||||||
assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.main.ensureMainV2NavigationAllowed"))
|
assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.access.ensureV2Access"))
|
||||||
assertGuardedStartActivity(source, "private fun onBannerClick(item: ContentBannerUiModel)")
|
assertGuardedStartActivity(source, "private fun onBannerClick(item: ContentBannerUiModel)")
|
||||||
assertGuardedStartActivity(source, "audioContentId: Long,\n requiresAdultContentAccess: Boolean = false")
|
assertGuardedStartActivity(source, "audioContentId: Long,\n requiresAdultContentAccess: Boolean = false")
|
||||||
assertGuardedStartActivity(source, "seriesId: Long,\n requiresAdultContentAccess: Boolean = false")
|
assertGuardedStartActivity(source, "seriesId: Long,\n requiresAdultContentAccess: Boolean = false")
|
||||||
@@ -40,7 +40,7 @@ class ContentMainFragmentLoginGuardSourceTest {
|
|||||||
assertTrue(source.contains("openAudioContentDetail(item.audioContentId, item.showAdultBadge)"))
|
assertTrue(source.contains("openAudioContentDetail(item.audioContentId, item.showAdultBadge)"))
|
||||||
assertTrue(source.contains("openAudioContentDetail(audioContentId, findAllTabAudioAdultAccess(audioContentId))"))
|
assertTrue(source.contains("openAudioContentDetail(audioContentId, findAllTabAudioAdultAccess(audioContentId))"))
|
||||||
assertTrue(source.contains("openSeriesDetail(seriesId, findAllTabSeriesAdultAccess(seriesId))"))
|
assertTrue(source.contains("openSeriesDetail(seriesId, findAllTabSeriesAdultAccess(seriesId))"))
|
||||||
assertTrue(source.contains("requiresAdultContentAccess = requiresAdultContentAccess"))
|
assertTrue(source.contains("AccessRequirement.forAdultContent(requiresAdultContentAccess)"))
|
||||||
assertFalse(source.contains("ContentCommentedAudioUiModel.showAdultBadge"))
|
assertFalse(source.contains("ContentCommentedAudioUiModel.showAdultBadge"))
|
||||||
assertFalse(source.contains("ContentOriginalSeriesUiModel.showAdultBadge"))
|
assertFalse(source.contains("ContentOriginalSeriesUiModel.showAdultBadge"))
|
||||||
}
|
}
|
||||||
@@ -48,14 +48,14 @@ class ContentMainFragmentLoginGuardSourceTest {
|
|||||||
private fun assertGuardedStartActivity(source: String, functionSignature: String) {
|
private fun assertGuardedStartActivity(source: String, functionSignature: String) {
|
||||||
val functionSource = source.substringFrom(functionSignature)
|
val functionSource = source.substringFrom(functionSignature)
|
||||||
assertTrue(
|
assertTrue(
|
||||||
"$functionSignature must call ensureMainV2NavigationAllowed before startActivity.",
|
"$functionSignature must call ensureV2Access before startActivity.",
|
||||||
functionSource.indexOf("ensureMainV2NavigationAllowed") in 0 until functionSource.indexOf("startActivity")
|
functionSource.indexOf("ensureV2Access") in 0 until functionSource.indexOf("startActivity")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun assertBeforeGuard(source: String, expectedReturn: String) {
|
private fun assertBeforeGuard(source: String, expectedReturn: String) {
|
||||||
val returnIndex = source.indexOf(expectedReturn)
|
val returnIndex = source.indexOf(expectedReturn)
|
||||||
val guardIndex = source.indexOf("ensureMainV2NavigationAllowed", returnIndex)
|
val guardIndex = source.indexOf("ensureV2Access", returnIndex)
|
||||||
|
|
||||||
assertTrue("Missing source: $expectedReturn", returnIndex >= 0)
|
assertTrue("Missing source: $expectedReturn", returnIndex >= 0)
|
||||||
assertTrue("$expectedReturn must stay before guard.", guardIndex > returnIndex)
|
assertTrue("$expectedReturn must stay before guard.", guardIndex > returnIndex)
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ class ContentMainFragmentSourceTest {
|
|||||||
|
|
||||||
assertSourceContains(source, "import kr.co.vividnext.sodalive.v2.main.MainV2Activity")
|
assertSourceContains(source, "import kr.co.vividnext.sodalive.v2.main.MainV2Activity")
|
||||||
assertSourceContains(source, "private fun openContentAllTab(type: MainContentAllType, sort: ContentSort)")
|
assertSourceContains(source, "private fun openContentAllTab(type: MainContentAllType, sort: ContentSort)")
|
||||||
assertSourceContains(source, "ensureMainV2NavigationAllowed")
|
assertSourceContains(source, "ensureV2Access")
|
||||||
assertSourceContains(source, "(activity as? MainV2Activity)?.openContentAllTab(type, sort)")
|
assertSourceContains(source, "(activity as? MainV2Activity)?.openContentAllTab(type, sort)")
|
||||||
assertSourceContains(source, "binding.viewContentOriginalSeriesTitle.ivSectionTitleChevron.setOnClickListener")
|
assertSourceContains(source, "binding.viewContentOriginalSeriesTitle.ivSectionTitleChevron.setOnClickListener")
|
||||||
assertSourceContains(source, "openContentAllTab(MainContentAllType.ORIGINAL, ContentSort.LATEST)")
|
assertSourceContains(source, "openContentAllTab(MainContentAllType.ORIGINAL, ContentSort.LATEST)")
|
||||||
@@ -407,10 +407,10 @@ class ContentMainFragmentSourceTest {
|
|||||||
assertTrue(source.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener"))
|
assertTrue(source.contains("viewContentNewAndHotTitle.ivSectionTitleChevron.setOnClickListener"))
|
||||||
assertTrue(source.contains("openContentOverview(ContentOverviewType.NEW_AND_HOT_AUDIO)"))
|
assertTrue(source.contains("openContentOverview(ContentOverviewType.NEW_AND_HOT_AUDIO)"))
|
||||||
val functionSource = source.substringFrom("private fun openContentOverview(type: ContentOverviewType)")
|
val functionSource = source.substringFrom("private fun openContentOverview(type: ContentOverviewType)")
|
||||||
assertTrue(functionSource.contains("ensureMainV2NavigationAllowed"))
|
assertTrue(functionSource.contains("ensureV2Access"))
|
||||||
assertTrue(functionSource.contains("startActivity(ContentOverviewActivity.newIntent(requireContext(), type))"))
|
assertTrue(functionSource.contains("startActivity(ContentOverviewActivity.newIntent(requireContext(), type))"))
|
||||||
assertTrue(
|
assertTrue(
|
||||||
functionSource.indexOf("ensureMainV2NavigationAllowed") <
|
functionSource.indexOf("ensureV2Access") <
|
||||||
functionSource.indexOf("startActivity(")
|
functionSource.indexOf("startActivity(")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class ContentMainTitleBarActionSourceTest {
|
|||||||
assertTrue(source.contains("viewContentTitleBar.ivTitleBarCash.setOnClickListener"))
|
assertTrue(source.contains("viewContentTitleBar.ivTitleBarCash.setOnClickListener"))
|
||||||
assertTrue(source.contains("viewContentTitleBar.ivTitleBarSearch.setOnClickListener"))
|
assertTrue(source.contains("viewContentTitleBar.ivTitleBarSearch.setOnClickListener"))
|
||||||
assertTrue(source.contains("viewContentTitleBar.ivTitleBarStorage.setOnClickListener"))
|
assertTrue(source.contains("viewContentTitleBar.ivTitleBarStorage.setOnClickListener"))
|
||||||
assertTrue(source.contains("ensureMainV2NavigationAllowed"))
|
assertTrue(source.contains("ensureV2Access"))
|
||||||
assertTrue(source.contains("CanChargeActivity::class.java"))
|
assertTrue(source.contains("CanChargeActivity::class.java"))
|
||||||
assertTrue(source.contains("SearchActivity::class.java"))
|
assertTrue(source.contains("SearchActivity::class.java"))
|
||||||
assertTrue(source.contains("AudioContentBoxActivity::class.java"))
|
assertTrue(source.contains("AudioContentBoxActivity::class.java"))
|
||||||
|
|||||||
Reference in New Issue
Block a user