fix(content): 콘텐츠 카드 동적 폭을 추가한다

This commit is contained in:
2026-06-25 18:31:26 +09:00
parent 15de359d4f
commit 78e0a53018
4 changed files with 129 additions and 0 deletions

View File

@@ -82,6 +82,35 @@ class AudioContentCardView @JvmOverloads constructor(
} }
} }
fun setGridItemWidthPx(widthPx: Int) {
if (widthPx <= 0) return
updateRootWidth(widthPx)
requireNotNull(thumbnailContainer).layoutParams = LayoutParams(widthPx, widthPx)
requireNotNull(thumbnail).layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
requireNotNull(labelContainer).layoutParams = LayoutParams(
widthPx,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
topMargin = AudioContentCardSize.Small.thumbnailLabelGapDp.dpToPx()
}
requireNotNull(titleText).setTextAppearance(AudioContentCardSize.Small.titleStyleRes)
requireNotNull(creatorText).apply {
setTextAppearance(AudioContentCardSize.Small.creatorStyleRes)
layoutParams = LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
topMargin = TITLE_CREATOR_GAP_DP.dpToPx()
}
}
}
fun setContent( fun setContent(
title: String, title: String,
creatorName: String creatorName: String

View File

@@ -73,6 +73,35 @@ class SeriesContentCardView @JvmOverloads constructor(
} }
} }
fun setGridItemWidthPx(widthPx: Int) {
if (widthPx <= 0) return
updateRootWidth(widthPx)
requireNotNull(thumbnailContainer).layoutParams = LayoutParams(
widthPx,
(widthPx * SERIES_SMALL_THUMBNAIL_HEIGHT_RATIO).roundToInt()
)
requireNotNull(labelContainer).layoutParams = LayoutParams(
widthPx,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
topMargin = SeriesContentCardSize.Small.thumbnailLabelGapDp.dpToPx()
}
requireNotNull(titleText).setTextAppearance(SeriesContentCardSize.Small.titleStyleRes)
updateAdultBadge(SeriesContentCardSize.Small)
requireNotNull(creatorText).apply {
setTextAppearance(SeriesContentCardSize.Small.creatorStyleRes)
layoutParams = LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
topMargin = TITLE_CREATOR_GAP_DP.dpToPx()
}
}
}
fun setContent( fun setContent(
title: String, title: String,
creatorName: String creatorName: String
@@ -150,6 +179,7 @@ class SeriesContentCardView @JvmOverloads constructor(
private companion object { private companion object {
const val TITLE_CREATOR_GAP_DP = 2 const val TITLE_CREATOR_GAP_DP = 2
const val SERIES_SMALL_THUMBNAIL_HEIGHT_RATIO = 172f / 122f
} }
private data class AdultBadgeSpec( private data class AdultBadgeSpec(

View File

@@ -0,0 +1,46 @@
package kr.co.vividnext.sodalive.v2.widget
import android.app.Application
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.test.core.app.ApplicationProvider
import kr.co.vividnext.sodalive.R
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [28], application = Application::class)
class AudioContentCardViewTest {
@Test
fun `grid item width는 audio thumbnail과 label 폭 및 1대1 높이를 적용한다`() {
val card = inflateCard()
card.setGridItemWidthPx(137)
val thumbnailParams = card.thumbnailContainer().layoutParams as LinearLayout.LayoutParams
val thumbnailImageParams = card.thumbnailView().layoutParams as FrameLayout.LayoutParams
val labelParams = card.labelContainer().layoutParams as LinearLayout.LayoutParams
assertEquals(137, card.layoutParams.width)
assertEquals(137, thumbnailParams.width)
assertEquals(137, thumbnailParams.height)
assertEquals(ViewGroup.LayoutParams.MATCH_PARENT, thumbnailImageParams.width)
assertEquals(ViewGroup.LayoutParams.MATCH_PARENT, thumbnailImageParams.height)
assertEquals(137, labelParams.width)
}
private fun inflateCard(): AudioContentCardView {
val context = ApplicationProvider.getApplicationContext<Context>()
return LayoutInflater.from(context).inflate(R.layout.view_audio_content_card, null, false) as AudioContentCardView
}
private fun AudioContentCardView.thumbnailContainer(): FrameLayout = findViewById(R.id.fl_audio_content_thumbnail_container)
private fun AudioContentCardView.labelContainer(): LinearLayout = findViewById(R.id.ll_audio_content_label)
}

View File

@@ -4,8 +4,10 @@ import android.app.Application
import android.content.Context import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@@ -14,6 +16,7 @@ import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import kotlin.math.roundToInt
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
@Config(sdk = [28], application = Application::class) @Config(sdk = [28], application = Application::class)
@@ -77,6 +80,23 @@ class SeriesContentCardViewTest {
) )
} }
@Test
fun `grid item width는 series thumbnail과 label 폭 및 122대172 높이를 적용한다`() {
val card = inflateCard()
card.setGridItemWidthPx(137)
val thumbnailParams = card.thumbnailContainer().layoutParams as LinearLayout.LayoutParams
val thumbnailImageParams = card.thumbnailView().layoutParams as FrameLayout.LayoutParams
val labelParams = card.labelContainer().layoutParams as LinearLayout.LayoutParams
assertEquals(137, card.layoutParams.width)
assertEquals(137, thumbnailParams.width)
assertEquals((137 * 172f / 122f).roundToInt(), thumbnailParams.height)
assertEquals(ViewGroup.LayoutParams.MATCH_PARENT, thumbnailImageParams.width)
assertEquals(ViewGroup.LayoutParams.MATCH_PARENT, thumbnailImageParams.height)
assertEquals(137, labelParams.width)
}
private fun inflateCard(): SeriesContentCardView { private fun inflateCard(): SeriesContentCardView {
val context = ApplicationProvider.getApplicationContext<Context>() val context = ApplicationProvider.getApplicationContext<Context>()
return LayoutInflater.from(context).inflate(R.layout.view_series_content_card, null, false) as SeriesContentCardView return LayoutInflater.from(context).inflate(R.layout.view_series_content_card, null, false) as SeriesContentCardView
@@ -84,6 +104,10 @@ class SeriesContentCardViewTest {
private fun SeriesContentCardView.adultBadge(): ImageView = findViewById(R.id.iv_series_content_adult_badge) private fun SeriesContentCardView.adultBadge(): ImageView = findViewById(R.id.iv_series_content_adult_badge)
private fun SeriesContentCardView.thumbnailContainer(): FrameLayout = findViewById(R.id.fl_series_thumbnail_container)
private fun SeriesContentCardView.labelContainer(): LinearLayout = findViewById(R.id.ll_series_content_label)
private fun Int.dpToPx(): Int { private fun Int.dpToPx(): Int {
val context = ApplicationProvider.getApplicationContext<Context>() val context = ApplicationProvider.getApplicationContext<Context>()
return (this * context.resources.displayMetrics.density).toInt() return (this * context.resources.displayMetrics.density).toInt()