|
|
|
|
@@ -5,6 +5,10 @@ import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelDon
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelDonationHeaderColorRes
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelNoticeCardWidthDp
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelAudioItemWidthDp
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelCommunityCardWidthDp
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelFanTalkCardWidthDp
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelSeriesCardHeightDp
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelSeriesCardWidthDp
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.calculateCreatorChannelScheduleTimelineLineCount
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.formatCreatorChannelScheduleDate
|
|
|
|
|
import kr.co.vividnext.sodalive.v2.creator.channel.ui.formatCreatorChannelScheduleDayOfWeek
|
|
|
|
|
@@ -156,11 +160,11 @@ class CreatorChannelHomeActivitySourceTest {
|
|
|
|
|
assertTrue(adapter.contains("ll_section_items"))
|
|
|
|
|
assertTrue(adapter.contains("sectionItems?.addView"))
|
|
|
|
|
assertTrue(adapter.contains("addActivityRow"))
|
|
|
|
|
assertTrue(adapter.contains("createContentTile"))
|
|
|
|
|
assertTrue(adapter.contains("addFeedCard"))
|
|
|
|
|
assertFalse(adapter.contains("createContentTile"))
|
|
|
|
|
assertFalse(adapter.contains("addFeedCard"))
|
|
|
|
|
assertFalse(adapter.contains("addScheduleRow"))
|
|
|
|
|
assertFalse(adapter.contains("addDonationCard"))
|
|
|
|
|
assertTrue(adapter.contains("addCommentCard"))
|
|
|
|
|
assertFalse(adapter.contains("addCommentCard"))
|
|
|
|
|
assertTrue(adapter.contains("createSnsButton"))
|
|
|
|
|
assertTrue(adapter.contains("activity.debutDateUtc"))
|
|
|
|
|
assertTrue(adapter.contains("activity.liveDurationHours"))
|
|
|
|
|
@@ -382,14 +386,11 @@ class CreatorChannelHomeActivitySourceTest {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `section adapter source는 가로 시리즈와 SNS 링크와 일정 타입 label을 보존한다`() {
|
|
|
|
|
fun `section adapter source는 SNS 링크와 일정 타입 label을 보존한다`() {
|
|
|
|
|
val adapter = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
|
|
|
|
|
assertTrue(adapter.contains("HorizontalScrollView"))
|
|
|
|
|
assertTrue(adapter.contains("createHorizontalScrollRow"))
|
|
|
|
|
assertTrue(adapter.contains("createHorizontalScrollRow(row)"))
|
|
|
|
|
assertTrue(adapter.contains("iconResId = sns.iconResId"))
|
|
|
|
|
assertTrue(adapter.contains("url = sns.url"))
|
|
|
|
|
assertTrue(adapter.contains("schedule.type.labelResId"))
|
|
|
|
|
@@ -542,6 +543,217 @@ class CreatorChannelHomeActivitySourceTest {
|
|
|
|
|
assertTrue(source.contains("putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, audioContent.audioContentId)"))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `시리즈 섹션은 Figma Contents series size m 카드 row로 렌더링한다`() {
|
|
|
|
|
val adapter = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
val seriesLayout = projectFile("app/src/main/res/layout/item_creator_channel_home_series.xml").readText()
|
|
|
|
|
val seriesItemLayout = projectFile(
|
|
|
|
|
"app/src/main/res/layout/item_creator_channel_home_series_content.xml"
|
|
|
|
|
).readText()
|
|
|
|
|
val seriesCardView = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSeriesCardView.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
|
|
|
|
|
assertTrue(seriesLayout.contains("@layout/view_section_title"))
|
|
|
|
|
assertTrue(seriesLayout.contains("@+id/hsv_series_items"))
|
|
|
|
|
assertTrue(seriesLayout.contains("@+id/ll_series_items"))
|
|
|
|
|
assertFalse(seriesLayout.contains("@+id/ll_section_items"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("CreatorChannelHomeSeriesCardView"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@+id/layout_series_content_card"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@+id/layout_series_thumbnail"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@+id/iv_series_thumbnail"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@+id/layout_series_original_tag"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@+id/iv_series_original_icon"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@+id/tv_series_original_text"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("android:text=\"Only\""))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@font/phosphate_solid"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("android:layout_width=\"70dp\""))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@drawable/bg_series_original_tag"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("@drawable/ic_series_original"))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("android:layout_width=\"163dp\""))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("android:layout_height=\"230dp\""))
|
|
|
|
|
assertTrue(seriesItemLayout.contains("android:layout_width=\"14dp\""))
|
|
|
|
|
assertFalse(seriesItemLayout.contains("android:clipToOutline"))
|
|
|
|
|
assertTrue(seriesCardView.contains("clipToOutline = true"))
|
|
|
|
|
assertTrue(seriesCardView.contains("ViewOutlineProvider"))
|
|
|
|
|
assertTrue(seriesCardView.contains("outline.setRoundRect"))
|
|
|
|
|
assertTrue(seriesCardView.contains("R.dimen.radius_14"))
|
|
|
|
|
assertTrue(seriesCardView.contains("originalTag.isVisible = series.isOriginal"))
|
|
|
|
|
assertTrue(seriesCardView.contains("thumbnail.loadUrl(series.coverImageUrl)"))
|
|
|
|
|
assertTrue(seriesCardView.contains("fun setThumbnailSize(widthDp: Int, heightDp: Int)"))
|
|
|
|
|
assertTrue(adapter.contains("private val seriesItems: LinearLayout?"))
|
|
|
|
|
assertTrue(adapter.contains("val visibleSeries = item.series.take(MAX_SERIES_ITEM_COUNT)"))
|
|
|
|
|
assertTrue(adapter.contains("R.layout.item_creator_channel_home_series_content"))
|
|
|
|
|
assertTrue(adapter.contains("(row as CreatorChannelHomeSeriesCardView).apply"))
|
|
|
|
|
assertTrue(adapter.contains("bind(series)"))
|
|
|
|
|
assertTrue(adapter.contains("setThumbnailSize(seriesWidthDp, calculateCreatorChannelSeriesCardHeightDp(seriesWidthDp))"))
|
|
|
|
|
assertTrue(adapter.contains("row.setOnClickListener { onSeriesClick(series) }"))
|
|
|
|
|
assertTrue(adapter.contains("calculateCreatorChannelSeriesCardWidthDp"))
|
|
|
|
|
assertTrue(adapter.contains("private const val MAX_SERIES_ITEM_COUNT = 10"))
|
|
|
|
|
assertFalse(adapter.contains("createContentTile("))
|
|
|
|
|
assertFalse(adapter.contains("creator_channel_series_summary"))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `시리즈 DTO와 bind source는 현재 백엔드 필드만 화면에 사용한다`() {
|
|
|
|
|
val model = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
val adapter = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
val seriesCardView = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSeriesCardView.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
|
|
|
|
|
assertTrue(model.contains("@SerializedName(\"seriesId\") val seriesId: Long"))
|
|
|
|
|
assertTrue(model.contains("@SerializedName(\"coverImageUrl\") val coverImageUrl: String"))
|
|
|
|
|
assertTrue(model.contains("@SerializedName(\"isOriginal\") val isOriginal: Boolean"))
|
|
|
|
|
assertFalse(model.contains("publishedDaysOfWeek"))
|
|
|
|
|
assertFalse(model.contains("isPopular"))
|
|
|
|
|
assertFalse(model.contains("isComplete"))
|
|
|
|
|
assertTrue(adapter.contains("onSeriesClick(series)"))
|
|
|
|
|
assertTrue(seriesCardView.contains("series.coverImageUrl"))
|
|
|
|
|
assertTrue(seriesCardView.contains("series.isOriginal"))
|
|
|
|
|
assertFalse(seriesCardView.contains("series.numberOfContent"))
|
|
|
|
|
assertFalse(seriesCardView.contains("series.isNew"))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `시리즈 카드 width는 402dp 기준 최대 163dp이고 작은 화면에서는 비율 축소한다`() {
|
|
|
|
|
assertEquals(163, calculateCreatorChannelSeriesCardWidthDp(402))
|
|
|
|
|
assertEquals(163, calculateCreatorChannelSeriesCardWidthDp(430))
|
|
|
|
|
assertEquals(146, calculateCreatorChannelSeriesCardWidthDp(360))
|
|
|
|
|
assertEquals(230, calculateCreatorChannelSeriesCardHeightDp(163))
|
|
|
|
|
assertEquals(206, calculateCreatorChannelSeriesCardHeightDp(146))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `커뮤니티 섹션은 Figma feed card 3개와 전체보기 capsule로 렌더링한다`() {
|
|
|
|
|
val adapter = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
val communityLayout = projectFile("app/src/main/res/layout/item_creator_channel_home_community.xml").readText()
|
|
|
|
|
val communityViewLayout = projectFile("app/src/main/res/layout/view_feed_community.xml").readText()
|
|
|
|
|
val feedCommunityView = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/widget/feed/FeedCommunityView.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
|
|
|
|
|
assertTrue(communityLayout.contains("@layout/view_section_title"))
|
|
|
|
|
assertTrue(communityLayout.contains("@+id/ll_community_items"))
|
|
|
|
|
assertTrue(communityLayout.contains("@+id/layout_community_more_button"))
|
|
|
|
|
assertTrue(communityLayout.contains("@string/view_all"))
|
|
|
|
|
assertFalse(communityLayout.contains("@+id/ll_section_items"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("FeedCommunityView"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("android:layout_width=\"match_parent\""))
|
|
|
|
|
assertTrue(communityViewLayout.contains("@+id/fl_feed_community_image_container"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("@+id/iv_feed_community_image"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("@+id/ll_feed_community_paid_overlay"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("@+id/tv_feed_community_price"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("@drawable/bg_creator_channel_community_price"))
|
|
|
|
|
assertTrue(communityViewLayout.contains("@drawable/ic_bar_cash"))
|
|
|
|
|
assertFalse(communityViewLayout.contains("android:drawableStart=\"@drawable/ic_bar_cash\""))
|
|
|
|
|
assertTrue(communityViewLayout.contains("android:layout_marginStart=\"@dimen/spacing_6\""))
|
|
|
|
|
assertFalse(communityViewLayout.contains("android:clipToOutline"))
|
|
|
|
|
assertFalse(communityViewLayout.contains("android:layout_height=\"0dp\""))
|
|
|
|
|
assertTrue(feedCommunityView.contains("clipToOutline = true"))
|
|
|
|
|
assertTrue(feedCommunityView.contains("ViewOutlineProvider"))
|
|
|
|
|
assertTrue(feedCommunityView.contains("outline.setRoundRect"))
|
|
|
|
|
assertTrue(adapter.contains("private val communityItems: LinearLayout?"))
|
|
|
|
|
assertTrue(adapter.contains("val visibleCommunities = item.communities.take(MAX_COMMUNITY_ITEM_COUNT)"))
|
|
|
|
|
assertTrue(adapter.contains("R.layout.view_feed_community"))
|
|
|
|
|
assertTrue(adapter.contains("communityItems?.addView(row)"))
|
|
|
|
|
assertTrue(adapter.contains("(row as FeedCommunityView).apply"))
|
|
|
|
|
assertTrue(adapter.contains("setFeedSize("))
|
|
|
|
|
assertTrue(adapter.contains("FeedSize("))
|
|
|
|
|
assertTrue(adapter.contains("val communityWidthDp = calculateCreatorChannelCommunityCardWidthDp("))
|
|
|
|
|
assertTrue(adapter.contains("rootWidthDp = communityWidthDp"))
|
|
|
|
|
assertTrue(adapter.contains("setHideEmptyTextRows(true)"))
|
|
|
|
|
assertTrue(adapter.contains("bind(community.toFeedCommunityItem())"))
|
|
|
|
|
assertTrue(adapter.contains("bindCommunityImages(row, community)"))
|
|
|
|
|
assertTrue(adapter.contains("BlurTransformation(itemView.context, 25f, 2.5f)"))
|
|
|
|
|
assertTrue(adapter.contains("row.layoutParams = LinearLayout.LayoutParams("))
|
|
|
|
|
assertTrue(adapter.contains("communityWidthDp.dp()"))
|
|
|
|
|
assertTrue(adapter.contains("LinearLayout.LayoutParams.WRAP_CONTENT"))
|
|
|
|
|
assertTrue(adapter.contains("communityImageUrl = community.imageUrl.takeIf { !it.isNullOrBlank() }"))
|
|
|
|
|
assertTrue(adapter.contains("communityImageView().setImageDrawable(null)"))
|
|
|
|
|
assertTrue(adapter.contains("private const val MAX_COMMUNITY_ITEM_COUNT = 3"))
|
|
|
|
|
assertFalse(adapter.contains("CreatorChannelCommunityCardView"))
|
|
|
|
|
assertFalse(adapter.contains("CreatorChannelCommunityThumbnailView"))
|
|
|
|
|
assertFalse(adapter.contains("private fun addFeedCard"))
|
|
|
|
|
assertFalse(adapter.contains("addFeedCard("))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `커뮤니티 컴포넌트 width는 402dp 기준 최대 374dp이고 작은 화면에서는 비율 축소한다`() {
|
|
|
|
|
assertEquals(374, calculateCreatorChannelCommunityCardWidthDp(402))
|
|
|
|
|
assertEquals(374, calculateCreatorChannelCommunityCardWidthDp(430))
|
|
|
|
|
assertEquals(335, calculateCreatorChannelCommunityCardWidthDp(360))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `팬Talk 섹션은 Figma ListComment layout과 bind로 렌더링한다`() {
|
|
|
|
|
val adapter = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
val fanTalkLayout = projectFile("app/src/main/res/layout/item_creator_channel_home_fantalk.xml").readText()
|
|
|
|
|
val fanTalkCardView = projectFile(
|
|
|
|
|
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelFanTalkCardView.kt"
|
|
|
|
|
).readText()
|
|
|
|
|
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@layout/view_section_title"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("CreatorChannelFanTalkCardView"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/layout_fantalk_card"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/layout_fantalk_total_row"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/tv_fantalk_total_label"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/tv_fantalk_total_count"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/layout_fantalk_latest_row"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/iv_fantalk_profile"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/tv_fantalk_content"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/layout_fantalk_empty"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/tv_fantalk_empty_title"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@+id/layout_fantalk_support_button"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@string/creator_channel_fantalk_empty_title"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@string/creator_channel_fantalk_support_action"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@drawable/ic_new_fantalk_plus"))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("android:layout_width=\"match_parent\""))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("android:layout_height=\"169dp\""))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("android:layout_marginBottom=\"@dimen/spacing_6\""))
|
|
|
|
|
assertTrue(fanTalkLayout.contains("@drawable/ic_chevron_down_white"))
|
|
|
|
|
assertFalse(fanTalkLayout.contains("@+id/ll_section_items"))
|
|
|
|
|
assertFalse(fanTalkLayout.contains("android:clipToOutline"))
|
|
|
|
|
assertTrue(fanTalkCardView.contains("clipToOutline = true"))
|
|
|
|
|
assertTrue(fanTalkCardView.contains("ViewOutlineProvider"))
|
|
|
|
|
assertTrue(fanTalkCardView.contains("outline.setRoundRect"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkTotalCount: TextView?"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkCard: View?"))
|
|
|
|
|
assertTrue(adapter.contains("calculateCreatorChannelFanTalkCardWidthDp"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkProfile: ImageView?"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkContent: TextView?"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkTotalRow: View?"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkLatestRow: View?"))
|
|
|
|
|
assertTrue(adapter.contains("private val fanTalkEmpty: View?"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkTotalCount?.text = item.fanTalk.totalCount.toString()"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkTotalRow?.isVisible = fanTalk != null"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkLatestRow?.isVisible = fanTalk != null"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkEmpty?.isVisible = fanTalk == null"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkContent?.text = fanTalk.content"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkProfile?.loadUrl(fanTalk.profileImageUrl)"))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkContent?.text = \"\""))
|
|
|
|
|
assertTrue(adapter.contains("fanTalkProfile?.setImageResource(R.drawable.ic_placeholder_profile)"))
|
|
|
|
|
assertFalse(adapter.contains("private fun addCommentCard"))
|
|
|
|
|
assertFalse(adapter.contains("addCommentCard("))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `팬Talk 카드 width는 402dp 기준 최대 374dp이고 작은 화면에서는 비율 축소한다`() {
|
|
|
|
|
assertEquals(374, calculateCreatorChannelFanTalkCardWidthDp(402))
|
|
|
|
|
assertEquals(374, calculateCreatorChannelFanTalkCardWidthDp(430))
|
|
|
|
|
assertEquals(335, calculateCreatorChannelFanTalkCardWidthDp(360))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `SNS source는 ic_sns 아이콘을 ImageView로 표시한다`() {
|
|
|
|
|
val uiModel = projectFile(
|
|
|
|
|
@@ -606,11 +818,8 @@ class CreatorChannelHomeActivitySourceTest {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `section item layouts는 legacy generic card id를 제거하고 동적 컨테이너만 둔다`() {
|
|
|
|
|
fun `남은 section item layouts는 legacy generic card id를 제거하고 동적 컨테이너만 둔다`() {
|
|
|
|
|
val layoutNames = listOf(
|
|
|
|
|
"series",
|
|
|
|
|
"community",
|
|
|
|
|
"fantalk",
|
|
|
|
|
"introduce",
|
|
|
|
|
"activity",
|
|
|
|
|
"sns"
|
|
|
|
|
|