Original 작품 상세 문자열 리소스화

This commit is contained in:
2025-12-01 17:37:36 +09:00
parent 73b2eba1f8
commit 2066dbc716
9 changed files with 101 additions and 47 deletions

View File

@@ -65,11 +65,4 @@ class OriginalWorkViewModel(
})
)
}
fun refresh() {
page = 0
isLast = false
_items.value = emptyList()
loadMore()
}
}

View File

@@ -33,8 +33,13 @@ class OriginalWorkDetailActivity : BaseActivity<ActivityOriginalWorkDetailBindin
val originalId = intent.getLongExtra(EXTRA_ORIGINAL_ID, -1)
if (originalId <= 0) {
Toast.makeText(applicationContext, "잘못된 요청입니다.", Toast.LENGTH_LONG).show()
Toast.makeText(
applicationContext,
getString(R.string.original_detail_error_invalid_request),
Toast.LENGTH_LONG
).show()
finish()
return
}
bind()
@@ -62,8 +67,12 @@ class OriginalWorkDetailActivity : BaseActivity<ActivityOriginalWorkDetailBindin
private fun setupTabs() {
val tabs = binding.tabs
tabs.addTab(tabs.newTab().setText("캐릭터").setTag("character"))
tabs.addTab(tabs.newTab().setText("작품정보").setTag("info"))
tabs.addTab(
tabs.newTab().setText(R.string.screen_original_detail_tab_character).setTag("character")
)
tabs.addTab(
tabs.newTab().setText(R.string.screen_original_detail_tab_info).setTag("info")
)
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
@@ -101,7 +110,13 @@ class OriginalWorkDetailActivity : BaseActivity<ActivityOriginalWorkDetailBindin
private fun bind() {
viewModel.toast.observe(this) {
it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
it?.let { uiText ->
Toast.makeText(
applicationContext,
uiText.asString(this),
Toast.LENGTH_LONG
).show()
}
}
viewModel.isLoading.observe(this) {

View File

@@ -4,11 +4,12 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.chat.character.Character
import kr.co.vividnext.sodalive.chat.original.OriginalWorkDetailResponse
import kr.co.vividnext.sodalive.chat.original.OriginalWorkRepository
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.common.UiText
class OriginalWorkDetailViewModel(
private val repository: OriginalWorkRepository
@@ -17,8 +18,8 @@ class OriginalWorkDetailViewModel(
private val _isLoading = MutableLiveData(false)
val isLoading: LiveData<Boolean> get() = _isLoading
private val _toast = MutableLiveData<String?>(null)
val toast: LiveData<String?> get() = _toast
private val _toast = MutableLiveData<UiText?>(null)
val toast: LiveData<UiText?> get() = _toast
private val _detail = MutableLiveData<OriginalWorkDetailResponse?>(null)
val detail: LiveData<OriginalWorkDetailResponse?> get() = _detail
@@ -41,12 +42,14 @@ class OriginalWorkDetailViewModel(
detailResponse = data
_detail.value = detailResponse
} else {
_toast.value = response.message ?: "알 수 없는 오류가 발생했습니다."
_toast.value = response.message?.let { UiText.DynamicString(it) }
?: UiText.StringResource(R.string.common_error_unknown)
}
_isLoading.value = false
}, { e ->
_isLoading.value = false
_toast.value = e.message ?: "알 수 없는 오류가 발생했습니다."
_toast.value = e.message?.let { UiText.DynamicString(it) }
?: UiText.StringResource(R.string.common_error_unknown)
})
)
}

View File

@@ -12,6 +12,7 @@ import androidx.core.view.isVisible
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.chat.original.OriginalWorkDetailResponse
import kr.co.vividnext.sodalive.databinding.FragmentOriginalWorkInfoBinding
import kr.co.vividnext.sodalive.R
class OriginalWorkInfoFragment : BaseFragment<FragmentOriginalWorkInfoBinding>(
FragmentOriginalWorkInfoBinding::inflate
@@ -106,7 +107,10 @@ class OriginalWorkInfoFragment : BaseFragment<FragmentOriginalWorkInfoBinding>(
binding.tvOriginalWork.setBackgroundResource(outValue.resourceId)
}
// 접근성 설명
binding.tvOriginalWork.contentDescription = "원작 $originalWork 링크 열기"
binding.tvOriginalWork.contentDescription = getString(
R.string.original_detail_link_content_description,
originalWork
)
binding.tvOriginalWork.setOnClickListener {
openUrl(originalLink)
@@ -156,7 +160,7 @@ class OriginalWorkInfoFragment : BaseFragment<FragmentOriginalWorkInfoBinding>(
if (!host.isNullOrBlank()) host else url
} catch (_: Exception) {
// 파싱 실패 시 간단한 레이블 제공
"링크 ${index + 1}"
getString(R.string.original_detail_link_fallback, index + 1)
}
}