From 11853761cf42cde7412e3e5c6aac2d51fae8c0cf Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 25 Jun 2026 15:57:53 +0900 Subject: [PATCH] =?UTF-8?q?fix(content):=20=EC=BD=98=ED=85=90=EC=B8=A0=20?= =?UTF-8?q?=EB=9E=AD=ED=82=B9=20rank=20=EA=B0=84=EA=B2=A9=EC=9D=84=20?= =?UTF-8?q?=EB=B3=B4=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContentRankingGridCardView.kt | 2 + .../ContentRankingHorizontalCardView.kt | 5 + .../ContentRankingLargeCardView.kt | 1 + ...view_content_ranking_grid_card_content.xml | 1 + .../view_content_ranking_horizontal_card.xml | 1 + .../view_content_ranking_large_card.xml | 1 + .../ContentRankingCardViewTest.kt | 92 +++++++++++++++++++ 7 files changed, 103 insertions(+) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingGridCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingGridCardView.kt index 413829c7..a5d95f13 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingGridCardView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingGridCardView.kt @@ -123,6 +123,7 @@ open class ContentRankingGridCardView @JvmOverloads constructor( requireNotNull(rankText).apply { textSize = 54f layoutParams = LayoutParams((55 * scale).roundToInt(), (75 * scale).roundToInt()) + setPadding(0, 0, 0, (6 * scale).roundToInt()) } requireNotNull(titleText).textSize = 22f placeDelta(left = 10, top = 70, scale = scale) @@ -136,6 +137,7 @@ open class ContentRankingGridCardView @JvmOverloads constructor( layoutParams = LayoutParams((42 * scale).roundToInt(), (56 * scale).roundToInt()).apply { leftMargin = (8 * scale).roundToInt() } + setPadding(0, 0, 0, (5 * scale).roundToInt()) } requireNotNull(titleText).textSize = 14f placeDelta(left = 10, top = 49, scale = scale) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingHorizontalCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingHorizontalCardView.kt index 3c6dd3dc..a900761a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingHorizontalCardView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingHorizontalCardView.kt @@ -122,6 +122,11 @@ class ContentRankingHorizontalCardView @JvmOverloads constructor( leftMargin = (14 * scale).roundToInt() topMargin = (14 * scale).roundToInt() } + requireNotNull(rankText).layoutParams = android.widget.LinearLayout.LayoutParams( + (48 * scale).roundToInt(), + (52 * scale).roundToInt() + ) + requireNotNull(rankText).setPadding(0, 0, 0, (4 * scale).roundToInt()) requireNotNull(rankText).applyContentRankingRankGradient() imageView().layoutParams = LayoutParams((80 * scale).roundToInt(), (80 * scale).roundToInt()).apply { leftMargin = (77 * scale).roundToInt() diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingLargeCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingLargeCardView.kt index bbbac0a2..000e5259 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingLargeCardView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingLargeCardView.kt @@ -120,6 +120,7 @@ class ContentRankingLargeCardView @JvmOverloads constructor( private fun positionViews(size: ContentRankingCardSize) { val scale = size.widthPx / FIGMA_WIDTH.toFloat() requireNotNull(rankText).layoutParams = LayoutParams((91 * scale).roundToInt(), (114 * scale).roundToInt()) + requireNotNull(rankText).setPadding(0, 0, 0, (10 * scale).roundToInt()) contentImageView().layoutParams = LayoutParams((155 * scale).roundToInt(), (154 * scale).roundToInt()).apply { leftMargin = ((size.widthPx - (155 * scale)) / 2f).roundToInt() topMargin = (14 * scale).roundToInt() diff --git a/app/src/main/res/layout/view_content_ranking_grid_card_content.xml b/app/src/main/res/layout/view_content_ranking_grid_card_content.xml index eacca7ea..76f4de2b 100644 --- a/app/src/main/res/layout/view_content_ranking_grid_card_content.xml +++ b/app/src/main/res/layout/view_content_ranking_grid_card_content.xml @@ -21,6 +21,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/pattaya_regular" + android:gravity="center" android:includeFontPadding="false" android:shadowColor="#7A000000" android:shadowRadius="4" diff --git a/app/src/main/res/layout/view_content_ranking_horizontal_card.xml b/app/src/main/res/layout/view_content_ranking_horizontal_card.xml index 3f1a157e..ed373487 100644 --- a/app/src/main/res/layout/view_content_ranking_horizontal_card.xml +++ b/app/src/main/res/layout/view_content_ranking_horizontal_card.xml @@ -16,6 +16,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/pattaya_regular" + android:gravity="center" android:includeFontPadding="false" android:shadowColor="#7A000000" android:shadowRadius="4" diff --git a/app/src/main/res/layout/view_content_ranking_large_card.xml b/app/src/main/res/layout/view_content_ranking_large_card.xml index 20696f35..6c6f4759 100644 --- a/app/src/main/res/layout/view_content_ranking_large_card.xml +++ b/app/src/main/res/layout/view_content_ranking_large_card.xml @@ -29,6 +29,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/pattaya_regular" + android:gravity="center" android:includeFontPadding="false" android:shadowColor="#7A000000" android:shadowRadius="4" diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingCardViewTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingCardViewTest.kt index 08634a23..44b68df5 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingCardViewTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/widget/contentranking/ContentRankingCardViewTest.kt @@ -2,8 +2,11 @@ package kr.co.vividnext.sodalive.v2.widget.contentranking import android.app.Application import android.content.Context +import android.view.Gravity import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.TextView import androidx.test.core.app.ApplicationProvider import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.v2.widget.ranking.RankingChangeType.Increase @@ -17,6 +20,77 @@ import org.robolectric.annotation.Config @Config(sdk = [28], application = Application::class) class ContentRankingCardViewTest { + @Test + fun `large card 순위 숫자는 폰트 padding 없이 하단 보정 padding을 가진다`() { + val view = inflateView(R.layout.view_content_ranking_large_card) + + view.setCardSize(ContentRankingCardSize(widthPx = 374, heightPx = 268)) + + assertRankTextBox( + view = view.findViewById(R.id.tv_content_ranking_rank), + expectedWidth = 91, + expectedHeight = 114, + expectedLeft = 0, + expectedTop = 0, + expectedBottomPadding = 10 + ) + } + + @Test + fun `medium grid card 순위 숫자는 폰트 padding 없이 하단 보정 padding을 가진다`() { + val view = inflateView(R.layout.view_content_ranking_medium_grid_card) + + view.setCardSize(ContentRankingCardSize(widthPx = 185, heightPx = 185)) + + assertRankTextBox( + view = view.findViewById(R.id.tv_content_ranking_rank), + expectedWidth = 55, + expectedHeight = 75, + expectedLeft = 0, + expectedTop = 0, + expectedBottomPadding = 6 + ) + } + + @Test + fun `small grid card 순위 숫자는 폰트 padding 없이 하단 보정 padding을 가진다`() { + val view = inflateView(R.layout.view_content_ranking_small_grid_card) + + view.setCardSize(ContentRankingCardSize(widthPx = 122, heightPx = 122)) + + assertRankTextBox( + view = view.findViewById(R.id.tv_content_ranking_rank), + expectedWidth = 42, + expectedHeight = 56, + expectedLeft = 8, + expectedTop = 0, + expectedBottomPadding = 5 + ) + } + + @Test + fun `horizontal card 순위 숫자는 폰트 padding 없이 하단 보정 padding을 가진다`() { + val view = inflateView(R.layout.view_content_ranking_horizontal_card) + + view.setCardSize(ContentRankingCardSize(widthPx = 374, heightPx = 100)) + + val rankGroup = view.findViewById(R.id.ll_content_ranking_rank_group) + val rankGroupParams = rankGroup.layoutParams as ViewGroup.MarginLayoutParams + assertEquals(49, rankGroupParams.width) + assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, rankGroupParams.height) + assertEquals(14, rankGroupParams.leftMargin) + assertEquals(14, rankGroupParams.topMargin) + + assertRankTextBox( + view = view.findViewById(R.id.tv_content_ranking_rank), + expectedWidth = 48, + expectedHeight = 52, + expectedLeft = 0, + expectedTop = 0, + expectedBottomPadding = 4 + ) + } + @Test fun `large card는 showRankChange가 false이면 rank num을 숨긴다`() { val view = inflateView(R.layout.view_content_ranking_large_card) @@ -67,6 +141,24 @@ class ContentRankingCardViewTest { return LayoutInflater.from(context).inflate(layoutResId, null, false) as T } + private fun assertRankTextBox( + view: TextView, + expectedWidth: Int, + expectedHeight: Int, + expectedLeft: Int, + expectedTop: Int, + expectedBottomPadding: Int + ) { + val params = view.layoutParams as ViewGroup.MarginLayoutParams + assertEquals(expectedWidth, params.width) + assertEquals(expectedHeight, params.height) + assertEquals(expectedLeft, params.leftMargin) + assertEquals(expectedTop, params.topMargin) + assertEquals(Gravity.CENTER, view.gravity) + assertEquals(false, view.includeFontPadding) + assertEquals(expectedBottomPadding, view.paddingBottom) + } + private fun sampleItem( rank: Int = 1, showRankChange: Boolean = true