FindPassword 문자열 리소스화

비밀번호 재설정 안내/버튼/토스트를 ko/en/ja 리소스로 추가

UI 메시지 클래스로 리소스 기반 토스트 처리
This commit is contained in:
2025-12-01 14:06:25 +09:00
parent 1889c6ae10
commit 981859de1f
6 changed files with 56 additions and 20 deletions

View File

@@ -7,6 +7,7 @@ import android.widget.Toast
import com.jakewharton.rxbinding4.widget.textChanges import com.jakewharton.rxbinding4.widget.textChanges
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.databinding.ActivityFindPasswordBinding import kr.co.vividnext.sodalive.databinding.ActivityFindPasswordBinding
@@ -27,7 +28,7 @@ class FindPasswordActivity : BaseActivity<ActivityFindPasswordBinding>(
override fun setupView() { override fun setupView() {
loadingDialog = LoadingDialog(this, layoutInflater) loadingDialog = LoadingDialog(this, layoutInflater)
binding.toolbar.tvBack.text = "비밀번호 재설정" binding.toolbar.tvBack.text = getString(R.string.title_find_password)
binding.toolbar.tvBack.setOnClickListener { finish() } binding.toolbar.tvBack.setOnClickListener { finish() }
binding.tvServiceCenter.setOnClickListener { binding.tvServiceCenter.setOnClickListener {
@@ -52,8 +53,13 @@ class FindPasswordActivity : BaseActivity<ActivityFindPasswordBinding>(
} }
) )
viewModel.toastLiveData.observe(this) { viewModel.toastLiveData.observe(this) { message ->
it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() } val text = when (message) {
is FindPasswordUiMessage.Text -> message.value
is FindPasswordUiMessage.Resource -> getString(message.resId)
null -> null
}
text?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
} }
viewModel.isLoading.observe(this) { viewModel.isLoading.observe(this) {

View File

@@ -1,10 +1,12 @@
package kr.co.vividnext.sodalive.user.find_password package kr.co.vividnext.sodalive.user.find_password
import androidx.annotation.StringRes
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.orhanobut.logger.Logger import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.user.UserRepository import kr.co.vividnext.sodalive.user.UserRepository
@@ -16,13 +18,15 @@ class FindPasswordViewModel(private val repository: UserRepository) : BaseViewMo
val isLoading: LiveData<Boolean> val isLoading: LiveData<Boolean>
get() = _isLoading get() = _isLoading
private val _toastLiveData = MutableLiveData<String?>() private val _toastLiveData = MutableLiveData<FindPasswordUiMessage?>()
val toastLiveData: LiveData<String?> val toastLiveData: LiveData<FindPasswordUiMessage?>
get() = _toastLiveData get() = _toastLiveData
fun findPassword(onSuccess: () -> Unit) { fun findPassword(onSuccess: () -> Unit) {
if (email.isBlank()) { if (email.isBlank()) {
_toastLiveData.postValue("이메일을 입력하세요.") _toastLiveData.postValue(
FindPasswordUiMessage.Resource(R.string.login_error_email_required)
)
return return
} }
@@ -37,25 +41,30 @@ class FindPasswordViewModel(private val repository: UserRepository) : BaseViewMo
_isLoading.value = false _isLoading.value = false
if (it.success) { if (it.success) {
_toastLiveData.postValue( _toastLiveData.postValue(
"임시 비밀번호가 입력하신 이메일로 발송되었습니다. 이메일을 확인해 주세요." FindPasswordUiMessage.Resource(R.string.find_password_success)
) )
onSuccess() onSuccess()
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else { } else {
_toastLiveData.postValue( _toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." it.message?.let { message ->
FindPasswordUiMessage.Text(message)
} ?: FindPasswordUiMessage.Resource(R.string.common_error_unknown)
) )
} }
}
}, },
{ {
_isLoading.value = false _isLoading.value = false
it.message?.let { message -> Logger.e(message) } it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") _toastLiveData.postValue(
FindPasswordUiMessage.Resource(R.string.common_error_unknown)
)
} }
) )
) )
} }
} }
sealed class FindPasswordUiMessage {
data class Resource(@StringRes val resId: Int) : FindPasswordUiMessage()
data class Text(val value: String) : FindPasswordUiMessage()
}

View File

