diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/CanChargeActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/CanChargeActivity.kt index dd54d280..cda0a685 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/CanChargeActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/CanChargeActivity.kt @@ -53,7 +53,7 @@ class CanChargeActivity : BaseActivity( } private fun setupToolbar() { - binding.toolbar.tvBack.text = "충전하기" + binding.toolbar.tvBack.text = getString(R.string.screen_can_charge_title) binding.toolbar.tvBack.setOnClickListener { finish() } } @@ -61,8 +61,8 @@ class CanChargeActivity : BaseActivity( val tabs = binding.tabs tabs.visibility = View.VISIBLE - tabs.addTab(tabs.newTab().setText("PG")) - tabs.addTab(tabs.newTab().setText("인 앱 결제")) + tabs.addTab(tabs.newTab().setText(R.string.screen_can_charge_tab_pg)) + tabs.addTab(tabs.newTab().setText(R.string.screen_can_charge_tab_iap)) tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapAdapter.kt index cd0205e2..5e49c325 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapAdapter.kt @@ -27,7 +27,7 @@ class CanChargeIapAdapter( val typeface = ResourcesCompat.getFont(context, R.font.gmarket_sans_medium) binding.tvTitle.text = item.name.fontSpan( typeface, - "캔" + context.getString(R.string.screen_can_status_unit) ) binding.root.setOnClickListener { onClick(item) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapFragment.kt index 6b5e62b2..d5cb124a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapFragment.kt @@ -21,6 +21,7 @@ import com.android.billingclient.api.Purchase import com.android.billingclient.api.PurchasesUpdatedListener import com.android.billingclient.api.QueryProductDetailsParams import com.android.billingclient.api.QueryPurchasesParams +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager @@ -69,7 +70,10 @@ class CanChargeIapFragment : BaseFragment( } viewModel.toastLiveData.observe(viewLifecycleOwner) { - Toast.makeText(requireActivity(), it, Toast.LENGTH_LONG).show() + val message = it?.resId?.let(::getString) ?: it?.message + message?.let { text -> + Toast.makeText(requireActivity(), text, Toast.LENGTH_LONG).show() + } } } @@ -131,30 +135,30 @@ class CanChargeIapFragment : BaseFragment( } } else { selectedProductDetails = null - viewModel.showToast("구매 정보를 확인할 수 없습니다. 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_purchase_info_missing) } } BillingClient.BillingResponseCode.USER_CANCELED -> { selectedProductDetails = null - viewModel.showToast("구매를 취소했습니다.") + viewModel.showToast(resId = R.string.msg_can_charge_purchase_canceled) } BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED -> { selectedProductDetails = null queryAndConsumeUnconsumedPurchases() - viewModel.showToast("이전에 완료되지 않은 구매를 정리했습니다. 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_purchase_cleanup) } BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE, BillingClient.BillingResponseCode.SERVICE_DISCONNECTED -> { selectedProductDetails = null - viewModel.showToast("결제 서비스 연결이 원활하지 않습니다. 네트워크 상태를 확인 후 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_service_disconnected) } else -> { selectedProductDetails = null - viewModel.showToast("구매를 하지 못했습니다. 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_purchase_failed) } } } @@ -174,7 +178,7 @@ class CanChargeIapFragment : BaseFragment( billingClient.startConnection(object : BillingClientStateListener { override fun onBillingServiceDisconnected() { - viewModel.showToast("인 앱 결제 이용이 불가능 합니다. 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_unavailable) viewModel.setLoading(false) } @@ -182,7 +186,7 @@ class CanChargeIapFragment : BaseFragment( if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { queryAndConsumeUnconsumedPurchases() } else { - viewModel.showToast("인 앱 결제 이용이 불가능 합니다. 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_unavailable) viewModel.setLoading(false) } } @@ -216,7 +220,7 @@ class CanChargeIapFragment : BaseFragment( if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { handler.post { adapter.addItems(result.productDetailsList) } } else { - viewModel.showToast("인 앱 결제 이용이 불가능 합니다. 다시 시도해 주세요.") + viewModel.showToast(resId = R.string.msg_can_charge_unavailable) } viewModel.setLoading(false) @@ -279,7 +283,7 @@ class CanChargeIapFragment : BaseFragment( private fun onPurchaseConsumed(chargeCan: Int) { handler.post { selectedProductDetails = null - viewModel.showToast("캔이 충전되었습니다") + viewModel.showToast(resId = R.string.msg_can_charge_success) SharedPreferenceManager.can += chargeCan if (activity != null) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapViewModel.kt index 24f7bdbd..8f887fde 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/iap/CanChargeIapViewModel.kt @@ -8,12 +8,14 @@ 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.ToastMessage import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.mypage.can.CanRepository class CanChargeIapViewModel(private val repository: CanRepository) : BaseViewModel() { - private val _toastLiveData = MutableLiveData() - val toastLiveData: LiveData + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData get() = _toastLiveData private var _isLoading = MutableLiveData(false) @@ -53,27 +55,26 @@ class CanChargeIapViewModel(private val repository: CanRepository) : BaseViewMod if (it.success) { onSuccess(selectedProductDetails.description.toInt()) } else { - if (it.message != null) { - _toastLiveData.value = it.message - } else { - _toastLiveData.value = "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." - } + _toastLiveData.value = it.message?.let { message -> + ToastMessage(message = message) + } ?: ToastMessage(resId = R.string.common_error_unknown) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.value = "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + _toastLiveData.value = ToastMessage(resId = R.string.common_error_unknown) } ) ) } else { - _toastLiveData.value = "구매를 하지 못했습니다.\n고객센터로 문의해 주시기 바랍니다." + _toastLiveData.value = + ToastMessage(resId = R.string.msg_can_charge_purchase_not_found) } } - fun showToast(message: String) { - _toastLiveData.value = message + fun showToast(message: String? = null, resId: Int? = null) { + _toastLiveData.value = ToastMessage(resId = resId, message = message) } fun setLoading(isLoading: Boolean) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgAdapter.kt index 7d2e8321..9394ef10 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgAdapter.kt @@ -28,7 +28,7 @@ class CanChargePgAdapter( val typeface = ResourcesCompat.getFont(context, R.font.gmarket_sans_medium) binding.tvTitle.text = canCharge.title.fontSpan( typeface, - "캔" + context.getString(R.string.screen_can_status_unit) ) binding.root.setOnClickListener { onClick(canCharge) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgFragment.kt index 5354dcb2..1b9e78db 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgFragment.kt @@ -87,7 +87,10 @@ class CanChargePgFragment : BaseFragment( } viewModel.toastLiveData.observe(viewLifecycleOwner) { - it?.let { Toast.makeText(requireActivity(), it, Toast.LENGTH_LONG).show() } + val message = it?.resId?.let(::getString) ?: it?.message + message?.let { text -> + Toast.makeText(requireActivity(), text, Toast.LENGTH_LONG).show() + } } viewModel.isLoading.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgViewModel.kt index 73397ba4..6474d84a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/charge/pg/CanChargePgViewModel.kt @@ -6,7 +6,9 @@ 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.ToastMessage import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.mypage.can.CanRepository class CanChargePgViewModel(private val repository: CanRepository) : BaseViewModel() { @@ -14,8 +16,8 @@ class CanChargePgViewModel(private val repository: CanRepository) : BaseViewMode val canChargeLiveData: LiveData> get() = _canChargesLiveData - private val _toastLiveData = MutableLiveData() - val toastLiveData: LiveData + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData get() = _toastLiveData private var _isLoading = MutableLiveData(false) @@ -34,19 +36,17 @@ class CanChargePgViewModel(private val repository: CanRepository) : BaseViewMode if (it.success && it.data != null) { _canChargesLiveData.postValue(it.data!!) } else { - if (it.message != null) { - _toastLiveData.postValue(it.message) - } else { - _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." - ) - } + _toastLiveData.postValue( + it.message?.let { message -> + ToastMessage(message = message) + } ?: ToastMessage(resId = R.string.common_error_unknown) + ) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(ToastMessage(resId = R.string.common_error_unknown)) } ) ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt index cbefe0a2..c3004a8a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/charge/CanChargeStatusFragment.kt @@ -78,7 +78,10 @@ class CanChargeStatusFragment( } viewModel.toastLiveData.observe(viewLifecycleOwner) { - it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + val message = it?.resId?.let(::getString) ?: it?.message + message?.let { text -> + Toast.makeText(requireContext(), text, Toast.LENGTH_LONG).show() + } } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt index b86d0983..25ff878b 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/status/use/CanUseStatusFragment.kt @@ -77,7 +77,10 @@ class CanUseStatusFragment( } viewModel.toastLiveData.observe(viewLifecycleOwner) { - it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + val message = it?.resId?.let(::getString) ?: it?.message + message?.let { text -> + Toast.makeText(requireContext(), text, Toast.LENGTH_LONG).show() + } } } } diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 4df14e22..72e35f51 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -370,6 +370,18 @@ Reward cans cans Top up + + Top up + PG + In-app purchase + Could not confirm purchase info. Please try again. + Purchase cancelled. + Cleaned up unfinished purchases. Please try again. + Payment service is unstable. Check your network and try again. + Purchase failed. Please try again. + In-app purchases are unavailable. Please try again. + Cans charged. + Purchase failed.\nPlease contact customer support. Customer service VoiceOn Customer Service diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 08068c60..cca0326a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -370,6 +370,18 @@ リワードCAN CAN チャージする + + チャージ + PG + アプリ内決済 + 購入情報を確認できません。もう一度お試しください。 + 購入をキャンセルしました。 + 完了していない購入を整理しました。もう一度お試しください。 + 決済サービスに接続できません。ネットワーク状態を確認してもう一度お試しください。 + 購入に失敗しました。もう一度お試しください。 + アプリ内決済を利用できません。もう一度お試しください。 + CANをチャージしました。 + 購入に失敗しました。\nカスタマーセンターにお問い合わせください。 カスタマーセンター VoiceOn カスタマーセンター diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9098225c..e3ffa679 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -369,6 +369,18 @@ 리워드 캔 충전하기 + + 충전하기 + PG + 인 앱 결제 + 구매 정보를 확인할 수 없습니다. 다시 시도해 주세요. + 구매를 취소했습니다. + 이전에 완료되지 않은 구매를 정리했습니다. 다시 시도해 주세요. + 결제 서비스 연결이 원활하지 않습니다. 네트워크 상태를 확인 후 다시 시도해 주세요. + 구매를 하지 못했습니다. 다시 시도해 주세요. + 인 앱 결제 이용이 불가능 합니다. 다시 시도해 주세요. + 캔이 충전되었습니다 + 구매를 하지 못했습니다.\n고객센터로 문의해 주시기 바랍니다. 고객센터 보이스온 고객센터