오디션 상세 문자열 리소스화

This commit is contained in:
2025-12-01 15:19:01 +09:00
parent e9afa55aa0
commit 159a5ae8b3
11 changed files with 110 additions and 36 deletions

View File

@@ -13,6 +13,7 @@ import androidx.media3.common.util.UnstableApi
import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
import java.io.IOException
import kr.co.vividnext.sodalive.R
@OptIn(UnstableApi::class)
class AuditionApplicantMediaPlayerManager(
@@ -101,7 +102,11 @@ class AuditionApplicantMediaPlayerManager(
}
} catch (e: IOException) {
e.printStackTrace()
Toast.makeText(context, "콘텐츠를 재생하지 못했습니다.\n다시 시도해 주세요", Toast.LENGTH_SHORT).show()
Toast.makeText(
context,
context.getString(R.string.screen_audition_play_error),
Toast.LENGTH_SHORT
).show()
showLoadingDialog(false)
}

View File

@@ -11,6 +11,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kr.co.vividnext.sodalive.databinding.FragmentAuditionApplyDialogBinding
import kr.co.vividnext.sodalive.R
class AuditionApplyDialogFragment(
private val fileName: String,
@@ -59,13 +60,13 @@ class AuditionApplyDialogFragment(
if (phoneNumber.isBlank() || phoneNumber.length != 11) {
Toast.makeText(
activity,
"잘못된 연락처 입니다.\n다시 입력해 주세요.",
getString(R.string.dialog_audition_apply_error_invalid_phone),
Toast.LENGTH_LONG
).show()
} else if (!binding.tvAgree.isSelected) {
Toast.makeText(
activity,
"연락처 수집 및 활용에 동의하셔야 오디션 지원이 가능합니다.",
getString(R.string.dialog_audition_apply_error_need_agreement),
Toast.LENGTH_LONG
).show()
} else {

View File

@@ -7,8 +7,6 @@ import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import coil.load
import coil.transform.RoundedCornersTransformation
import com.bumptech.glide.Glide
import com.bumptech.glide.load.MultiTransformation
import com.bumptech.glide.load.resource.bitmap.CenterCrop
@@ -19,6 +17,7 @@ import kr.co.vividnext.sodalive.audition.role.AuditionRoleDetailActivity
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.common.ToastMessage
import kr.co.vividnext.sodalive.databinding.ActivityAuditionDetailBinding
import kr.co.vividnext.sodalive.extensions.dpToPx
import org.koin.android.ext.android.inject
@@ -40,7 +39,7 @@ class AuditionDetailActivity : BaseActivity<ActivityAuditionDetailBinding>(
if (auditionId <= 0) {
Toast.makeText(
applicationContext,
"잘못된 요청입니다.\n다시 시도해 주세요.",
getString(R.string.screen_audition_error_invalid_request),
Toast.LENGTH_LONG
).show()
@@ -60,7 +59,7 @@ class AuditionDetailActivity : BaseActivity<ActivityAuditionDetailBinding>(
isOpenInformation = !isOpenInformation
if (isOpenInformation) {
binding.tvInformation.maxLines = Int.MAX_VALUE
binding.tvOpen.text = "접기"
binding.tvOpen.text = getString(R.string.screen_audition_detail_collapse)
binding.tvOpen.setCompoundDrawablesWithIntrinsicBounds(
R.drawable.ic_live_detail_top,
0,
@@ -69,7 +68,7 @@ class AuditionDetailActivity : BaseActivity<ActivityAuditionDetailBinding>(
)
} else {
binding.tvInformation.maxLines = 3
binding.tvOpen.text = "펼치기"
binding.tvOpen.text = getString(R.string.screen_audition_detail_expand)
binding.tvOpen.setCompoundDrawablesWithIntrinsicBounds(
R.drawable.ic_live_detail_bottom,
0,
@@ -125,8 +124,13 @@ class AuditionDetailActivity : BaseActivity<ActivityAuditionDetailBinding>(
}
private fun bindData() {
viewModel.toastLiveData.observe(this) {
it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
viewModel.toastLiveData.observe(this) { toastMessage ->
toastMessage?.let {
val message = it.message ?: it.resId?.let(::getString)
message?.let { text ->
Toast.makeText(applicationContext, text, Toast.LENGTH_LONG).show()
}
}
}
viewModel.isLoading.observe(this) {

View File

@@ -60,11 +60,11 @@ class AuditionDetailRoleAdapter(
if (item.isComplete) {
binding.blackCover.visibility = View.VISIBLE
binding.tvStatus.text = "모집완료"
binding.tvStatus.text = context.getString(R.string.screen_audition_status_closed)
binding.tvStatus.setBackgroundResource(R.drawable.bg_round_corner_13_3_909090)
} else {
binding.blackCover.visibility = View.GONE
binding.tvStatus.text = "모집중"
binding.tvStatus.text = context.getString(R.string.screen_audition_status_open)
binding.tvStatus.setBackgroundResource(R.drawable.bg_round_corner_13_3_3bb9f1)
}

View File

@@ -7,13 +7,15 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.audition.AuditionRepository
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
class AuditionDetailViewModel(
private val repository: AuditionRepository
) : BaseViewModel() {
private val _toastLiveData = MutableLiveData<String?>()
val toastLiveData: LiveData<String?>
private val _toastLiveData = MutableLiveData<ToastMessage?>()
val toastLiveData: LiveData<ToastMessage?>
get() = _toastLiveData
private var _isLoading = MutableLiveData(false)
@@ -39,10 +41,10 @@ class AuditionDetailViewModel(
_auditionDetailLiveData.value = it.data
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
_toastLiveData.postValue(ToastMessage(message = it.message))
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
ToastMessage(resId = R.string.common_error_unknown)
)
}
@@ -56,7 +58,9 @@ class AuditionDetailViewModel(
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_toastLiveData.postValue(
ToastMessage(resId = R.string.common_error_unknown)
)
if (onFailure != null) {
onFailure()
}

View File

@@ -47,7 +47,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="오디션 정보"
android:text="@string/screen_audition_detail_info_title"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp"
app:layout_constraintEnd_toEndOf="parent"
@@ -75,7 +75,7 @@
android:drawablePadding="6.7dp"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="center"
android:text="펼치기"
android:text="@string/screen_audition_detail_expand"
android:textColor="@color/color_bbbbbb"
android:textSize="12sp"
app:drawableStartCompat="@drawable/ic_live_detail_bottom"
@@ -89,7 +89,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="오디션 캐릭터"
android:text="@string/screen_audition_detail_roles_title"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />

View File

@@ -23,7 +23,7 @@
android:layout_marginTop="33.3dp"
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:text="오디션 지원방식"
android:text="@string/dialog_audition_method_title"
android:textColor="@color/color_bbbbbb"
android:textSize="18.3sp"
app:layout_constraintEnd_toEndOf="parent"
@@ -60,7 +60,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="파일 업로드"
android:text="@string/dialog_audition_method_upload"
android:textColor="@color/color_3bb9f1"
android:textSize="14.7sp" />
</LinearLayout>
@@ -86,7 +86,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="바로 녹음"
android:text="@string/dialog_audition_method_record"
android:textColor="@color/color_3bb9f1"
android:textSize="14.7sp" />
</LinearLayout>
@@ -97,7 +97,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="※ 파일은 mp3, aac만 업로드 가능"
android:text="@string/dialog_audition_method_note"
android:textColor="@color/color_777777"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"

View File

@@ -21,7 +21,7 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:fontFamily="@font/gmarket_sans_medium"
android:text="오디션 지원"
android:text="@string/dialog_audition_apply_title"
android:textColor="@color/white"
android:textSize="18.3sp" />
@@ -39,7 +39,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="녹음파일"
android:text="@string/dialog_audition_apply_audio_file_title"
android:textColor="@color/color_eeeeee"
android:textSize="16.7sp" />
@@ -72,7 +72,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="연락처"
android:text="@string/dialog_audition_apply_phone_title"
android:textColor="@color/color_eeeeee"
android:textSize="16.7sp" />
@@ -83,7 +83,7 @@
android:layout_marginTop="10dp"
android:background="@drawable/bg_round_corner_5_3_13181b"
android:fontFamily="@font/gmarket_sans_medium"
android:hint="합격시 연락받을 연락처를 남겨주세요"
android:hint="@string/dialog_audition_apply_phone_hint"
android:importantForAutofill="no"
android:inputType="numberSigned"
android:maxEms="12"
@@ -117,7 +117,7 @@
android:layout_marginStart="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:lineSpacingMultiplier="1.25"
android:text="보이스온 오디오 드라마 오디션 합격시 개인 연락을 위한 개인 정보(연락처) 수집 및 활용에 동의합니다.\n오디션 지원자는 개인정보 수집 및 활용 동의에 거부할 권리가 있으며 비동의시 오디션 지원은 취소 됩니다."
android:text="@string/dialog_audition_apply_agreement"
android:textColor="@color/color_eeeeee"
android:textSize="13.3sp" />
</LinearLayout>
@@ -131,7 +131,7 @@
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:paddingVertical="13.3dp"
android:text="오디션 지원하기"
android:text="@string/dialog_audition_apply_submit"
android:textColor="@color/white"
android:textSize="13.3sp" />
</LinearLayout>

View File

@@ -192,6 +192,26 @@
<string name="screen_audition_total_count">Total %1$d</string>
<string name="screen_audition_how_to_use">How to use VoiceOn audition</string>
<string name="screen_audition_how_to_use_more">See details&gt;</string>
<string name="screen_audition_error_invalid_request">Invalid request.\nPlease try again.</string>
<string name="screen_audition_detail_info_title">Audition info</string>
<string name="screen_audition_detail_roles_title">Audition roles</string>
<string name="screen_audition_detail_expand">Expand</string>
<string name="screen_audition_detail_collapse">Collapse</string>
<string name="screen_audition_status_open">Open</string>
<string name="screen_audition_status_closed">Closed</string>
<string name="dialog_audition_method_title">How to apply</string>
<string name="dialog_audition_method_upload">Upload file</string>
<string name="dialog_audition_method_record">Record now</string>
<string name="dialog_audition_method_note">※ Only mp3 or aac files can be uploaded</string>
<string name="dialog_audition_apply_title">Apply for audition</string>
<string name="dialog_audition_apply_audio_file_title">Recording file</string>
<string name="dialog_audition_apply_phone_title">Contact</string>
<string name="dialog_audition_apply_phone_hint">Leave a contact number for results</string>
<string name="dialog_audition_apply_agreement">I agree to the collection and use of my personal contact information for notification if I pass the VoiceOn audio drama audition.\nYou may refuse to consent, but the audition application will be canceled if you do not agree.</string>
<string name="dialog_audition_apply_submit">Submit audition application</string>
<string name="dialog_audition_apply_error_invalid_phone">Invalid contact number.\nPlease try again.</string>
<string name="dialog_audition_apply_error_need_agreement">You must agree to the collection and use of contact information to apply for the audition.</string>
<string name="screen_audition_play_error">Could not play the content.\nPlease try again.</string>
<!-- Settings / Notices / Events -->
<string name="screen_settings_title">Settings</string>

View File

@@ -192,6 +192,26 @@
<string name="screen_audition_total_count">合計 %1$d件</string>
<string name="screen_audition_how_to_use">ボイスオンオーディションの利用方法</string>
<string name="screen_audition_how_to_use_more">詳しく&gt;</string>
<string name="screen_audition_error_invalid_request">不正なリクエストです。\nもう一度お試しください。</string>
<string name="screen_audition_detail_info_title">オーディション情報</string>
<string name="screen_audition_detail_roles_title">オーディションキャラクター</string>
<string name="screen_audition_detail_expand">展開</string>
<string name="screen_audition_detail_collapse">閉じる</string>
<string name="screen_audition_status_open">募集中</string>
<string name="screen_audition_status_closed">募集終了</string>
<string name="dialog_audition_method_title">オーディション応募方法</string>
<string name="dialog_audition_method_upload">ファイルアップロード</string>
<string name="dialog_audition_method_record">すぐ録音</string>
<string name="dialog_audition_method_note">※ファイルはmp3, aacのみアップロード可能</string>
<string name="dialog_audition_apply_title">オーディション応募</string>
<string name="dialog_audition_apply_audio_file_title">録音ファイル</string>
<string name="dialog_audition_apply_phone_title">連絡先</string>
<string name="dialog_audition_apply_phone_hint">合格時に連絡を受ける電話番号を入力してください</string>
<string name="dialog_audition_apply_agreement">ボイスオンオーディオドラマオーディション合格時の連絡のため、連絡先の収集・利用に同意します。\nオーディション応募者は同意を拒否する権利がありますが、同意しない場合応募はキャンセルされます。</string>
<string name="dialog_audition_apply_submit">オーディションに応募する</string>
<string name="dialog_audition_apply_error_invalid_phone">正しくない連絡先です。\nもう一度入力してください。</string>
<string name="dialog_audition_apply_error_need_agreement">連絡先の収集および利用に同意する必要があります。</string>
<string name="screen_audition_play_error">コンテンツを再生できませんでした。\nもう一度お試しください</string>
<!-- Settings / Notices / Events -->
<string name="screen_settings_title">設定</string>

View File

@@ -191,6 +191,26 @@
<string name="screen_audition_total_count">총 %1$d개</string>
<string name="screen_audition_how_to_use">보이스온 오디션 이용방법</string>
<string name="screen_audition_how_to_use_more">자세히&gt;</string>
<string name="screen_audition_error_invalid_request">잘못된 요청입니다.\n다시 시도해 주세요.</string>
<string name="screen_audition_detail_info_title">오디션 정보</string>
<string name="screen_audition_detail_roles_title">오디션 캐릭터</string>
<string name="screen_audition_detail_expand">펼치기</string>
<string name="screen_audition_detail_collapse">접기</string>
<string name="screen_audition_status_open">모집중</string>
<string name="screen_audition_status_closed">모집완료</string>
<string name="dialog_audition_method_title">오디션 지원방식</string>
<string name="dialog_audition_method_upload">파일 업로드</string>
<string name="dialog_audition_method_record">바로 녹음</string>
<string name="dialog_audition_method_note">※ 파일은 mp3, aac만 업로드 가능</string>
<string name="dialog_audition_apply_title">오디션 지원</string>
<string name="dialog_audition_apply_audio_file_title">녹음파일</string>
<string name="dialog_audition_apply_phone_title">연락처</string>
<string name="dialog_audition_apply_phone_hint">합격 시 연락받을 연락처를 남겨주세요</string>
<string name="dialog_audition_apply_agreement">보이스온 오디오 드라마 오디션 합격 시 개인 연락을 위한 개인 정보(연락처) 수집 및 활용에 동의합니다.\n오디션 지원자는 개인정보 수집 및 활용 동의에 거부할 권리가 있으며 비동의 시 오디션 지원은 취소됩니다.</string>
<string name="dialog_audition_apply_submit">오디션 지원하기</string>
<string name="dialog_audition_apply_error_invalid_phone">잘못된 연락처 입니다.\n다시 입력해 주세요.</string>
<string name="dialog_audition_apply_error_need_agreement">연락처 수집 및 활용에 동의하셔야 오디션 지원이 가능합니다.</string>
<string name="screen_audition_play_error">콘텐츠를 재생하지 못했습니다.\n다시 시도해 주세요</string>
<!-- Settings / Notices / Events -->
<string name="screen_settings_title">설정</string>