@@ -29,7 +29,7 @@
android:fontFamily="@font/gmarket_sans_bold" android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center" android:gravity="center"
android:lineSpacingExtra="6dp" android:lineSpacingExtra="6dp"
android:text="회원가입한 이메일 주소로\n임시 비밀번호를 보내드립니다." android:text="@string/find_password_description_primary"
android:textColor="@color/color_eeeeee" android:textColor="@color/color_eeeeee"
android:textSize="16sp" /> android:textSize="16sp" />
@@ -41,7 +41,7 @@
android:fontFamily="@font/gmarket_sans_medium" android:fontFamily="@font/gmarket_sans_medium"
android:gravity="center" android:gravity="center"
android:lineSpacingExtra="6dp" android:lineSpacingExtra="6dp"
android:text="임시 비밀번호로 로그인 후\n마이페이지 > 프로필 설정에서\n비밀번호를 변경하고 이용하세요." android:text="@string/find_password_description_secondary"
android:textColor="@color/color_909090" android:textColor="@color/color_909090"
android:textSize="12sp" /> android:textSize="12sp" />
@@ -65,7 +65,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:fontFamily="@font/gmarket_sans_medium" android:fontFamily="@font/gmarket_sans_medium"
android:hint="이메일을 입력하세요" android:hint="@string/find_password_email_hint"
android:importantForAutofill="no" android:importantForAutofill="no"
android:inputType="textEmailAddress" android:inputType="textEmailAddress"
android:paddingVertical="18dp" android:paddingVertical="18dp"
@@ -84,7 +84,7 @@
android:fontFamily="@font/gmarket_sans_bold" android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center" android:gravity="center"
android:paddingVertical="16dp" android:paddingVertical="16dp"
android:text="임시 비밀번호 받기" android:text="@string/find_password_submit"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="15sp" /> android:textSize="15sp" />
@@ -98,7 +98,7 @@
android:drawablePadding="13.3dp" android:drawablePadding="13.3dp"
android:paddingHorizontal="18.7dp" android:paddingHorizontal="18.7dp"
android:paddingVertical="10.7dp" android:paddingVertical="10.7dp"
android:text="고객센터로 문의하기" android:text="@string/find_password_contact_support"
android:textColor="@color/color_3bb9f1" android:textColor="@color/color_3bb9f1"
app:drawableStartCompat="@drawable/ic_headphones_blue" /> app:drawableStartCompat="@drawable/ic_headphones_blue" />
</LinearLayout> </LinearLayout>

View File

@@ -67,6 +67,13 @@
<string name="terms_of_service">Terms of Service</string> <string name="terms_of_service">Terms of Service</string>
<string name="privacy_policy">Privacy Policy</string> <string name="privacy_policy">Privacy Policy</string>
<string name="required_label">(Required)</string> <string name="required_label">(Required)</string>
<string name="title_find_password">Reset password</string>
<string name="find_password_description_primary">We will send a temporary password to your registered email.</string>
<string name="find_password_description_secondary">Log in with the temporary password, then change it in My Page &gt; Profile settings.</string>
<string name="find_password_email_hint">Enter your email</string>
<string name="find_password_submit">Get temporary password</string>
<string name="find_password_contact_support">Contact customer support</string>
<string name="find_password_success">A temporary password has been sent to your email. Please check your inbox.</string>
<string name="signup_error_email_required">Please enter your email.</string> <string name="signup_error_email_required">Please enter your email.</string>
<string name="signup_error_password_required">Please enter your password.</string> <string name="signup_error_password_required">Please enter your password.</string>
<string name="signup_error_terms_required">You must agree to the terms to sign up.</string> <string name="signup_error_terms_required">You must agree to the terms to sign up.</string>

View File

@@ -67,6 +67,13 @@
<string name="terms_of_service">利用規約</string> <string name="terms_of_service">利用規約</string>
<string name="privacy_policy">個人情報の収集・利用について</string> <string name="privacy_policy">個人情報の収集・利用について</string>
<string name="required_label">(必須)</string> <string name="required_label">(必須)</string>
<string name="title_find_password">パスワード再設定</string>
<string name="find_password_description_primary">登録したメールアドレスに仮パスワードを送信します。</string>
<string name="find_password_description_secondary">仮パスワードでログイン後、マイページ &gt; プロフィール設定でパスワードを変更してください。</string>
<string name="find_password_email_hint">メールアドレスを入力してください。</string>
<string name="find_password_submit">仮パスワードを受け取る</string>
<string name="find_password_contact_support">カスタマーセンターに問い合わせる</string>
<string name="find_password_success">仮パスワードを入力いただいたメールに送信しました。メールをご確認ください。</string>
<string name="signup_error_email_required">メールアドレスを入力してください。</string> <string name="signup_error_email_required">メールアドレスを入力してください。</string>
<string name="signup_error_password_required">パスワードを入力してください。</string> <string name="signup_error_password_required">パスワードを入力してください。</string>
<string name="signup_error_terms_required">利用規約に同意すると会員登録できます。</string> <string name="signup_error_terms_required">利用規約に同意すると会員登録できます。</string>

View File

@@ -66,6 +66,13 @@
<string name="terms_of_service">이용약관</string> <string name="terms_of_service">이용약관</string>
<string name="privacy_policy">개인정보수집 및 이용동의</string> <string name="privacy_policy">개인정보수집 및 이용동의</string>
<string name="required_label">(필수)</string> <string name="required_label">(필수)</string>
<string name="title_find_password">비밀번호 재설정</string>
<string name="find_password_description_primary">회원가입한 이메일 주소로\n임시 비밀번호를 보내드립니다.</string>
<string name="find_password_description_secondary">임시 비밀번호로 로그인 후\n마이페이지 &gt; 프로필 설정에서\n비밀번호를 변경하고 이용하세요.</string>
<string name="find_password_email_hint">이메일을 입력하세요</string>
<string name="find_password_submit">임시 비밀번호 받기</string>
<string name="find_password_contact_support">고객센터로 문의하기</string>
<string name="find_password_success">임시 비밀번호가 입력하신 이메일로 발송되었습니다. 이메일을 확인해 주세요.</string>
<string name="signup_error_email_required">이메일을 입력하세요.</string> <string name="signup_error_email_required">이메일을 입력하세요.</string>
<string name="signup_error_password_required">비밀번호를 입력하세요.</string> <string name="signup_error_password_required">비밀번호를 입력하세요.</string>
<string name="signup_error_terms_required">약관에 동의하셔야 회원가입이 가능합니다.</string> <string name="signup_error_terms_required">약관에 동의하셔야 회원가입이 가능합니다.</string>