diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt index bf7dff6..5cfc956 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt @@ -16,7 +16,6 @@ import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentCurationRespon import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRanking import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem -import kr.co.vividnext.sodalive.audio_content.main.v2.GetPopularContentByCreatorResponse import kr.co.vividnext.sodalive.audio_content.main.v2.alarm.GetContentMainTabAlarmResponse import kr.co.vividnext.sodalive.audio_content.main.v2.asmr.GetContentMainTabAsmrResponse import kr.co.vividnext.sodalive.audio_content.main.v2.content.GetContentMainTabContentResponse @@ -257,7 +256,7 @@ interface AudioContentApi { fun getPopularContentByCreator( @Query("creatorId") creatorId: Long, @Header("Authorization") authHeader: String - ): Single> + ): Single>> @GET("/v2/audio-content/main/series") fun getContentMainSeries( @@ -313,7 +312,7 @@ interface AudioContentApi { fun getContentMainContentPopularContentByCreator( @Query("creatorId") creatorId: Long, @Header("Authorization") authHeader: String - ): Single> + ): Single>> @GET("/v2/audio-content/main/alarm") fun getContentMainAlarm( @@ -337,7 +336,7 @@ interface AudioContentApi { fun getPopularAsmrContentByCreator( @Query("creatorId") creatorId: Long, @Header("Authorization") authHeader: String - ): Single> + ): Single>> @GET("/v2/audio-content/main/replay") fun getContentMainReplay( @@ -348,7 +347,7 @@ interface AudioContentApi { fun getPopularReplayContentByCreator( @Query("creatorId") creatorId: Long, @Header("Authorization") authHeader: String - ): Single> + ): Single>> @GET("/v2/audio-content/main/free") fun getContentMainFree( diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/GetPopularContentByCreatorResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/GetPopularContentByCreatorResponse.kt deleted file mode 100644 index c4b376a..0000000 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/GetPopularContentByCreatorResponse.kt +++ /dev/null @@ -1,13 +0,0 @@ -package kr.co.vividnext.sodalive.audio_content.main.v2 - -import androidx.annotation.Keep -import com.google.gson.annotations.SerializedName -import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem - -@Keep -data class GetPopularContentByCreatorResponse( - @SerializedName("salesRankContentList") - val salesRankContentList: List, - @SerializedName("salesCountRankContentList") - val salesCountRankContentList: List -) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/PopularContentByCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/PopularContentByCreatorAdapter.kt new file mode 100644 index 0000000..5b6d50a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/PopularContentByCreatorAdapter.kt @@ -0,0 +1,95 @@ +package kr.co.vividnext.sodalive.audio_content.main.v2 + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.MultiTransformation +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.CircleCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.request.RequestOptions +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem +import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainTabPopularContentBinding +import kr.co.vividnext.sodalive.extensions.dpToPx + +class PopularContentByCreatorAdapter( + private val itemWidth: Int, + private val onClickItem: (Long) -> Unit, + private val onClickCreator: (Long) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + inner class ViewHolder( + private val context: Context, + private val binding: ItemAudioContentMainTabPopularContentBinding + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: GetAudioContentRankingItem) { + val lp = binding.ivCover.layoutParams as LinearLayout.LayoutParams + lp.width = itemWidth + lp.height = itemWidth + binding.ivCover.layoutParams = lp + + Glide + .with(context) + .load(item.coverImageUrl) + .apply( + RequestOptions().transform( + MultiTransformation( + CenterCrop(), + RoundedCorners(5.3f.dpToPx().toInt()) + ) + ) + ) + .placeholder(R.drawable.bg_black) + .into(binding.ivCover) + + Glide + .with(context) + .load(item.creatorProfileImageUrl) + .apply( + RequestOptions().transform( + CircleCrop() + ) + ) + .placeholder(R.drawable.bg_black) + .into(binding.ivCreator) + + binding.tvTitle.text = item.title + binding.tvNickname.text = item.creatorNickname + + + binding.ivCover.setOnClickListener { onClickItem(item.contentId) } + binding.ivCreator.setOnClickListener { onClickCreator(item.creatorId) } + binding.tvNickname.setOnClickListener { onClickCreator(item.creatorId) } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + parent.context, + ItemAudioContentMainTabPopularContentBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun getItemCount() = items.size + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + @SuppressLint("NotifyDataSetChanged") + fun addItems(items: List) { + this.items.clear() + this.items.addAll(items) + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt index 955b57a..3b3b4dd 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt @@ -6,9 +6,7 @@ import android.graphics.Rect import android.net.Uri import android.os.Bundle import android.view.View -import android.widget.ImageView import android.widget.LinearLayout -import android.widget.TextView import android.widget.Toast import androidx.annotation.OptIn import androidx.core.content.ContextCompat @@ -16,9 +14,6 @@ import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import coil.load -import coil.transform.CircleCropTransformation -import coil.transform.RoundedCornersTransformation import com.zhpan.bannerview.BaseBannerAdapter import com.zhpan.indicator.enums.IndicatorSlideMode import com.zhpan.indicator.enums.IndicatorStyle @@ -26,14 +21,15 @@ import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter -import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter +import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.Constants +import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabAsmrBinding import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity @@ -56,6 +52,7 @@ class AudioContentMainTabAsmrFragment : BaseFragment + startActivity( + Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId) + } + ) + }, + onClickCreator = { creatorId -> + startActivity( + Intent(requireActivity(), UserProfileActivity::class.java).apply { + putExtra(Constants.EXTRA_USER_ID, creatorId) + } + ) + } + ) + + val recyclerView = binding.rvRankingSalesCount + recyclerView.layoutManager = GridLayoutManager(requireContext(), 2) + recyclerView.addItemDecoration( + GridSpacingItemDecoration( + 2, + 13.3f.dpToPx().toInt(), + false + ) + ) + + recyclerView.adapter = popularContentByCreatorAdapter + + viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.llNoItems.visibility = View.GONE + recyclerView.visibility = View.VISIBLE + popularContentByCreatorAdapter.addItems(it) + } else { + binding.llNoItems.visibility = View.VISIBLE + recyclerView.visibility = View.GONE + } + } } private fun bindData() { @@ -461,94 +495,5 @@ class AudioContentMainTabAsmrFragment : BaseFragment 1) { - binding.llSales2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesTitle2, - coverImageView = binding.ivSales2, - creatorTextView = binding.tvSalesCreator2, - creatorImageView = binding.ivSalesCreator2 - ) - } - } - } - - viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { - if (it.isNotEmpty()) { - binding.llNoItems.visibility = View.GONE - binding.llSalesCountTop2.visibility = View.VISIBLE - - setSalesRankContent( - item = it[0], - titleTextView = binding.tvSalesCountTitle1, - coverImageView = binding.ivSalesCount1, - creatorTextView = binding.tvSalesCountCreator1, - creatorImageView = binding.ivSalesCountCreator1 - ) - - if (it.size > 1) { - binding.llSalesCount2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesCountTitle2, - coverImageView = binding.ivSalesCount2, - creatorTextView = binding.tvSalesCountCreator2, - creatorImageView = binding.ivSalesCountCreator2 - ) - } - } - } - } - - private fun setSalesRankContent( - item: GetAudioContentRankingItem, - titleTextView: TextView, - creatorTextView: TextView, - coverImageView: ImageView, - creatorImageView: ImageView - ) { - coverImageView.load(item.coverImageUrl) { - crossfade(true) - placeholder(R.drawable.bg_placeholder) - transformations(RoundedCornersTransformation(5.3f.dpToPx())) - } - titleTextView.text = item.title - creatorTextView.text = item.creatorNickname - creatorImageView.load(item.creatorProfileImageUrl) { - transformations(CircleCropTransformation()) - placeholder(R.drawable.ic_place_holder) - crossfade(true) - } - - coverImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { - putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, item.contentId) - } - ) - } - - creatorImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), UserProfileActivity::class.java).apply { - putExtra(Constants.EXTRA_USER_ID, item.creatorId) - } - ) - } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt index add5cbe..70f3fd6 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt @@ -41,10 +41,6 @@ class AudioContentMainTabAsmrViewModel( val contentCreatorListLiveData: LiveData> get() = _contentCreatorListLiveData - private val _salesRankContentListLiveData = MutableLiveData>() - val salesRankContentListLiveData: LiveData> - get() = _salesRankContentListLiveData - private val _salesCountRankContentListLiveData = MutableLiveData>() val salesCountRankContentListLiveData: LiveData> @@ -73,7 +69,6 @@ class AudioContentMainTabAsmrViewModel( _newContentListLiveData.value = data.newAsmrContentList _contentRankingLiveData.value = data.rankAsmrContentList _contentCreatorListLiveData.value = data.creatorList - _salesRankContentListLiveData.value = data.salesRankContentList _salesCountRankContentListLiveData.value = data.salesCountRankContentList _eventLiveData.value = data.eventBannerList.eventList @@ -112,10 +107,7 @@ class AudioContentMainTabAsmrViewModel( { _isLoading.value = false if (it.success && it.data != null) { - val data = it.data - _salesRankContentListLiveData.value = data.salesRankContentList - _salesCountRankContentListLiveData.value = - data.salesCountRankContentList + _salesCountRankContentListLiveData.value = it.data!! } else { if (it.message != null) { _toastLiveData.postValue(it.message) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt index e35c19f..98f2e24 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt @@ -19,8 +19,6 @@ data class GetContentMainTabAsmrResponse( val rankAsmrContentList: List, @SerializedName("creatorList") val creatorList: List, - @SerializedName("salesRankContentList") - val salesRankContentList: List, @SerializedName("salesCountRankContentList") val salesCountRankContentList: List, @SerializedName("eventBannerList") diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt index 3d2ec5c..f92ab00 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt @@ -6,9 +6,7 @@ import android.graphics.Rect import android.net.Uri import android.os.Bundle import android.view.View -import android.widget.ImageView import android.widget.LinearLayout -import android.widget.TextView import android.widget.Toast import androidx.annotation.OptIn import androidx.core.content.ContextCompat @@ -16,9 +14,6 @@ import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import coil.load -import coil.transform.CircleCropTransformation -import coil.transform.RoundedCornersTransformation import com.zhpan.bannerview.BaseBannerAdapter import com.zhpan.indicator.enums.IndicatorSlideMode import com.zhpan.indicator.enums.IndicatorStyle @@ -27,14 +22,15 @@ import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllActivity import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter -import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter +import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.Constants +import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabContentBinding import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity @@ -57,6 +53,7 @@ class AudioContentMainTabContentFragment : BaseFragment + startActivity( + Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId) + } + ) + }, + onClickCreator = { creatorId -> + startActivity( + Intent(requireActivity(), UserProfileActivity::class.java).apply { + putExtra(Constants.EXTRA_USER_ID, creatorId) + } + ) + } + ) + + val recyclerView = binding.rvRankingSalesCount + recyclerView.layoutManager = GridLayoutManager(requireContext(), 2) + recyclerView.addItemDecoration( + GridSpacingItemDecoration( + 2, + 13.3f.dpToPx().toInt(), + false + ) + ) + + recyclerView.adapter = popularContentByCreatorAdapter + + viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.llNoItems.visibility = View.GONE + recyclerView.visibility = View.VISIBLE + popularContentByCreatorAdapter.addItems(it) + } else { + binding.llNoItems.visibility = View.VISIBLE + recyclerView.visibility = View.GONE + } + } } private fun bindData() { @@ -481,94 +515,5 @@ class AudioContentMainTabContentFragment : BaseFragment 1) { - binding.llSales2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesTitle2, - coverImageView = binding.ivSales2, - creatorTextView = binding.tvSalesCreator2, - creatorImageView = binding.ivSalesCreator2 - ) - } - } - } - - viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { - if (it.isNotEmpty()) { - binding.llNoItems.visibility = View.GONE - binding.llSalesCountTop2.visibility = View.VISIBLE - - setSalesRankContent( - item = it[0], - titleTextView = binding.tvSalesCountTitle1, - coverImageView = binding.ivSalesCount1, - creatorTextView = binding.tvSalesCountCreator1, - creatorImageView = binding.ivSalesCountCreator1 - ) - - if (it.size > 1) { - binding.llSalesCount2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesCountTitle2, - coverImageView = binding.ivSalesCount2, - creatorTextView = binding.tvSalesCountCreator2, - creatorImageView = binding.ivSalesCountCreator2 - ) - } - } - } - } - - private fun setSalesRankContent( - item: GetAudioContentRankingItem, - titleTextView: TextView, - creatorTextView: TextView, - coverImageView: ImageView, - creatorImageView: ImageView - ) { - coverImageView.load(item.coverImageUrl) { - crossfade(true) - placeholder(R.drawable.bg_placeholder) - transformations(RoundedCornersTransformation(5.3f.dpToPx())) - } - titleTextView.text = item.title - creatorTextView.text = item.creatorNickname - creatorImageView.load(item.creatorProfileImageUrl) { - transformations(CircleCropTransformation()) - placeholder(R.drawable.ic_place_holder) - crossfade(true) - } - - coverImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { - putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, item.contentId) - } - ) - } - - creatorImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), UserProfileActivity::class.java).apply { - putExtra(Constants.EXTRA_USER_ID, item.creatorId) - } - ) - } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt index 54f59d3..a433d7d 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt @@ -52,10 +52,6 @@ class AudioContentMainTabContentViewModel( val contentRankCreatorListLiveData: LiveData> get() = _contentRankCreatorListLiveData - private val _salesRankContentListLiveData = MutableLiveData>() - val salesRankContentListLiveData: LiveData> - get() = _salesRankContentListLiveData - private val _salesCountRankContentListLiveData = MutableLiveData>() val salesCountRankContentListLiveData: LiveData> @@ -83,7 +79,6 @@ class AudioContentMainTabContentViewModel( _eventLiveData.value = data.eventBannerList.eventList _contentRankCreatorListLiveData.value = data.contentRankCreatorList - _salesRankContentListLiveData.value = data.salesRankContentList _salesCountRankContentListLiveData.value = data.salesCountRankContentList } else { @@ -191,10 +186,7 @@ class AudioContentMainTabContentViewModel( { _isLoading.value = false if (it.success && it.data != null) { - val data = it.data - _salesRankContentListLiveData.value = data.salesRankContentList - _salesCountRankContentListLiveData.value = - data.salesCountRankContentList + _salesCountRankContentListLiveData.value = it.data!! } else { if (it.message != null) { _toastLiveData.postValue(it.message) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt index 91225c5..cc033a4 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt @@ -16,7 +16,6 @@ data class GetContentMainTabContentResponse( @SerializedName("rankSortTypeList") val rankSortTypeList: List, @SerializedName("rankContentList") val rankContentList: List, @SerializedName("contentRankCreatorList") val contentRankCreatorList: List, - @SerializedName("salesRankContentList") val salesRankContentList: List, @SerializedName("salesCountRankContentList") val salesCountRankContentList: List, @SerializedName("eventBannerList") val eventBannerList: GetEventResponse ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt index 1ca6cab..17ac102 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt @@ -9,18 +9,13 @@ import android.text.SpannableString import android.text.Spanned import android.text.style.ForegroundColorSpan import android.view.View -import android.widget.ImageView import android.widget.LinearLayout -import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import coil.load -import coil.transform.CircleCropTransformation -import coil.transform.RoundedCornersTransformation import com.zhpan.bannerview.BaseBannerAdapter import com.zhpan.indicator.enums.IndicatorSlideMode import com.zhpan.indicator.enums.IndicatorStyle @@ -29,17 +24,18 @@ import kr.co.vividnext.sodalive.audio_content.all.AudioContentRankingAllActivity import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType -import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainActivity import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainTab import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter +import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.Constants +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.databinding.FragmentAudioContentMainTabHomeBinding @@ -69,6 +65,7 @@ class AudioContentMainTabHomeFragment : BaseFragment 1) { - binding.llSales2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesTitle2, - coverImageView = binding.ivSales2, - creatorTextView = binding.tvSalesCreator2, - creatorImageView = binding.ivSalesCreator2 - ) - } - } - } - - viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { - if (it.isNotEmpty()) { - binding.llNoItems.visibility = View.GONE - binding.llSalesCountTop2.visibility = View.VISIBLE - - setSalesRankContent( - item = it[0], - titleTextView = binding.tvSalesCountTitle1, - coverImageView = binding.ivSalesCount1, - creatorTextView = binding.tvSalesCountCreator1, - creatorImageView = binding.ivSalesCountCreator1 - ) - - if (it.size > 1) { - binding.llSalesCount2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesCountTitle2, - coverImageView = binding.ivSalesCount2, - creatorTextView = binding.tvSalesCountCreator2, - creatorImageView = binding.ivSalesCountCreator2 - ) - } - } - } - } - - private fun setSalesRankContent( - item: GetAudioContentRankingItem, - titleTextView: TextView, - creatorTextView: TextView, - coverImageView: ImageView, - creatorImageView: ImageView - ) { - coverImageView.load(item.coverImageUrl) { - crossfade(true) - placeholder(R.drawable.bg_placeholder) - transformations(RoundedCornersTransformation(5.3f.dpToPx())) - } - titleTextView.text = item.title - creatorTextView.text = item.creatorNickname - creatorImageView.load(item.creatorProfileImageUrl) { - transformations(CircleCropTransformation()) - placeholder(R.drawable.ic_place_holder) - crossfade(true) - } - - coverImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { - putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, item.contentId) - } - ) - } - - creatorImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), UserProfileActivity::class.java).apply { - putExtra(Constants.EXTRA_USER_ID, item.creatorId) - } - ) - } } private fun setupView() { @@ -228,6 +136,7 @@ class AudioContentMainTabHomeFragment : BaseFragment + startActivity( + Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId) + } + ) + }, + onClickCreator = { creatorId -> + startActivity( + Intent(requireActivity(), UserProfileActivity::class.java).apply { + putExtra(Constants.EXTRA_USER_ID, creatorId) + } + ) + } + ) + + val recyclerView = binding.rvRankingSalesCount + recyclerView.layoutManager = GridLayoutManager(requireContext(), 2) + recyclerView.addItemDecoration( + GridSpacingItemDecoration( + 2, + 13.3f.dpToPx().toInt(), + false + ) + ) + + recyclerView.adapter = popularContentByCreatorAdapter + + viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.llNoItems.visibility = View.GONE + recyclerView.visibility = View.VISIBLE + popularContentByCreatorAdapter.addItems(it) + } else { + binding.llNoItems.visibility = View.VISIBLE + recyclerView.visibility = View.GONE + } + } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt index 2fa05bf..a2c2699 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt @@ -60,10 +60,6 @@ class AudioContentMainTabHomeViewModel( val contentRankCreatorListLiveData: LiveData> get() = _contentRankCreatorListLiveData - private val _salesRankContentListLiveData = MutableLiveData>() - val salesRankContentListLiveData: LiveData> - get() = _salesRankContentListLiveData - private val _salesCountRankContentListLiveData = MutableLiveData>() val salesCountRankContentListLiveData: LiveData> @@ -90,7 +86,6 @@ class AudioContentMainTabHomeViewModel( _rankContentSortListLiveData.value = data.rankSortTypeList _eventLiveData.value = data.eventBannerList.eventList _contentRankCreatorListLiveData.value = data.contentRankCreatorList - _salesRankContentListLiveData.value = data.salesRankContentList _salesCountRankContentListLiveData.value = data.salesCountRankContentList } else { @@ -162,10 +157,7 @@ class AudioContentMainTabHomeViewModel( { _isLoading.value = false if (it.success && it.data != null) { - val data = it.data - _salesRankContentListLiveData.value = data.salesRankContentList - _salesCountRankContentListLiveData.value = - data.salesCountRankContentList + _salesCountRankContentListLiveData.value = it.data!! } else { if (it.message != null) { _toastLiveData.postValue(it.message) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt index f21efac..1613ee0 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt @@ -19,6 +19,5 @@ data class GetContentMainTabHomeResponse( val rankContentList: List, val eventBannerList: GetEventResponse, val contentRankCreatorList: List, - val salesRankContentList: List, val salesCountRankContentList: List ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt index 43031f1..002dbd9 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt @@ -6,9 +6,7 @@ import android.graphics.Rect import android.net.Uri import android.os.Bundle import android.view.View -import android.widget.ImageView import android.widget.LinearLayout -import android.widget.TextView import android.widget.Toast import androidx.annotation.OptIn import androidx.core.content.ContextCompat @@ -16,9 +14,6 @@ import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import coil.load -import coil.transform.CircleCropTransformation -import coil.transform.RoundedCornersTransformation import com.zhpan.bannerview.BaseBannerAdapter import com.zhpan.indicator.enums.IndicatorSlideMode import com.zhpan.indicator.enums.IndicatorStyle @@ -26,14 +21,15 @@ import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter -import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter +import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.Constants +import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabReplayBinding import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity @@ -55,6 +51,7 @@ class AudioContentMainTabReplayFragment : BaseFragment + startActivity( + Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId) + } + ) + }, + onClickCreator = { creatorId -> + startActivity( + Intent(requireActivity(), UserProfileActivity::class.java).apply { + putExtra(Constants.EXTRA_USER_ID, creatorId) + } + ) + } + ) + + val recyclerView = binding.rvRankingSalesCount + recyclerView.layoutManager = GridLayoutManager(requireContext(), 2) + recyclerView.addItemDecoration( + GridSpacingItemDecoration( + 2, + 13.3f.dpToPx().toInt(), + false + ) + ) + + recyclerView.adapter = popularContentByCreatorAdapter + + viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.llNoItems.visibility = View.GONE + recyclerView.visibility = View.VISIBLE + popularContentByCreatorAdapter.addItems(it) + } else { + binding.llNoItems.visibility = View.VISIBLE + recyclerView.visibility = View.GONE + } + } } private fun setupEventBanner() { @@ -460,94 +494,5 @@ class AudioContentMainTabReplayFragment : BaseFragment 1) { - binding.llSales2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesTitle2, - coverImageView = binding.ivSales2, - creatorTextView = binding.tvSalesCreator2, - creatorImageView = binding.ivSalesCreator2 - ) - } - } - } - - viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) { - if (it.isNotEmpty()) { - binding.llNoItems.visibility = View.GONE - binding.llSalesCountTop2.visibility = View.VISIBLE - - setSalesRankContent( - item = it[0], - titleTextView = binding.tvSalesCountTitle1, - coverImageView = binding.ivSalesCount1, - creatorTextView = binding.tvSalesCountCreator1, - creatorImageView = binding.ivSalesCountCreator1 - ) - - if (it.size > 1) { - binding.llSalesCount2.visibility = View.VISIBLE - setSalesRankContent( - item = it[1], - titleTextView = binding.tvSalesCountTitle2, - coverImageView = binding.ivSalesCount2, - creatorTextView = binding.tvSalesCountCreator2, - creatorImageView = binding.ivSalesCountCreator2 - ) - } - } - } - } - - private fun setSalesRankContent( - item: GetAudioContentRankingItem, - titleTextView: TextView, - creatorTextView: TextView, - coverImageView: ImageView, - creatorImageView: ImageView - ) { - coverImageView.load(item.coverImageUrl) { - crossfade(true) - placeholder(R.drawable.bg_placeholder) - transformations(RoundedCornersTransformation(5.3f.dpToPx())) - } - titleTextView.text = item.title - creatorTextView.text = item.creatorNickname - creatorImageView.load(item.creatorProfileImageUrl) { - transformations(CircleCropTransformation()) - placeholder(R.drawable.ic_place_holder) - crossfade(true) - } - - coverImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { - putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, item.contentId) - } - ) - } - - creatorImageView.setOnClickListener { - startActivity( - Intent(requireActivity(), UserProfileActivity::class.java).apply { - putExtra(Constants.EXTRA_USER_ID, item.creatorId) - } - ) - } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt index 575827d..e945f5e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt @@ -16,7 +16,7 @@ import kr.co.vividnext.sodalive.settings.event.EventItem class AudioContentMainTabReplayViewModel( private val repository: AudioContentMainTabReplayRepository -): BaseViewModel() { +) : BaseViewModel() { private val _toastLiveData = MutableLiveData() val toastLiveData: LiveData get() = _toastLiveData @@ -41,10 +41,6 @@ class AudioContentMainTabReplayViewModel( val contentCreatorListLiveData: LiveData> get() = _contentCreatorListLiveData - private val _salesRankContentListLiveData = MutableLiveData>() - val salesRankContentListLiveData: LiveData> - get() = _salesRankContentListLiveData - private val _salesCountRankContentListLiveData = MutableLiveData>() val salesCountRankContentListLiveData: LiveData> @@ -73,7 +69,6 @@ class AudioContentMainTabReplayViewModel( _newContentListLiveData.value = data.newLiveReplayContentList _contentRankingLiveData.value = data.rankLiveReplayContentList _contentCreatorListLiveData.value = data.creatorList - _salesRankContentListLiveData.value = data.salesRankContentList _salesCountRankContentListLiveData.value = data.salesCountRankContentList _eventLiveData.value = data.eventBannerList.eventList @@ -112,10 +107,7 @@ class AudioContentMainTabReplayViewModel( { _isLoading.value = false if (it.success && it.data != null) { - val data = it.data - _salesRankContentListLiveData.value = data.salesRankContentList - _salesCountRankContentListLiveData.value = - data.salesCountRankContentList + _salesCountRankContentListLiveData.value = it.data!! } else { if (it.message != null) { _toastLiveData.postValue(it.message) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/GetContentMainTabLiveReplayResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/GetContentMainTabLiveReplayResponse.kt index e1ee501..61be22b 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/GetContentMainTabLiveReplayResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/GetContentMainTabLiveReplayResponse.kt @@ -19,8 +19,6 @@ data class GetContentMainTabLiveReplayResponse( val rankLiveReplayContentList: List, @SerializedName("creatorList") val creatorList: List, - @SerializedName("salesRankContentList") - val salesRankContentList: List, @SerializedName("salesCountRankContentList") val salesCountRankContentList: List, @SerializedName("eventBannerList") diff --git a/app/src/main/res/layout/fragment_audio_content_main_tab_asmr.xml b/app/src/main/res/layout/fragment_audio_content_main_tab_asmr.xml index db1d35e..9b1ffdb 100644 --- a/app/src/main/res/layout/fragment_audio_content_main_tab_asmr.xml +++ b/app/src/main/res/layout/fragment_audio_content_main_tab_asmr.xml @@ -1,6 +1,5 @@ @@ -115,264 +114,13 @@ android:clipToPadding="false" android:paddingHorizontal="13.3dp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:clipToPadding="false" + android:paddingHorizontal="13.3dp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:clipToPadding="false" + android:paddingHorizontal="13.3dp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:clipToPadding="false" + android:paddingHorizontal="13.3dp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:clipToPadding="false" + android:paddingHorizontal="13.3dp" /> + + + + + + + + + + + + +