refactor(mypage): 기능 버튼 렌더링 책임을 분리한다

This commit is contained in:
2026-04-02 12:22:08 +09:00
parent 8d8d5e340f
commit 336d411627
4 changed files with 89 additions and 50 deletions

View File

@@ -4,12 +4,9 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Rect
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.URLUtil
import android.widget.Toast
import androidx.annotation.DrawableRes
import androidx.core.net.toUri
import androidx.media3.common.util.UnstableApi
import androidx.recyclerview.widget.GridLayoutManager
@@ -23,13 +20,11 @@ import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.FunctionButtonHelper
import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder
import kr.co.vividnext.sodalive.databinding.FragmentMyBinding
import kr.co.vividnext.sodalive.databinding.ItemFunctionButtonBinding
import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.extensions.moneyFormat
@@ -42,6 +37,8 @@ import kr.co.vividnext.sodalive.mypage.block.BlockMemberActivity
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
import kr.co.vividnext.sodalive.mypage.can.coupon.CanCouponActivity
import kr.co.vividnext.sodalive.mypage.can.status.CanStatusActivity
import kr.co.vividnext.sodalive.mypage.function_button.FunctionButtonAdapter
import kr.co.vividnext.sodalive.mypage.function_button.FunctionButtonItem
import kr.co.vividnext.sodalive.mypage.point.PointStatusActivity
import kr.co.vividnext.sodalive.mypage.profile.ProfileUpdateActivity
import kr.co.vividnext.sodalive.mypage.recent.RecentContentAdapter
@@ -350,7 +347,12 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
}
private fun updateFunctionButtons(isAuth: Boolean? = null) {
functionButtonAdapter.submitList(buildFunctionButtonItems(isAuth))
}
private fun buildFunctionButtonItems(isAuth: Boolean?): List<FunctionButtonItem> {
val isKoreanUser = SharedPreferenceManager.countryCode.ifBlank { "KR" } == "KR"
val items = mutableListOf(
FunctionButtonItem(
iconRes = R.drawable.ic_my_storage,
@@ -468,7 +470,7 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
}
}
functionButtonAdapter.submitList(items)
return items
}
private fun showAuthDialog() {
@@ -497,47 +499,3 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
}
}
}
private data class FunctionButtonItem(
@field:DrawableRes val iconRes: Int,
val title: String,
val onClick: () -> Unit
)
private class FunctionButtonAdapter : RecyclerView.Adapter<FunctionButtonAdapter.ViewHolder>() {
private val items = mutableListOf<FunctionButtonItem>()
inner class ViewHolder(
private val binding: ItemFunctionButtonBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: FunctionButtonItem) {
FunctionButtonHelper.setupFunctionButton(
buttonView = binding.root,
iconRes = item.iconRes,
title = item.title,
clickListener = View.OnClickListener { item.onClick() }
)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
ItemFunctionButtonBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount() = items.size
@SuppressLint("NotifyDataSetChanged")
fun submitList(newItems: List<FunctionButtonItem>) {
items.clear()
items.addAll(newItems)
notifyDataSetChanged()
}
}

View File

@@ -0,0 +1,47 @@
package kr.co.vividnext.sodalive.mypage.function_button
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.common.FunctionButtonHelper
import kr.co.vividnext.sodalive.databinding.ItemFunctionButtonBinding
class FunctionButtonAdapter : RecyclerView.Adapter<FunctionButtonAdapter.ViewHolder>() {
private val items = mutableListOf<FunctionButtonItem>()
inner class ViewHolder(
private val binding: ItemFunctionButtonBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: FunctionButtonItem) {
FunctionButtonHelper.setupFunctionButton(
buttonView = binding.root,
iconRes = item.iconRes,
title = item.title,
clickListener = View.OnClickListener { item.onClick() }
)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
ItemFunctionButtonBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount() = items.size
@SuppressLint("NotifyDataSetChanged")
fun submitList(newItems: List<FunctionButtonItem>) {
items.clear()
items.addAll(newItems)
notifyDataSetChanged()
}
}

View File

@@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.mypage.function_button
import androidx.annotation.DrawableRes
data class FunctionButtonItem(
@param:DrawableRes val iconRes: Int,
val title: String,
val onClick: () -> Unit
)