From edb7d98de7ae23623cfdcbced2fb1352d0bbf153 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 15 Jun 2026 15:01:21 +0900 Subject: [PATCH] =?UTF-8?q?feat(creator):=20=EC=B1=84=EB=84=90=20=ED=99=88?= =?UTF-8?q?=20=EC=98=A4=EB=94=94=EC=98=A4=20=EC=BD=98=ED=85=90=EC=B8=A0=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorChannelHomeAudioContentCardView.kt | 53 +++++++++ ...tem_creator_channel_home_audio_content.xml | 111 ++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeAudioContentCardView.kt create mode 100644 app/src/main/res/layout/item_creator_channel_home_audio_content.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeAudioContentCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeAudioContentCardView.kt new file mode 100644 index 00000000..5d92397f --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeAudioContentCardView.kt @@ -0,0 +1,53 @@ +package kr.co.vividnext.sodalive.v2.creator.channel.ui + +import android.content.Context +import android.graphics.Outline +import android.util.AttributeSet +import android.view.View +import android.view.ViewOutlineProvider +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.TextView +import androidx.core.view.isVisible +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelAudioContentResponse + +class CreatorChannelHomeAudioContentCardView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr) { + + private val thumbnailContainer: View by lazy { findViewById(R.id.layout_audio_content_thumbnail) } + private val thumbnail: ImageView by lazy { findViewById(R.id.iv_audio_content_thumbnail) } + private val originalTag: ImageView by lazy { findViewById(R.id.iv_audio_content_original_tag) } + private val pointTag: ImageView by lazy { findViewById(R.id.iv_audio_content_point_tag) } + private val firstTag: ImageView by lazy { findViewById(R.id.iv_audio_content_first_tag) } + private val freeTag: TextView by lazy { findViewById(R.id.tv_audio_content_free_tag) } + private val title: TextView by lazy { findViewById(R.id.tv_audio_content_title) } + private val secondary: TextView by lazy { findViewById(R.id.tv_audio_content_secondary) } + + override fun onFinishInflate() { + super.onFinishInflate() + thumbnailContainer.clipToOutline = true + thumbnailContainer.outlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, outline: Outline) { + outline.setRoundRect(0, 0, view.width, view.height, resources.getDimension(R.dimen.radius_14)) + } + } + } + + fun bind(audioContent: CreatorChannelAudioContentResponse) { + title.text = audioContent.title + secondary.text = listOfNotNull(audioContent.duration, audioContent.seriesName).joinToCreatorChannelAudioText() + thumbnail.loadUrl(audioContent.imageUrl) + originalTag.isVisible = audioContent.isOriginalSeries == true + pointTag.isVisible = audioContent.isPointAvailable + firstTag.isVisible = audioContent.isFirstContent + freeTag.isVisible = audioContent.price <= 0 + } + + private fun List.joinToCreatorChannelAudioText(): String = + filterNot { it.isNullOrBlank() }.joinToString(separator = " • ") { it.orEmpty() } +} diff --git a/app/src/main/res/layout/item_creator_channel_home_audio_content.xml b/app/src/main/res/layout/item_creator_channel_home_audio_content.xml new file mode 100644 index 00000000..03a6248a --- /dev/null +++ b/app/src/main/res/layout/item_creator_channel_home_audio_content.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +