From 9a8231c2b6ecdfc396eda46e5d2eecaf19059e51 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 2 Jun 2026 16:34:16 +0900 Subject: [PATCH] =?UTF-8?q?refactor(home):=20=ED=99=88=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20adapter=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/main/home/ui/HomeAiCharacterAdapter.kt | 45 +++ .../v2/main/home/ui/HomeBannerBinder.kt | 37 +++ .../main/home/ui/HomeCheerCreatorAdapter.kt | 3 + .../main/home/ui/HomeCreatorProfileAdapter.kt | 42 +++ .../v2/main/home/ui/HomeFirstAudioAdapter.kt | 46 +++ .../main/home/ui/HomeFollowAllButtonBinder.kt | 30 ++ .../main/home/ui/HomeGenreCreatorAdapter.kt | 3 + .../v2/main/home/ui/HomeLiveAdapter.kt | 57 ++++ .../v2/main/home/ui/HomePhase6Adapters.kt | 313 ------------------ .../ui/HomeRecentActivityCreatorAdapter.kt | 52 +++ .../home/ui/HomeRecentDebutCreatorAdapter.kt | 42 +++ .../home/ui/HomeRecyclerItemLayoutParams.kt | 12 + 12 files changed, 369 insertions(+), 313 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeAiCharacterAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeBannerBinder.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCheerCreatorAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCreatorProfileAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFirstAudioAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFollowAllButtonBinder.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeGenreCreatorAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeLiveAdapter.kt delete mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomePhase6Adapters.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentActivityCreatorAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentDebutCreatorAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecyclerItemLayoutParams.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeAiCharacterAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeAiCharacterAdapter.kt new file mode 100644 index 00000000..cad31d71 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeAiCharacterAdapter.kt @@ -0,0 +1,45 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationAiCharacterUiModel +import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem +import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailView + +class HomeAiCharacterAdapter : RecyclerView.Adapter() { + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CharacterViewHolder { + val view = LayoutInflater.from(parent.context).inflate( + R.layout.view_character_chat_thumbnail, + parent, + false + ) as CharacterChatThumbnailView + view.layoutParams = recyclerItemLayoutParams(parent) + return CharacterViewHolder(view) + } + + override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) { + holder.bind(items[position].item) + } + + override fun getItemCount(): Int = items.size + + class CharacterViewHolder( + private val view: CharacterChatThumbnailView + ) : RecyclerView.ViewHolder(view) { + fun bind(item: CharacterChatThumbnailItem) { + view.bind(item) + view.imageView().loadUrl(item.imageUrl) + view.setOnCharacterClick(null) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeBannerBinder.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeBannerBinder.kt new file mode 100644 index 00000000..f5aecf11 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeBannerBinder.kt @@ -0,0 +1,37 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerSection +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel +import kr.co.vividnext.sodalive.v2.widget.banner.BannerItem +import kr.co.vividnext.sodalive.v2.widget.banner.BannerView + +class HomeBannerBinder( + private val bannerView: BannerView +) { + private var sourceItems: List = emptyList() + private var onBannerClick: ((HomeRecommendationBannerUiModel) -> Unit)? = null + + init { + bannerView.setOnBindBannerImage { imageView, item -> imageView.loadUrl(item.imageUrl) } + bannerView.setOnBannerClickListener { bannerItem -> + sourceItems.firstOrNull { it.bannerId == bannerItem.bannerId }?.let { onBannerClick?.invoke(it) } + } + } + + fun setOnBannerClick(listener: ((HomeRecommendationBannerUiModel) -> Unit)?) { + onBannerClick = listener + } + + fun bind(section: HomeRecommendationBannerSection) { + sourceItems = section.items + bannerView.setItems( + section.items.map { item -> + BannerItem( + bannerId = item.bannerId, + imageUrl = item.imageUrl.orEmpty() + ) + } + ) + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCheerCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCheerCreatorAdapter.kt new file mode 100644 index 00000000..a9f57b16 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCheerCreatorAdapter.kt @@ -0,0 +1,3 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +class HomeCheerCreatorAdapter : HomeCreatorProfileAdapter() diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCreatorProfileAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCreatorProfileAdapter.kt new file mode 100644 index 00000000..050aab26 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeCreatorProfileAdapter.kt @@ -0,0 +1,42 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCreatorUiModel + +open class HomeCreatorProfileAdapter : RecyclerView.Adapter() { + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_creator_profile, parent, false) + view.layoutParams = recyclerItemLayoutParams(parent) + return CreatorViewHolder(view) + } + + override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val profileImage = itemView.findViewById(R.id.iv_home_creator_profile) + private val nicknameText = itemView.findViewById(R.id.tv_home_creator_profile_nickname) + + fun bind(item: HomeRecommendationCreatorUiModel) { + profileImage.loadUrl(item.profileImage) + nicknameText.text = item.nickname + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFirstAudioAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFirstAudioAdapter.kt new file mode 100644 index 00000000..9ee48c36 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFirstAudioAdapter.kt @@ -0,0 +1,46 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationFirstAudioContentUiModel +import kr.co.vividnext.sodalive.v2.widget.AudioContentCardSize +import kr.co.vividnext.sodalive.v2.widget.AudioContentCardView + +class HomeFirstAudioAdapter : RecyclerView.Adapter() { + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioViewHolder { + val view = LayoutInflater.from(parent.context).inflate( + R.layout.view_audio_content_card, + parent, + false + ) as AudioContentCardView + view.layoutParams = recyclerItemLayoutParams(parent) + return AudioViewHolder(view) + } + + override fun onBindViewHolder(holder: AudioViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + class AudioViewHolder( + private val view: AudioContentCardView + ) : RecyclerView.ViewHolder(view) { + fun bind(item: HomeRecommendationFirstAudioContentUiModel) { + view.setSize(AudioContentCardSize.Medium) + view.setContent(item.title, item.creatorNickname) + view.thumbnailView().loadUrl(item.coverImage) + view.setTags(item.tags) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFollowAllButtonBinder.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFollowAllButtonBinder.kt new file mode 100644 index 00000000..6290462a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeFollowAllButtonBinder.kt @@ -0,0 +1,30 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import kr.co.vividnext.sodalive.R + +object HomeFollowAllButtonBinder { + fun bind( + view: View, + creatorIds: List, + isFollowCompleted: Boolean, + onClick: (List) -> Unit + ) { + val icon = view.findViewById(R.id.iv_home_follow_all_icon) + val text = view.findViewById(R.id.tv_home_follow_all) + icon.setImageResource(if (isFollowCompleted) R.drawable.ic_new_following else R.drawable.ic_new_follow) + text.setText( + if (isFollowCompleted) { + R.string.home_recommendation_follow_all_done + } else { + R.string.home_recommendation_follow_all + } + ) + view.isEnabled = !isFollowCompleted + view.setOnClickListener { + if (creatorIds.isNotEmpty()) onClick(creatorIds) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeGenreCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeGenreCreatorAdapter.kt new file mode 100644 index 00000000..ccac62cd --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeGenreCreatorAdapter.kt @@ -0,0 +1,3 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +class HomeGenreCreatorAdapter : HomeCreatorProfileAdapter() diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeLiveAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeLiveAdapter.kt new file mode 100644 index 00000000..8f87e7cb --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeLiveAdapter.kt @@ -0,0 +1,57 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveUiModel +import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailItem +import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailSimpleView + +class HomeLiveAdapter : RecyclerView.Adapter() { + private var items: List = emptyList() + private var onClick: ((HomeRecommendationLiveUiModel) -> Unit)? = null + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + fun setOnLiveClick(listener: ((HomeRecommendationLiveUiModel) -> Unit)?) { + onClick = listener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LiveViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.view_live_thumbnail_simple, parent, false) + view.layoutParams = recyclerItemLayoutParams(parent) + return LiveViewHolder(view as LiveThumbnailSimpleView) + } + + override fun onBindViewHolder(holder: LiveViewHolder, position: Int) { + holder.bind(items[position], onClick) + } + + override fun getItemCount(): Int = items.size + + class LiveViewHolder( + private val view: LiveThumbnailSimpleView + ) : RecyclerView.ViewHolder(view) { + fun bind( + item: HomeRecommendationLiveUiModel, + onClick: ((HomeRecommendationLiveUiModel) -> Unit)? + ) { + val thumbnailItem = LiveThumbnailItem( + liveId = item.liveId, + creatorId = item.creatorId, + imageUrl = item.imageUrl.orEmpty(), + title = item.title, + creatorName = item.creatorNickname, + liveStartTimeText = item.beginDateTime.orEmpty() + ) + view.bind(thumbnailItem) + view.imageView().loadUrl(item.imageUrl) + view.setOnLiveThumbnailClick(if (onClick == null) null else { _: LiveThumbnailItem -> onClick.invoke(item) }) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomePhase6Adapters.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomePhase6Adapters.kt deleted file mode 100644 index 31150dfc..00000000 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomePhase6Adapters.kt +++ /dev/null @@ -1,313 +0,0 @@ -package kr.co.vividnext.sodalive.v2.main.home.ui - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import kr.co.vividnext.sodalive.R -import kr.co.vividnext.sodalive.extensions.loadUrl -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationAiCharacterUiModel -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerSection -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCreatorUiModel -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationFirstAudioContentUiModel -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveUiModel -import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorUiModel -import kr.co.vividnext.sodalive.v2.widget.AudioContentCardSize -import kr.co.vividnext.sodalive.v2.widget.AudioContentCardView -import kr.co.vividnext.sodalive.v2.widget.banner.BannerItem -import kr.co.vividnext.sodalive.v2.widget.banner.BannerView -import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem -import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailView -import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailItem -import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailSimpleView - -class HomeLiveAdapter : RecyclerView.Adapter() { - private var items: List = emptyList() - private var onClick: ((HomeRecommendationLiveUiModel) -> Unit)? = null - - fun submitItems(items: List) { - this.items = items - notifyDataSetChanged() - } - - fun setOnLiveClick(listener: ((HomeRecommendationLiveUiModel) -> Unit)?) { - onClick = listener - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LiveViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.view_live_thumbnail_simple, parent, false) - view.layoutParams = RecyclerView.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ).apply { marginEnd = parent.resources.getDimensionPixelSize(R.dimen.spacing_12) } - return LiveViewHolder(view as LiveThumbnailSimpleView) - } - - override fun onBindViewHolder(holder: LiveViewHolder, position: Int) { - holder.bind(items[position], onClick) - } - - override fun getItemCount(): Int = items.size - - class LiveViewHolder( - private val view: LiveThumbnailSimpleView - ) : RecyclerView.ViewHolder(view) { - fun bind( - item: HomeRecommendationLiveUiModel, - onClick: ((HomeRecommendationLiveUiModel) -> Unit)? - ) { - val thumbnailItem = LiveThumbnailItem( - liveId = item.liveId, - creatorId = item.creatorId, - imageUrl = item.imageUrl.orEmpty(), - title = item.title, - creatorName = item.creatorNickname, - liveStartTimeText = item.beginDateTime.orEmpty() - ) - view.bind(thumbnailItem) - view.imageView().loadUrl(item.imageUrl) - view.setOnLiveThumbnailClick(if (onClick == null) null else { _: LiveThumbnailItem -> onClick.invoke(item) }) - } - } -} - -class HomeBannerBinder( - private val bannerView: BannerView -) { - private var sourceItems: List = emptyList() - private var onBannerClick: ((kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel) -> Unit)? = null - - init { - bannerView.setOnBindBannerImage { imageView, item -> imageView.loadUrl(item.imageUrl) } - bannerView.setOnBannerClickListener { bannerItem -> - sourceItems.firstOrNull { it.bannerId == bannerItem.bannerId }?.let { onBannerClick?.invoke(it) } - } - } - - fun setOnBannerClick(listener: ((kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel) -> Unit)?) { - onBannerClick = listener - } - - fun bind(section: HomeRecommendationBannerSection) { - sourceItems = section.items - bannerView.setItems( - section.items.map { item -> - BannerItem( - bannerId = item.bannerId, - imageUrl = item.imageUrl.orEmpty() - ) - } - ) - } -} - -class HomeRecentActivityCreatorAdapter : RecyclerView.Adapter() { - private var items: List = emptyList() - - fun submitItems(items: List) { - this.items = items - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_activity_creator, parent, false) - view.layoutParams = recyclerItemLayoutParams(parent) - return CreatorViewHolder(view) - } - - override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) { - holder.bind(items[position]) - } - - override fun getItemCount(): Int = items.size - - class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val profileImage = itemView.findViewById(R.id.iv_home_recent_activity_creator_profile) - private val activityTypeText = itemView.findViewById(R.id.tv_home_recent_activity_type) - private val titleText = itemView.findViewById(R.id.tv_home_recent_activity_title) - private val nicknameText = itemView.findViewById(R.id.tv_home_recent_activity_nickname) - - fun bind(item: HomeRecommendationRecentlyActiveCreatorUiModel) { - profileImage.loadUrl(item.profileImage) - item.activityLabelResId?.let { labelResId -> - activityTypeText.setText(labelResId) - activityTypeText.visibility = View.VISIBLE - } ?: run { - activityTypeText.visibility = View.GONE - } - titleText.text = item.activityAt.orEmpty() - titleText.visibility = if (item.activityAt.isNullOrBlank()) View.GONE else View.VISIBLE - nicknameText.text = item.nickname - } - } -} - -class HomeRecentDebutCreatorAdapter : RecyclerView.Adapter() { - private var items: List = emptyList() - - fun submitItems(items: List) { - this.items = items - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_debut_creator, parent, false) - view.layoutParams = recyclerItemLayoutParams(parent) - return CreatorViewHolder(view) - } - - override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) { - holder.bind(items[position]) - } - - override fun getItemCount(): Int = items.size - - class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val profileImage = itemView.findViewById(R.id.iv_home_recent_debut_creator_profile) - private val nicknameText = itemView.findViewById(R.id.tv_home_recent_debut_creator_nickname) - - fun bind(item: HomeRecommendationCreatorUiModel) { - profileImage.loadUrl(item.profileImage) - nicknameText.text = item.nickname - } - } -} - -class HomeFirstAudioAdapter : RecyclerView.Adapter() { - private var items: List = emptyList() - - fun submitItems(items: List) { - this.items = items - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioViewHolder { - val view = LayoutInflater.from(parent.context).inflate( - R.layout.view_audio_content_card, - parent, - false - ) as AudioContentCardView - view.layoutParams = recyclerItemLayoutParams(parent) - return AudioViewHolder(view) - } - - override fun onBindViewHolder(holder: AudioViewHolder, position: Int) { - holder.bind(items[position]) - } - - override fun getItemCount(): Int = items.size - - class AudioViewHolder( - private val view: AudioContentCardView - ) : RecyclerView.ViewHolder(view) { - fun bind(item: HomeRecommendationFirstAudioContentUiModel) { - view.setSize(AudioContentCardSize.Medium) - view.setContent(item.title, item.creatorNickname) - view.thumbnailView().loadUrl(item.coverImage) - view.setTags(item.tags) - } - } -} - -class HomeAiCharacterAdapter : RecyclerView.Adapter() { - private var items: List = emptyList() - - fun submitItems(items: List) { - this.items = items - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CharacterViewHolder { - val view = LayoutInflater.from(parent.context).inflate( - R.layout.view_character_chat_thumbnail, - parent, - false - ) as CharacterChatThumbnailView - view.layoutParams = recyclerItemLayoutParams(parent) - return CharacterViewHolder(view) - } - - override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) { - holder.bind(items[position].item) - } - - override fun getItemCount(): Int = items.size - - class CharacterViewHolder( - private val view: CharacterChatThumbnailView - ) : RecyclerView.ViewHolder(view) { - fun bind(item: CharacterChatThumbnailItem) { - view.bind(item) - view.imageView().loadUrl(item.imageUrl) - view.setOnCharacterClick(null) - } - } -} - -class HomeGenreCreatorAdapter : HomeCreatorProfileAdapter() - -class HomeCheerCreatorAdapter : HomeCreatorProfileAdapter() - -open class HomeCreatorProfileAdapter : RecyclerView.Adapter() { - private var items: List = emptyList() - - fun submitItems(items: List) { - this.items = items - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_creator_profile, parent, false) - view.layoutParams = recyclerItemLayoutParams(parent) - return CreatorViewHolder(view) - } - - override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) { - holder.bind(items[position]) - } - - override fun getItemCount(): Int = items.size - - class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val profileImage = itemView.findViewById(R.id.iv_home_creator_profile) - private val nicknameText = itemView.findViewById(R.id.tv_home_creator_profile_nickname) - - fun bind(item: HomeRecommendationCreatorUiModel) { - profileImage.loadUrl(item.profileImage) - nicknameText.text = item.nickname - } - } -} - -object HomeFollowAllButtonBinder { - fun bind( - view: View, - creatorIds: List, - isFollowCompleted: Boolean, - onClick: (List) -> Unit - ) { - val icon = view.findViewById(R.id.iv_home_follow_all_icon) - val text = view.findViewById(R.id.tv_home_follow_all) - icon.setImageResource(if (isFollowCompleted) R.drawable.ic_new_following else R.drawable.ic_new_follow) - text.setText( - if (isFollowCompleted) { - R.string.home_recommendation_follow_all_done - } else { - R.string.home_recommendation_follow_all - } - ) - view.isEnabled = !isFollowCompleted - view.setOnClickListener { - if (creatorIds.isNotEmpty()) onClick(creatorIds) - } - } -} - -private fun recyclerItemLayoutParams(parent: ViewGroup): RecyclerView.LayoutParams { - return RecyclerView.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ).apply { marginEnd = parent.resources.getDimensionPixelSize(R.dimen.spacing_12) } -} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentActivityCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentActivityCreatorAdapter.kt new file mode 100644 index 00000000..f9baee60 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentActivityCreatorAdapter.kt @@ -0,0 +1,52 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorUiModel + +class HomeRecentActivityCreatorAdapter : RecyclerView.Adapter() { + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_activity_creator, parent, false) + view.layoutParams = recyclerItemLayoutParams(parent) + return CreatorViewHolder(view) + } + + override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val profileImage = itemView.findViewById(R.id.iv_home_recent_activity_creator_profile) + private val activityTypeText = itemView.findViewById(R.id.tv_home_recent_activity_type) + private val titleText = itemView.findViewById(R.id.tv_home_recent_activity_title) + private val nicknameText = itemView.findViewById(R.id.tv_home_recent_activity_nickname) + + fun bind(item: HomeRecommendationRecentlyActiveCreatorUiModel) { + profileImage.loadUrl(item.profileImage) + item.activityLabelResId?.let { labelResId -> + activityTypeText.setText(labelResId) + activityTypeText.visibility = View.VISIBLE + } ?: run { + activityTypeText.visibility = View.GONE + } + titleText.text = item.activityAt.orEmpty() + titleText.visibility = if (item.activityAt.isNullOrBlank()) View.GONE else View.VISIBLE + nicknameText.text = item.nickname + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentDebutCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentDebutCreatorAdapter.kt new file mode 100644 index 00000000..28cc5763 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecentDebutCreatorAdapter.kt @@ -0,0 +1,42 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCreatorUiModel + +class HomeRecentDebutCreatorAdapter : RecyclerView.Adapter() { + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_debut_creator, parent, false) + view.layoutParams = recyclerItemLayoutParams(parent) + return CreatorViewHolder(view) + } + + override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val profileImage = itemView.findViewById(R.id.iv_home_recent_debut_creator_profile) + private val nicknameText = itemView.findViewById(R.id.tv_home_recent_debut_creator_nickname) + + fun bind(item: HomeRecommendationCreatorUiModel) { + profileImage.loadUrl(item.profileImage) + nicknameText.text = item.nickname + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecyclerItemLayoutParams.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecyclerItemLayoutParams.kt new file mode 100644 index 00000000..2cc40c8d --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/ui/HomeRecyclerItemLayoutParams.kt @@ -0,0 +1,12 @@ +package kr.co.vividnext.sodalive.v2.main.home.ui + +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R + +internal fun recyclerItemLayoutParams(parent: ViewGroup): RecyclerView.LayoutParams { + return RecyclerView.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ).apply { marginEnd = parent.resources.getDimensionPixelSize(R.dimen.spacing_12) } +}