diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt index 6120681d..b8a3dfce 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt @@ -35,6 +35,7 @@ class AudioContentAllActivity : BaseActivity( private var isFree: Boolean = false private var isPointOnly: Boolean = false + private val allThemeLabel by lazy { getString(R.string.screen_home_theme_all) } override fun onCreate(savedInstanceState: Bundle?) { isFree = intent.getBooleanExtra(Constants.EXTRA_AUDIO_CONTENT_FREE, false) @@ -75,9 +76,10 @@ class AudioContentAllActivity : BaseActivity( } private fun setupTheme() { - themeAdapter = HomeContentThemeAdapter { + themeAdapter = HomeContentThemeAdapter(allThemeLabel) { selectedTheme -> adapter.addItems(emptyList()) - viewModel.selectTheme(it, isFree = isFree, isPointOnly = isPointOnly) + val theme = if (selectedTheme == allThemeLabel) "" else selectedTheme + viewModel.selectTheme(theme, isFree = isFree, isPointOnly = isPointOnly) } binding.rvTheme.layoutManager = LinearLayoutManager( @@ -169,7 +171,9 @@ class AudioContentAllActivity : BaseActivity( } viewModel.themeListLiveData.observe(this) { - themeAdapter.addItems(it) + val themes = mutableListOf(allThemeLabel) + themes.addAll(it) + themeAdapter.addItems(themes) } viewModel.itemsLiveData.observe(this) { list -> diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt index c0dc13bd..bff846eb 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt @@ -35,7 +35,7 @@ class AudioContentAllViewModel( private var page = 1 private val size = 20 private var isLast = false - private var selectedTheme = "전체" + private var selectedTheme = "" fun reset() { page = 1 @@ -57,8 +57,7 @@ class AudioContentAllViewModel( .subscribe( { if (it.success && it.data != null) { - val themeList = listOf("전체").union(it.data).toList() - _themeListLiveData.postValue(themeList) + _themeListLiveData.postValue(it.data) } else { if (it.message != null) { _toastLiveData.postValue(it.message) @@ -94,11 +93,7 @@ class AudioContentAllViewModel( isFree = isFree, isPointAvailableOnly = isPointAvailableOnly, sortType = _sortLiveData.value!!, - theme = if (selectedTheme == "전체") { - null - } else { - selectedTheme - }, + theme = selectedTheme.ifBlank { null }, token = "Bearer ${SharedPreferenceManager.token}" ) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt index ba6c7f37..f22e262e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt @@ -11,6 +11,7 @@ import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.common.Constants @@ -32,6 +33,7 @@ class AudioContentNewAllActivity : BaseActivity newContentAdapter.clear() newContentAdapter.notifyDataSetChanged() - viewModel.selectTheme(it, isFree = isFree) + val theme = if (selectedTheme == allThemeLabel) "" else selectedTheme + viewModel.selectTheme(theme, isFree = isFree) } binding.rvNewContentTheme.layoutManager = LinearLayoutManager( @@ -171,7 +174,9 @@ class AudioContentNewAllActivity : BaseActivity "매출" - ContentRankingSortType.SALES_COUNT -> "판매량" - ContentRankingSortType.COMMENT_COUNT -> "댓글" - ContentRankingSortType.LIKE_COUNT -> "좋아요" -} +private fun ContentRankingSortType.toLabel(context: Context): String = + context.getString(labelRes) + +private val ContentRankingSortType.labelRes: Int + @StringRes + get() = when (this) { + ContentRankingSortType.REVENUE -> R.string.screen_home_sort_revenue + ContentRankingSortType.SALES_COUNT -> R.string.screen_home_sort_sales_count + ContentRankingSortType.COMMENT_COUNT -> R.string.screen_home_sort_comment_count + ContentRankingSortType.LIKE_COUNT -> R.string.screen_home_sort_like_count + } 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 index 0dfdc911..69987699 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/CreatorRankingAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/CreatorRankingAdapter.kt @@ -63,12 +63,12 @@ class CreatorRankingAdapter( if (SharedPreferenceManager.userId != item.id) { binding.tvFollow.visibility = View.VISIBLE if (item.follow) { - binding.tvFollow.text = "팔로잉" + binding.tvFollow.text = context.getString(R.string.screen_home_following) binding.tvFollow.setBackgroundResource(R.drawable.bg_round_corner_999_455a64) binding.tvFollow.setTextColor(context.getColor(R.color.white)) } else { - binding.tvFollow.text = "팔로우" + binding.tvFollow.text = context.getString(R.string.screen_home_follow) binding.tvFollow.setBackgroundResource(R.drawable.bg_round_corner_999_white) binding.tvFollow.setTextColor("#263238".toColorInt()) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeContentThemeAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeContentThemeAdapter.kt index 3b231a15..5939c1f1 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeContentThemeAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeContentThemeAdapter.kt @@ -8,10 +8,11 @@ import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.databinding.ItemHomeContentThemeBinding class HomeContentThemeAdapter( + private val allLabel: String, private val onClickItem: (String) -> Unit ) : RecyclerView.Adapter() { private val themeList = mutableListOf() - private var selectedTheme = "" + private var selectedTheme = allLabel inner class ViewHolder( private val binding: ItemHomeContentThemeBinding @@ -19,7 +20,7 @@ class HomeContentThemeAdapter( @SuppressLint("NotifyDataSetChanged") fun bind(theme: String) { if (theme == selectedTheme || - (selectedTheme == "" && theme == "전체") + (selectedTheme.isEmpty() && theme == allLabel) ) { binding.tvTheme.setBackgroundResource(R.drawable.bg_round_corner_999_3bb9f1) } else { 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 138c6bce..a410f5b1 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 @@ -77,6 +77,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl private lateinit var liveAdapter: HomeLiveAdapter private lateinit var creatorRankingAdapter: CreatorRankingAdapter private lateinit var latestContentThemeAdapter: HomeContentThemeAdapter + private val homeThemeAll by lazy { getString(R.string.screen_home_theme_all) } private lateinit var homeContentAdapter: HomeContentAdapter private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter @@ -341,8 +342,15 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl } private fun setupLatestContent() { - latestContentThemeAdapter = HomeContentThemeAdapter { - viewModel.getLatestContentByTheme(theme = it) + latestContentThemeAdapter = HomeContentThemeAdapter( + allLabel = homeThemeAll + ) { selectedTheme -> + val theme = if (selectedTheme == homeThemeAll) { + "" + } else { + selectedTheme + } + viewModel.getLatestContentByTheme(theme = theme) } val rvTheme = binding.rvNewContentTheme @@ -384,7 +392,9 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl viewModel.latestContentThemeListLiveData.observe(viewLifecycleOwner) { binding.llNewContent.visibility = View.VISIBLE - latestContentThemeAdapter.addItems(it) + val themes = mutableListOf(homeThemeAll) + themes.addAll(it) + latestContentThemeAdapter.addItems(themes) } binding.tvNewContentAll.setOnClickListener { @@ -1191,7 +1201,10 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl } viewModel.toastLiveData.observe(viewLifecycleOwner) { - it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + val text = it?.message ?: it?.resId?.let { resId -> getString(resId) } + if (!text.isNullOrBlank()) { + Toast.makeText(requireContext(), text, Toast.LENGTH_LONG).show() + } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeSeriesAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeSeriesAdapter.kt index e60b1fcf..771cd889 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeSeriesAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeSeriesAdapter.kt @@ -38,7 +38,10 @@ class HomeSeriesAdapter( binding.tvTitle.text = item.title binding.tvNickname.text = item.creator.nickname - binding.tvSeriesContentCount.text = "총 ${item.numberOfContent}화" + binding.tvSeriesContentCount.text = binding.root.context.getString( + R.string.screen_home_series_episode_count, + item.numberOfContent + ) binding.tvNew.visibility = if (item.isNew) { View.VISIBLE } else { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt index 14ffbc02..f425efcd 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeViewModel.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.home +import androidx.annotation.StringRes import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.orhanobut.logger.Logger @@ -14,6 +15,7 @@ import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.explorer.GetExplorerSectionCreatorResponse import kr.co.vividnext.sodalive.live.GetRoomListResponse import kr.co.vividnext.sodalive.user.UserRepository +import kr.co.vividnext.sodalive.R class HomeViewModel( private val repository: HomeRepository, @@ -24,8 +26,8 @@ class HomeViewModel( val isLoading: LiveData get() = _isLoading - private val _toastLiveData = MutableLiveData() - val toastLiveData: LiveData + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData get() = _toastLiveData private var _liveListLiveData = MutableLiveData>() @@ -100,7 +102,6 @@ class HomeViewModel( _creatorRankingLiveData.value = data.creatorRanking val themeList = data.latestContentThemeList.toMutableList() - themeList.add(0, "전체") _latestContentThemeListLiveData.value = themeList _latestContentListLiveData.value = data.latestContentList _eventBannerListLiveData.value = data.bannerList @@ -114,19 +115,21 @@ class HomeViewModel( _recommendChannelListLiveData.value = data.recommendChannelList _recommendContentListLiveData.value = data.recommendContentList } else { - if (it.message != null) { - _toastLiveData.postValue(it.message) - } else { - _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." - ) - } + _toastLiveData.postValue( + if (it.message != null) { + HomeToastMessage(message = it.message) + } else { + HomeToastMessage(resId = R.string.screen_home_error_unknown) + } + ) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } ) ) @@ -144,15 +147,19 @@ class HomeViewModel( _contentRankingLiveData.value = data } else { if (it.message != null) { - _toastLiveData.postValue(it.message) + _toastLiveData.postValue(HomeToastMessage(message = it.message)) } else { - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } } }, { it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } ) ) @@ -174,7 +181,9 @@ class HomeViewModel( { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } ) ) @@ -185,11 +194,7 @@ class HomeViewModel( compositeDisposable.add( repository.getLatestContentByTheme( - theme = if (theme == "전체") { - "" - } else { - theme - }, + theme = theme, token = "Bearer ${SharedPreferenceManager.token}" ) .subscribeOn(Schedulers.io()) @@ -204,7 +209,9 @@ class HomeViewModel( { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } ) ) @@ -230,7 +237,9 @@ class HomeViewModel( { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } ) ) @@ -252,10 +261,10 @@ class HomeViewModel( _isLoading.value = false if (!it.success || it.data == null) { if (it.message != null) { - _toastLiveData.postValue(it.message) + _toastLiveData.postValue(HomeToastMessage(message = it.message)) } else { _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + HomeToastMessage(resId = R.string.screen_home_error_unknown) ) } } @@ -263,9 +272,16 @@ class HomeViewModel( { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + HomeToastMessage(resId = R.string.screen_home_error_unknown) + ) } ) ) } } + +data class HomeToastMessage( + @StringRes val resId: Int? = null, + val message: String? = null +) diff --git a/app/src/main/res/layout/item_home_creator.xml b/app/src/main/res/layout/item_home_creator.xml index a4c951fd..2d3ccf3e 100644 --- a/app/src/main/res/layout/item_home_creator.xml +++ b/app/src/main/res/layout/item_home_creator.xml @@ -47,7 +47,7 @@ android:fontFamily="@font/pretendard_regular" android:gravity="center" android:paddingVertical="4dp" - android:text="팔로우" + android:text="@string/screen_home_follow" android:textColor="#263238" android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/item_home_recommend_channel.xml b/app/src/main/res/layout/item_home_recommend_channel.xml index a75480b2..8d00d41e 100644 --- a/app/src/main/res/layout/item_home_recommend_channel.xml +++ b/app/src/main/res/layout/item_home_recommend_channel.xml @@ -49,7 +49,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/pretendard_regular" - android:text="콘텐츠" + android:text="@string/screen_home_recommend_channel_content_label" android:textColor="@color/white" android:textSize="18sp" /> diff --git a/app/src/main/res/layout/item_home_series.xml b/app/src/main/res/layout/item_home_series.xml index 93fdc03a..34fb204f 100644 --- a/app/src/main/res/layout/item_home_series.xml +++ b/app/src/main/res/layout/item_home_series.xml @@ -31,7 +31,7 @@ android:fontFamily="@font/pretendard_regular" android:paddingHorizontal="10dp" android:paddingVertical="3dp" - android:text="인기" + android:text="@string/screen_home_series_popular" android:textColor="@color/white" android:textSize="12sp" android:visibility="gone" /> @@ -44,7 +44,7 @@ android:fontFamily="@font/pretendard_regular" android:paddingHorizontal="10dp" android:paddingVertical="3dp" - android:text="신작" + android:text="@string/screen_home_series_new" android:textColor="@color/white" android:textSize="12sp" android:visibility="gone" @@ -58,7 +58,7 @@ android:fontFamily="@font/pretendard_regular" android:paddingHorizontal="10dp" android:paddingVertical="3dp" - android:text="완결" + android:text="@string/screen_home_series_complete" android:textColor="@color/white" android:textSize="12sp" android:visibility="gone" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index d4e97d0c..623d0455 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -107,4 +107,17 @@ Sat Sun Random + Follow + Following + All + Revenue + Sales + Comments + Likes + Total %1$d episodes + Popular + New + Complete + Contents + An unknown error occurred. Please try again. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ab070b5a..a20384ce 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -107,4 +107,17 @@ ランダム + フォロー + フォロー中 + すべて + 売上 + 販売数 + コメント + いいね + 全%1$d話 + 人気 + 新作 + 完結 + コンテンツ + 不明なエラーが発生しました。もう一度お試しください。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 124c6a04..8cf3ab98 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -106,4 +106,17 @@ 랜덤 + 팔로우 + 팔로잉 + 전체 + 매출 + 판매량 + 댓글 + 좋아요 + 총 %1$d화 + 인기 + 신작 + 완결 + 콘텐츠 + 알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.