룰렛 설정/프리뷰 문자열 리소스화

This commit is contained in:
2025-12-03 11:40:03 +09:00
parent 82b09f2c63
commit 5a4b833516
9 changed files with 195 additions and 73 deletions

View File

@@ -212,7 +212,10 @@ class RoulettePreviewDialog(
@SuppressLint("SetTextI18n")
private fun setRouletteData(roulettePreview: RoulettePreview) {
dialogView.tvSpinRoulette.text = "${roulettePreview.can}캔으로 룰렛 돌리기"
dialogView.tvSpinRoulette.text = activity.getString(
R.string.screen_roulette_preview_spin_format,
roulettePreview.can
)
dialogView.tvSpinRoulette.setOnClickListener {
if (onClickSpin != null) {
onClickSpin!!(roulettePreview.id)
@@ -240,9 +243,9 @@ class RoulettePreviewDialog(
dialogView.tvTitle.text = title.ifBlank {
when (selectedRouletteLiveData.value) {
SelectedRoulette.ROULETTE_2 -> "룰렛 2"
SelectedRoulette.ROULETTE_3 -> "룰렛 3"
else -> "룰렛 1"
SelectedRoulette.ROULETTE_2 -> activity.getString(R.string.screen_roulette_config_preset_2)
SelectedRoulette.ROULETTE_3 -> activity.getString(R.string.screen_roulette_config_preset_3)
else -> activity.getString(R.string.screen_roulette_config_preset_1)
}
}
@@ -279,7 +282,11 @@ class RoulettePreviewDialog(
val tvItemTitle = itemView.findViewById<TextView>(R.id.tv_roulette_item_title)
val tvOrder = itemView.findViewById<TextView>(R.id.tv_order)
tvItemTitle.text = "${item.title} (${item.percent})"
tvItemTitle.text = activity.getString(
R.string.screen_roulette_preview_item_title_format,
item.title,
item.percent
)
tvOrder.text = "${index + 1}"
return itemView

View File

@@ -59,7 +59,7 @@ class RouletteConfigActivity : BaseActivity<ActivityRouletteConfigBinding>(
}
override fun setupView() {
binding.tvBack.text = "룰렛 설정"
binding.tvBack.setText(R.string.screen_roulette_config_title)
binding.tvBack.setOnClickListener { finish() }
loadingDialog = LoadingDialog(this, layoutInflater)
@@ -118,7 +118,6 @@ class RouletteConfigActivity : BaseActivity<ActivityRouletteConfigBinding>(
}
}
@SuppressLint("SetTextI18n")
private fun bindData() {
viewModel.selectedRouletteLiveData.observe(this) {
deselectAllRoulette()
@@ -151,11 +150,13 @@ class RouletteConfigActivity : BaseActivity<ActivityRouletteConfigBinding>(
viewModel.optionsLiveData.observe(this) { updateOptionUi(it) }
viewModel.toastLiveData.observe(this) { it?.let { showToast(it) } }
viewModel.toastLiveData.observe(this) { uiText ->
uiText?.let { showToast(it.asString(this)) }
}
viewModel.canLiveData.observe(this) {
if (it > 0) {
binding.etSetPrice.setText("$it")
binding.etSetPrice.setText(it.toString())
} else {
binding.etSetPrice.setText("")
}
@@ -173,19 +174,16 @@ class RouletteConfigActivity : BaseActivity<ActivityRouletteConfigBinding>(
RoulettePreviewDialog(
activity = this@RouletteConfigActivity,
previewList = listOf(it),
title = "룰렛 미리보기",
title = getString(R.string.screen_roulette_config_preview_title),
layoutInflater = layoutInflater
).show()
}
viewModel.totalPercentageLiveData.observe(this) {
binding.tvTotalPercentage.text = "( ${
String.format(
Locale.KOREAN,
"%.2f%%",
it
)
} )"
binding.tvTotalPercentage.text = getString(
R.string.screen_roulette_config_option_total_format,
String.format(Locale.getDefault(), "%.2f", it)
)
}
compositeDisposable.add(
@@ -229,7 +227,10 @@ class RouletteConfigActivity : BaseActivity<ActivityRouletteConfigBinding>(
val tvDelete = optionView.findViewById<TextView>(R.id.tv_delete)
etOption.setText(option.title)
tvOptionTitle.text = "옵션 ${index + 1}"
tvOptionTitle.text = getString(
R.string.screen_roulette_config_option_title_format,
index + 1
)
try {
if (option.percentage.toFloat() > 0f) {

View File

@@ -6,12 +6,16 @@ import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.UiText
import kr.co.vividnext.sodalive.common.UiText.DynamicString
import kr.co.vividnext.sodalive.common.UiText.StringResource
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.live.roulette.GetNewRouletteResponse
import kr.co.vividnext.sodalive.live.roulette.RouletteItem
import kr.co.vividnext.sodalive.live.roulette.RoulettePreview
import kr.co.vividnext.sodalive.live.roulette.RoulettePreviewItem
import kr.co.vividnext.sodalive.live.roulette.RouletteRepository
import kr.co.vividnext.sodalive.R
class RouletteSettingsViewModel(private val repository: RouletteRepository) : BaseViewModel() {
@@ -23,8 +27,8 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
val isLoading: LiveData<Boolean>
get() = _isLoading
private val _toastLiveData = MutableLiveData<String?>()
val toastLiveData: LiveData<String?>
private val _toastLiveData = MutableLiveData<UiText?>()
val toastLiveData: LiveData<UiText?>
get() = _toastLiveData
private val _optionsLiveData = MutableLiveData<List<RouletteOption>>(listOf())
@@ -95,7 +99,8 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
if (validationOptions()) {
for (option in options) {
if (option.title.trim().isEmpty()) {
_toastLiveData.value = "옵션은 빈칸을 할 수 없습니다."
_toastLiveData.value =
StringResource(R.string.msg_roulette_config_option_title_required)
_isLoading.value = false
return
}
@@ -127,19 +132,22 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
var totalPercentage = 0f
for (option in options) {
if (option.title.trim().isEmpty()) {
_toastLiveData.value = "옵션은 빈칸을 할 수 없습니다."
_toastLiveData.value =
StringResource(R.string.msg_roulette_config_option_title_required)
_isLoading.value = false
return false
}
if (option.percentage.isBlank()) {
_toastLiveData.value = "옵션의 확률은 빈칸일 수 없습니다."
_toastLiveData.value =
StringResource(R.string.msg_roulette_config_option_percentage_required)
_isLoading.value = false
return false
}
if (option.percentage.toFloat() <= 0f) {
_toastLiveData.value = "옵션의 확률은 0%보다 커야합니다."
_toastLiveData.value =
StringResource(R.string.msg_roulette_config_option_percentage_min)
_isLoading.value = false
return false
}
@@ -148,7 +156,7 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
}
if (totalPercentage > 100.1f || totalPercentage <= 99.99f) {
_toastLiveData.value = "확률이 100%가 아닙니다"
_toastLiveData.value = StringResource(R.string.msg_roulette_config_percentage_invalid)
_isLoading.value = false
return false
}
@@ -168,7 +176,7 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
selectedRoulette.can == can &&
selectedRoulette.items == items
) {
_toastLiveData.value = "변동사항이 없습니다."
_toastLiveData.value = StringResource(R.string.msg_roulette_config_no_changes)
_isLoading.value = false
return
}
@@ -180,20 +188,16 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
items = items
)
val selectedRouletteTitle = when (_selectedRouletteLiveData.value!!) {
SelectedRoulette.ROULETTE_1 -> "룰렛 1"
SelectedRoulette.ROULETTE_2 -> "룰렛 2"
SelectedRoulette.ROULETTE_3 -> "룰렛 3"
}
val rouletteNumber = _selectedRouletteLiveData.value!!.ordinal + 1
val successMessage = if (availableActive) {
if (isActive) {
"${selectedRouletteTitle}을 활성화 했습니다."
StringResource(R.string.msg_roulette_config_activate_success, rouletteNumber)
} else {
"${selectedRouletteTitle}을 비활성화 했습니다."
StringResource(R.string.msg_roulette_config_deactivate_success, rouletteNumber)
}
} else {
"${selectedRouletteTitle}을 변경했습니다."
StringResource(R.string.msg_roulette_config_update_success, rouletteNumber)
}
compositeDisposable.add(
@@ -211,10 +215,10 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
onSuccess(it.data)
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
_toastLiveData.postValue(DynamicString(it.message))
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
StringResource(R.string.common_error_unknown)
)
}
}
@@ -222,7 +226,7 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_toastLiveData.postValue(StringResource(R.string.common_error_unknown))
}
)
)
@@ -240,20 +244,22 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
items = items
)
val selectedRouletteTitle = when (_selectedRouletteLiveData.value!!) {
SelectedRoulette.ROULETTE_1 -> "룰렛 1"
SelectedRoulette.ROULETTE_2 -> "룰렛 2"
SelectedRoulette.ROULETTE_3 -> "룰렛 3"
}
val rouletteNumber = _selectedRouletteLiveData.value!!.ordinal + 1
val successMessage = if (availableActive) {
if (isActive) {
"${selectedRouletteTitle}로 설정하였습니다."
StringResource(
R.string.msg_roulette_config_create_activate_success,
rouletteNumber
)
} else {
"${selectedRouletteTitle}을 설정했습니다."
StringResource(
R.string.msg_roulette_config_create_deactivate_success,
rouletteNumber
)
}
} else {
"${selectedRouletteTitle}을 생성했습니다."
StringResource(R.string.msg_roulette_config_create_success, rouletteNumber)
}
compositeDisposable.add(
@@ -271,10 +277,10 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
onSuccess(it.data)
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
_toastLiveData.postValue(DynamicString(it.message))
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
StringResource(R.string.common_error_unknown)
)
}
}
@@ -282,7 +288,7 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_toastLiveData.postValue(StringResource(R.string.common_error_unknown))
}
)
)
@@ -307,10 +313,10 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
selectRoulette(SelectedRoulette.ROULETTE_1)
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
_toastLiveData.postValue(DynamicString(it.message))
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
StringResource(R.string.common_error_unknown)
)
}
}
@@ -319,7 +325,7 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_toastLiveData.postValue(StringResource(R.string.common_error_unknown))
}
)
)
@@ -334,12 +340,14 @@ class RouletteSettingsViewModel(private val repository: RouletteRepository) : Ba
selectedRoulette == SelectedRoulette.ROULETTE_3
)
) {
_toastLiveData.value = "룰렛 1을 먼저 설정하세요"
_toastLiveData.value =
StringResource(R.string.msg_roulette_config_first_required)
return
}
if (rouletteList.size == 1 && selectedRoulette == SelectedRoulette.ROULETTE_3) {
_toastLiveData.value = "룰렛 1과 룰렛 2를 먼저 설정하세요"
_toastLiveData.value =
StringResource(R.string.msg_roulette_config_first_second_required)
return
}