diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt index e6e01858..b302d961 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt @@ -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 diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardView.kt index a21ecadc..2eb08639 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardView.kt @@ -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( diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardViewTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardViewTest.kt new file mode 100644 index 00000000..6e1b9a7c --- /dev/null +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardViewTest.kt @@ -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() + 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) +} diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardViewTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardViewTest.kt index 8a31f756..7c3899d3 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardViewTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardViewTest.kt @@ -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() 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() return (this * context.resources.displayMetrics.density).toInt()