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(
title: 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(
title: String,
creatorName: String
@@ -150,6 +179,7 @@ class SeriesContentCardView @JvmOverloads constructor(
private companion object {
const val TITLE_CREATOR_GAP_DP = 2
const val SERIES_SMALL_THUMBNAIL_HEIGHT_RATIO = 172f / 122f
}
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.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import androidx.test.core.app.ApplicationProvider
import kr.co.vividnext.sodalive.R
import org.junit.Assert.assertEquals
@@ -14,6 +16,7 @@ import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config
import kotlin.math.roundToInt
@RunWith(RobolectricTestRunner::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 {
val context = ApplicationProvider.getApplicationContext<Context>()
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.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 {
val context = ApplicationProvider.getApplicationContext<Context>()
return (this * context.resources.displayMetrics.density).toInt()