From 7bb8f9c5afd424934861388af7daceb463c8945d Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 18 Feb 2025 23:44:39 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=8B=A8=ED=8E=B8=20=ED=83=AD=20-=20=ED=83=9C?= =?UTF-8?q?=EA=B7=B8=EB=B3=84=20=EC=B6=94=EC=B2=9C=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=98=81=EC=97=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/audio_content/AudioContentApi.kt | 6 ++ .../AudioContentAllByThemeActivity.kt | 6 +- .../AudioContentMainTabContentFragment.kt | 74 ++++++++++++++++++ .../AudioContentMainTabContentRepository.kt | 5 ++ .../AudioContentMainTabContentTagAdapter.kt | 78 +++++++++++++++++++ .../AudioContentMainTabContentViewModel.kt | 45 +++++++++++ .../GetContentMainTabContentResponse.kt | 2 + ...bg_round_corner_2_6_transparent_3bb9f1.xml | 8 ++ ...bg_round_corner_2_6_transparent_777777.xml | 8 ++ ...ragment_audio_content_main_tab_content.xml | 34 ++++++++ .../item_content_main_tab_content_tag.xml | 18 +++++ 11 files changed, 281 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentTagAdapter.kt create mode 100644 app/src/main/res/drawable/bg_round_corner_2_6_transparent_3bb9f1.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_2_6_transparent_777777.xml create mode 100644 app/src/main/res/layout/item_content_main_tab_content_tag.xml 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 bf92495..67eb260 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 @@ -374,4 +374,10 @@ interface AudioContentApi { @Query("creatorId") creatorId: Long, @Header("Authorization") authHeader: String ): Single>> + + @GET("/v2/audio-content/main/content/recommend-content-by-tag") + fun getRecommendedContentByTag( + @Query("tag") tag: String, + @Header("Authorization") authHeader: String + ): Single>> } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt index 5f1f414..89cbf58 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt @@ -1,12 +1,12 @@ package kr.co.vividnext.sodalive.audio_content.all.by_theme import android.content.Intent -import android.graphics.Rect import android.os.Bundle -import android.view.View import android.widget.TextView import android.widget.Toast +import androidx.annotation.OptIn 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 @@ -20,7 +20,6 @@ import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.databinding.ActivityAudioContentAllByThemeBinding import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity -import kr.co.vividnext.sodalive.extensions.dpToPx import org.koin.android.ext.android.inject class AudioContentAllByThemeActivity : BaseActivity( @@ -52,6 +51,7 @@ class AudioContentAllByThemeActivity : BaseActivity Unit +) : RecyclerView.Adapter() { + + private val tagList = mutableListOf() + + private var selectedTag = "" + + inner class ViewHolder( + private val context: Context, + private val binding: ItemContentMainTabContentTagBinding + ) : RecyclerView.ViewHolder(binding.root) { + @SuppressLint("NotifyDataSetChanged") + fun bind(tag: String) { + if (tag == selectedTag) { + binding.tvTag.setBackgroundResource( + R.drawable.bg_round_corner_2_6_transparent_3bb9f1 + ) + binding.tvTag.setTextColor( + ContextCompat.getColor(context, R.color.color_3bb9f1) + ) + } else { + binding.tvTag.setBackgroundResource( + R.drawable.bg_round_corner_2_6_transparent_777777 + ) + binding.tvTag.setTextColor( + ContextCompat.getColor(context, R.color.color_777777) + ) + } + + binding.tvTag.text = tag + binding.tvTag.setOnClickListener { + selectedTag = tag + onClick(tag) + notifyDataSetChanged() + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + parent.context, + ItemContentMainTabContentTagBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun getItemCount() = tagList.size + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(tagList[position]) + } + + @SuppressLint("NotifyDataSetChanged") + fun addItems(tagList: List) { + this.tagList.clear() + this.tagList.addAll(tagList) + + if (tagList.isNotEmpty()) { + selectedTag = tagList[0] + } + + notifyDataSetChanged() + } +} 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 ab602d1..b801d4a 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 @@ -62,6 +62,14 @@ class AudioContentMainTabContentViewModel( val salesCountRankContentListLiveData: LiveData> get() = _salesCountRankContentListLiveData + private val _tagListLiveData = MutableLiveData>() + val tagListLiveData: LiveData> + get() = _tagListLiveData + + private val _tagCurationContentListLiveData = MutableLiveData>() + val tagCurationContentListLiveData: LiveData> + get() = _tagCurationContentListLiveData + fun fetchData() { _isLoading.value = true compositeDisposable.add( @@ -87,6 +95,9 @@ class AudioContentMainTabContentViewModel( _salesCountRankContentListLiveData.value = data.salesCountRankContentList _curationListLiveData.value = data.curationList + + _tagListLiveData.value = data.tagList + _tagCurationContentListLiveData.value = data.tagCurationContentList } else { if (it.message != null) { _toastLiveData.postValue(it.message) @@ -211,4 +222,38 @@ class AudioContentMainTabContentViewModel( ) ) } + + fun getRecommendContentByTag(tag: String) { + _isLoading.value = true + compositeDisposable.add( + repository.getRecommendedContentByTag( + tag = tag, + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success && it.data != null) { + _tagCurationContentListLiveData.value = it.data!! + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + + _isLoading.value = false + }, + { + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _isLoading.value = false + } + ) + ) + } } 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 ba93587..c6e54fc 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 @@ -19,5 +19,7 @@ data class GetContentMainTabContentResponse( @SerializedName("contentRankCreatorList") val contentRankCreatorList: List, @SerializedName("salesCountRankContentList") val salesCountRankContentList: List, @SerializedName("eventBannerList") val eventBannerList: GetEventResponse, + @SerializedName("tagList") val tagList: List, + @SerializedName("tagCurationContentList") val tagCurationContentList: List, @SerializedName("curationList") val curationList: List ) diff --git a/app/src/main/res/drawable/bg_round_corner_2_6_transparent_3bb9f1.xml b/app/src/main/res/drawable/bg_round_corner_2_6_transparent_3bb9f1.xml new file mode 100644 index 0000000..e77bc5d --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_2_6_transparent_3bb9f1.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_2_6_transparent_777777.xml b/app/src/main/res/drawable/bg_round_corner_2_6_transparent_777777.xml new file mode 100644 index 0000000..3a6e377 --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_2_6_transparent_777777.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_audio_content_main_tab_content.xml b/app/src/main/res/layout/fragment_audio_content_main_tab_content.xml index fe51a31..9c33689 100644 --- a/app/src/main/res/layout/fragment_audio_content_main_tab_content.xml +++ b/app/src/main/res/layout/fragment_audio_content_main_tab_content.xml @@ -185,6 +185,40 @@ android:layout_marginTop="6.7dp" android:visibility="gone" /> + + + + + + + + + + + + +