From 4c61e0facb9fc511eb7e00f97a537b3b41b4b4b8 Mon Sep 17 00:00:00 2001 From: gaeun Date: Thu, 29 Jun 2023 15:34:38 +0900 Subject: [PATCH] =?UTF-8?q?[Feature/#9]=20=EC=96=91=EB=B0=A9=ED=96=A5=20da?= =?UTF-8?q?taBinding=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EC=A0=95?= =?UTF-8?q?=EA=B7=9C=EC=8B=9D=20=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/present/loginPage/SignUpActivity.kt | 93 ++++-- .../present/viewModel/LoginPageViewModel.kt | 3 + app/src/main/res/layout/activity_signup.xml | 305 +++++++++--------- 3 files changed, 220 insertions(+), 181 deletions(-) diff --git a/app/src/main/java/org/android/go/sopt/present/loginPage/SignUpActivity.kt b/app/src/main/java/org/android/go/sopt/present/loginPage/SignUpActivity.kt index ca8e13b..ac420c5 100644 --- a/app/src/main/java/org/android/go/sopt/present/loginPage/SignUpActivity.kt +++ b/app/src/main/java/org/android/go/sopt/present/loginPage/SignUpActivity.kt @@ -1,20 +1,22 @@ package org.android.go.sopt.present.loginPage import android.content.Intent +import android.content.res.ColorStateList import android.os.Bundle -import android.text.Editable import android.view.MotionEvent +import android.view.View import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.viewModels -import org.android.go.sopt.MainActivity +import org.android.go.sopt.R import org.android.go.sopt.RequestSignUpDto import org.android.go.sopt.databinding.ActivitySignupBinding import org.android.go.sopt.present.viewModel.LoginPageViewModel import org.android.go.sopt.util.ViewModelFactory import org.android.go.sopt.util.hideKeyboard import org.android.go.sopt.util.makeToastMessage -import android.text.TextWatcher as TextWatcher +import java.util.regex.Pattern class SignUpActivity : AppCompatActivity() { @@ -26,6 +28,13 @@ class SignUpActivity : AppCompatActivity() { binding = ActivitySignupBinding.inflate(layoutInflater) setContentView(binding.root) + with(binding) { + vmSignUp = viewModel + lifecycleOwner = this@SignUpActivity + etId.doAfterTextChanged { checkValidSignUpId() } + etPassword.doAfterTextChanged { checkValidSignUpPwd() } + } + signUp() observeIsSignUpSuccess() } @@ -42,21 +51,16 @@ class SignUpActivity : AppCompatActivity() { } private fun signUp() { - canClickButton() binding.btnSignup.setOnClickListener { - if (binding.etId.text.length in 6..10 && binding.etPassword.text.length in 8..12) { - with(binding) { - viewModel.signUp( - RequestSignUpDto( - etId.text.toString(), - etPassword.text.toString(), - etName.text.toString(), - etSpeciality.text.toString(), - ), - ) - } - } else { - makeToastMessage("회원가입 조건 미충족") + with(binding) { + viewModel.signUp( + RequestSignUpDto( + etId.text.toString(), + etPassword.text.toString(), + etName.text.toString(), + etSpeciality.text.toString(), + ), + ) } } } @@ -75,28 +79,47 @@ class SignUpActivity : AppCompatActivity() { } } - private fun canClickButton() { - with(binding) { - btnSignup.isEnabled = false - - val textWatcher: TextWatcher = object : TextWatcher { - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - } + private fun checkValidSignUpId(): Boolean { + var correctId = false - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - if (etId.text.length in 6..10 && etPassword.text.length in 8..12) { - btnSignup.isEnabled = true - } - } + val idPattern = "^(?=.*\\d)(?=.*[a-zA-Z]).{6,10}\$" - override fun afterTextChanged(p0: Editable?) { - } + viewModel.signUpId.observe(this) { id -> + correctId = Pattern.matches(idPattern, id) + if (!correctId) { + binding.tvIdWarn.visibility = View.VISIBLE + correctId = false + binding.etId.backgroundTintList = ColorStateList.valueOf(getColor(R.color.red_500)) + } else { + binding.tvIdWarn.visibility = View.GONE + correctId = true + binding.etId.backgroundTintList = ColorStateList.valueOf(getColor(R.color.black)) } + } - etId.addTextChangedListener(textWatcher) - etPassword.addTextChangedListener(textWatcher) - etName.addTextChangedListener(textWatcher) - etSpeciality.addTextChangedListener(textWatcher) + return correctId + } + + private fun checkValidSignUpPwd(): Boolean { + var correctPw = false + + val pwPattern = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[\$@\$!%*#?&]).{6,12}\$" + + viewModel.signUpPwd.observe(this) { pwd -> + correctPw = Pattern.matches(pwPattern, pwd) + if (!correctPw) { + binding.tvPwWarn.visibility = View.VISIBLE + correctPw = false + binding.etPassword.backgroundTintList = + ColorStateList.valueOf(getColor(R.color.red_500)) + } else { + binding.tvPwWarn.visibility = View.GONE + correctPw = true + binding.etPassword.backgroundTintList = + ColorStateList.valueOf(getColor(R.color.black)) + } } + + return correctPw } } diff --git a/app/src/main/java/org/android/go/sopt/present/viewModel/LoginPageViewModel.kt b/app/src/main/java/org/android/go/sopt/present/viewModel/LoginPageViewModel.kt index 94051f4..c935ef8 100644 --- a/app/src/main/java/org/android/go/sopt/present/viewModel/LoginPageViewModel.kt +++ b/app/src/main/java/org/android/go/sopt/present/viewModel/LoginPageViewModel.kt @@ -23,6 +23,9 @@ class LoginPageViewModel(private val loginPageRepoImpl: LoginPageRepoImpl) : Vie private val _getMyProfile = MutableLiveData() val getMyProfile: LiveData get() = _getMyProfile + val signUpId: MutableLiveData = MutableLiveData("") + val signUpPwd: MutableLiveData = MutableLiveData("") + fun login(request: RequestLogInDto) = viewModelScope.launch { kotlin.runCatching { loginPageRepoImpl.login(request) diff --git a/app/src/main/res/layout/activity_signup.xml b/app/src/main/res/layout/activity_signup.xml index b3768e1..75ae5e4 100644 --- a/app/src/main/res/layout/activity_signup.xml +++ b/app/src/main/res/layout/activity_signup.xml @@ -1,148 +1,161 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -