diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/GetExplorerResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/GetExplorerResponse.kt index 9d9ce5a6..aedc1d6e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/explorer/GetExplorerResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/GetExplorerResponse.kt @@ -22,5 +22,6 @@ data class GetExplorerSectionCreatorResponse( @SerializedName("id") val id: Long, @SerializedName("nickname") val nickname: String, @SerializedName("tags") val tags: String, - @SerializedName("profileImageUrl") val profileImageUrl: String + @SerializedName("profileImageUrl") val profileImageUrl: String, + @SerializedName("followerCount") val followerCount: Int ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/CreatorRankingAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/CreatorRankingAdapter.kt new file mode 100644 index 00000000..a4e74611 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/CreatorRankingAdapter.kt @@ -0,0 +1,86 @@ +package kr.co.vividnext.sodalive.home + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CircleCrop +import com.bumptech.glide.request.RequestOptions +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.ItemHomeCreatorBinding +import kr.co.vividnext.sodalive.explorer.GetExplorerSectionCreatorResponse +import kr.co.vividnext.sodalive.extensions.moneyFormat + +class CreatorRankingAdapter( + private val onClickItem: (Long) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + inner class ViewHolder( + private val context: Context, + private val binding: ItemHomeCreatorBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetExplorerSectionCreatorResponse, index: Int) { + binding.root.setOnClickListener { onClickItem(item.id) } + + Glide + .with(context) + .load(item.profileImageUrl) + .apply( + RequestOptions().transform( + CircleCrop() + ) + ) + .into(binding.ivProfile) + + binding.tvNickname.text = item.nickname + binding.tvFollower.text = item.followerCount.moneyFormat() + + when (index) { + 0 -> { + binding.ivCrown.setImageResource(R.drawable.rank1) + binding.ivCrown.visibility = View.VISIBLE + } + + 1 -> { + binding.ivCrown.setImageResource(R.drawable.rank2) + binding.ivCrown.visibility = View.VISIBLE + } + + 2 -> { + binding.ivCrown.setImageResource(R.drawable.rank3) + binding.ivCrown.visibility = View.VISIBLE + } + + else -> { + binding.ivCrown.visibility = View.GONE + } + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + parent.context, + ItemHomeCreatorBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position], index = position) + } + + override fun getItemCount() = items.size + + @SuppressLint("NotifyDataSetChanged") + fun addItems(items: List) { + this.items.addAll(items) + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt index e8204967..69886b91 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt @@ -26,6 +26,7 @@ import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentHomeBinding +import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.live.LiveViewModel import kr.co.vividnext.sodalive.live.room.LiveRoomActivity @@ -40,6 +41,7 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +@OptIn(UnstableApi::class) class HomeFragment : BaseFragment(FragmentHomeBinding::inflate) { private val viewModel: HomeViewModel by inject() private val liveViewModel: LiveViewModel by inject() @@ -47,6 +49,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl private lateinit var loadingDialog: LoadingDialog private lateinit var liveAdapter: HomeLiveAdapter + private lateinit var creatorRankingAdapter: CreatorRankingAdapter private val handler = Handler(Looper.getMainLooper()) @@ -133,9 +136,10 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl } setupLiveView() + setupSectionCreator() + setupLatestContent() } - @OptIn(UnstableApi::class) private fun setupLiveView() { val spSectionTitle = SpannableString(binding.tvLiveTitle.text) spSectionTitle.setSpan( @@ -191,17 +195,17 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl when (parent.getChildAdapterPosition(view)) { 0 -> { outRect.left = 0 - outRect.right = 16f.dpToPx().toInt() + outRect.right = 8f.dpToPx().toInt() } liveAdapter.itemCount - 1 -> { - outRect.left = 16f.dpToPx().toInt() + outRect.left = 8f.dpToPx().toInt() outRect.right = 0 } else -> { - outRect.left = 16f.dpToPx().toInt() - outRect.right = 16f.dpToPx().toInt() + outRect.left = 8f.dpToPx().toInt() + outRect.right = 8f.dpToPx().toInt() } } } @@ -219,6 +223,87 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl } } + fun setupSectionCreator() { + val spSectionTitle = SpannableString(binding.tvFamousCreatorTitle.text) + spSectionTitle.setSpan( + ForegroundColorSpan( + ContextCompat.getColor( + requireContext(), + R.color.color_3bb9f1 + ) + ), + 0, + 2, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + binding.tvFamousCreatorTitle.text = spSectionTitle + + creatorRankingAdapter = CreatorRankingAdapter { + if (SharedPreferenceManager.token.isNotBlank()) { + startActivity( + Intent( + requireActivity(), + UserProfileActivity::class.java + ).apply { + putExtra(Constants.EXTRA_USER_ID, it) + } + ) + } else { + (requireActivity() as MainActivity).showLoginActivity() + } + } + + val recyclerView = binding.rvFamousCreator + recyclerView.layoutManager = LinearLayoutManager( + context, + LinearLayoutManager.HORIZONTAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.left = 0 + outRect.right = 8f.dpToPx().toInt() + } + + creatorRankingAdapter.itemCount - 1 -> { + outRect.left = 8f.dpToPx().toInt() + outRect.right = 0 + } + + else -> { + outRect.left = 8f.dpToPx().toInt() + outRect.right = 8f.dpToPx().toInt() + } + } + } + }) + + recyclerView.adapter = creatorRankingAdapter + + viewModel.creatorRankingLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.llFamousCreator.visibility = View.VISIBLE + creatorRankingAdapter.addItems(it) + } else { + binding.llFamousCreator.visibility = View.GONE + } + } + } + + private fun setupLatestContent() { + + } + private fun bindData() { viewModel.isLoading.observe(viewLifecycleOwner) { if (it) { diff --git a/app/src/main/res/drawable-mdpi/rank1.png b/app/src/main/res/drawable-mdpi/rank1.png new file mode 100644 index 00000000..84be27e1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/rank1.png differ diff --git a/app/src/main/res/drawable-mdpi/rank2.png b/app/src/main/res/drawable-mdpi/rank2.png new file mode 100644 index 00000000..8cd5c37b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/rank2.png differ diff --git a/app/src/main/res/drawable-mdpi/rank3.png b/app/src/main/res/drawable-mdpi/rank3.png new file mode 100644 index 00000000..f40761dd Binary files /dev/null and b/app/src/main/res/drawable-mdpi/rank3.png differ diff --git a/app/src/main/res/drawable/bg_home_creator.xml b/app/src/main/res/drawable/bg_home_creator.xml new file mode 100644 index 00000000..5ad41476 --- /dev/null +++ b/app/src/main/res/drawable/bg_home_creator.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/layout/item_home_creator.xml b/app/src/main/res/layout/item_home_creator.xml new file mode 100644 index 00000000..fc384b1a --- /dev/null +++ b/app/src/main/res/layout/item_home_creator.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + +