From 4629ef00a96418cdc29aa8afd2f241e644f51ad4 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 2 Jun 2026 19:34:19 +0900 Subject: [PATCH] =?UTF-8?q?fix(widget):=20=EC=BA=90=EB=A6=AD=ED=84=B0=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20clipping?= =?UTF-8?q?=EC=9D=84=20Kotlin=EC=97=90=EC=84=9C=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CharacterChatThumbnailView.kt | 13 +++++----- .../layout/view_character_chat_thumbnail.xml | 3 +-- .../CharacterChatThumbnailViewTest.kt | 26 +++++++++++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/characterchatthumbnail/CharacterChatThumbnailView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/characterchatthumbnail/CharacterChatThumbnailView.kt index e948add8..8d3a4bbd 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/characterchatthumbnail/CharacterChatThumbnailView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/characterchatthumbnail/CharacterChatThumbnailView.kt @@ -33,8 +33,7 @@ class CharacterChatThumbnailView @JvmOverloads constructor( characterNameText = findViewById(R.id.tv_character_chat_name) characterDescriptionText = findViewById(R.id.tv_character_chat_description) originalTitleText = findViewById(R.id.tv_character_chat_original_title) - clipToOutline = true - outlineProvider = roundedCardOutlineProvider() + setCardOutline() } fun bind(item: CharacterChatThumbnailItem) { @@ -63,10 +62,12 @@ class CharacterChatThumbnailView @JvmOverloads constructor( isClickable = listener != null } - private fun roundedCardOutlineProvider() = object : ViewOutlineProvider() { - override fun getOutline(view: View, outline: Outline) { - val radius = resources.getDimension(R.dimen.radius_14) - outline.setRoundRect(0, 0, view.width, view.height, radius) + private fun setCardOutline() { + clipToOutline = true + outlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, outline: Outline) { + outline.setRoundRect(0, 0, view.width, view.height, resources.getDimension(R.dimen.radius_14)) + } } } } diff --git a/app/src/main/res/layout/view_character_chat_thumbnail.xml b/app/src/main/res/layout/view_character_chat_thumbnail.xml index 3ed5669c..20203025 100644 --- a/app/src/main/res/layout/view_character_chat_thumbnail.xml +++ b/app/src/main/res/layout/view_character_chat_thumbnail.xml @@ -3,8 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="185dp" android:layout_height="wrap_content" - android:background="@drawable/bg_character_chat_thumbnail" - android:clipToOutline="true"> + android:background="@drawable/bg_character_chat_thumbnail"> (R.id.iv_character_chat_thumbnail_image), view.imageView()) } + @Test + @Config(sdk = [23]) + fun `card clipping is configured from Kotlin outline provider`() { + val view = inflateView() + + assertTrue(view.clipToOutline) + assertNotNull(view.outlineProvider) + } + + @Test + fun `layout does not declare xml clipToOutline`() { + val context = ApplicationProvider.getApplicationContext() + val parser = context.resources.getXml(R.layout.view_character_chat_thumbnail) + while (parser.eventType != org.xmlpull.v1.XmlPullParser.START_TAG) { + parser.next() + } + + val hasClipToOutline = (0 until parser.attributeCount).any { index -> + parser.getAttributeName(index) == "clipToOutline" + } + + assertFalse(hasClipToOutline) + } + @Test fun `setOnCharacterClick invokes listener with bound item`() { val view = inflateView()