fix(content): 콘텐츠 카드 동적 폭을 추가한다
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user