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(
|
fun setContent(
|
||||||
title: String,
|
title: String,
|
||||||
creatorName: 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(
|
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(
|
||||||
|
|||||||
@@ -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.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()
|
||||||
|
|||||||
Reference in New Issue
Block a user