Skip to content

5.3. 회원가입

mdb1217 edited this page Jan 15, 2021 · 3 revisions

WrittenBy

구현 방법

회원가입 Main

(1) 다양한 Listener를 사용한 예외처리

(2)LoginPatternCheckUtil 을 이용한 형식 체크

회원가입 동의

(1) 버튼 두개 체크 시에만 화면 전환

구현 코드

회원가입 Main

(1) 다양한 Listener를 사용한 예외처리

  • SignUpActivity.kt
class SignUpActivity : BaseActivity<ActivitySignUpBinding, UserViewModel>() {
    override val layoutResourceId: Int
        get() = R.layout.activity_sign_up
    override val viewModel: UserViewModel by viewModel()
    private var isValidName = false
    private var isValidEmail = false
    private var isValidPassword = false
    private var passwordSame = false
    private var passwordIsVisible = true
    private var passwordConfirmIsVisible = true

    override fun initView() {
        etColorChange()
        etAlertChange()
        visibleButtonChange()
        navigationClickEvent()
        signUpButtonClickEvent()
        setupToast(this, viewModel.toastMessage)
    }

    override fun initBeforeBinding() {

    }

    override fun initAfterBinding() {
        observeSignUpResult()
    }

    private fun etColorChange() {
        binding.etName.setOnFocusChangeListener { view, hasFocus ->
            if (hasFocus) {
                binding.clName.setBackgroundResource(R.drawable.rectangle_orange_radius_15)
                binding.tvName.setTextColor(ContextCompat.getColor(this, R.color.carrot))
            } else {
                if (binding.etName.text.isEmpty()) {
                    binding.clName.setBackgroundResource(R.drawable.rectangle_gray_radius_15)
                    binding.tvName.setTextColor(ContextCompat.getColor(this, R.color.mainBlack))
                }
            }
        }

        binding.etEmail.setOnFocusChangeListener { view, hasFocus ->
            if (hasFocus) {
                binding.clEmail.setBackgroundResource(R.drawable.rectangle_orange_radius_15)
                binding.tvEmail.setTextColor(ContextCompat.getColor(this, R.color.carrot))
            } else {
                if (binding.etEmail.text.isEmpty()) {
                    binding.clEmail.setBackgroundResource(R.drawable.rectangle_gray_radius_15)
                    binding.tvEmail.setTextColor(ContextCompat.getColor(this, R.color.mainBlack))
                }
            }
        }

        binding.etPassword.setOnFocusChangeListener { view, hasFocus ->
            if (hasFocus) {
                binding.clPassword.setBackgroundResource(R.drawable.rectangle_orange_radius_15)
                binding.ivVisibleButton.visibility = View.VISIBLE
                binding.tvPassword.setTextColor(ContextCompat.getColor(this, R.color.carrot))
            } else {
                if (binding.etPassword.text.isEmpty()) {
                    binding.clPassword.setBackgroundResource(R.drawable.rectangle_gray_radius_15)
                    binding.tvPassword.setTextColor(ContextCompat.getColor(this, R.color.mainBlack))
                    binding.ivVisibleButton.visibility = View.INVISIBLE
                }
            }
        }

        binding.etPasswordConfirm.setOnFocusChangeListener { view, hasFocus ->
            if (hasFocus) {
                binding.clPasswordConfirm.setBackgroundResource(R.drawable.rectangle_orange_radius_15)
                binding.ivVisibleButtonConfirm.visibility = View.VISIBLE
                binding.tvPasswordConfirm.setTextColor(ContextCompat.getColor(this, R.color.carrot))
            } else {
                if (binding.etPasswordConfirm.text.isEmpty()) {
                    binding.clPasswordConfirm.setBackgroundResource(R.drawable.rectangle_gray_radius_15)
                    binding.tvPasswordConfirm.setTextColor(
                        ContextCompat.getColor(
                            this,
                            R.color.mainBlack
                        )
                    )
                    binding.ivVisibleButtonConfirm.visibility = View.INVISIBLE
                }
            }
        }

    }

    private fun etAlertChange() {
        binding.etName.addTextChangedListener {
            if (LoginPatternCheckUtil.isNotValidName(binding.etName.text.toString())) {
                binding.ivAlertName.visibility = View.VISIBLE
                binding.etName.setTextColor(ContextCompat.getColor(this, R.color.mainPaleOrange))
                binding.tvAlertName.visibility = View.VISIBLE
                isValidName = false
            } else {
                binding.ivAlertName.visibility = View.INVISIBLE
                binding.tvAlertName.visibility = View.INVISIBLE
                binding.etName.setTextColor(ContextCompat.getColor(this, R.color.mainBlack))
                isValidName = true
            }
            buttonEnabled()
        }

        binding.etEmail.addTextChangedListener {
            if (LoginPatternCheckUtil.isNotValidEmail(binding.etEmail.text.toString())) {
                binding.tvAlertEmail.visibility = View.VISIBLE
                binding.tvAlertEmail.text = getString(R.string.email_alert)
                binding.etEmail.setTextColor(ContextCompat.getColor(this, R.color.mainPaleOrange))
                binding.tvAlertEmail.setTextColor(ContextCompat.getColor(this, R.color.carrot))
                binding.ivAlertEmail.visibility = View.VISIBLE
                isValidEmail = false
            } else {
                binding.tvAlertEmail.text = getString(R.string.email_alarm)
                binding.ivAlertEmail.visibility = View.INVISIBLE
                binding.tvAlertEmail.setTextColor(ContextCompat.getColor(this, R.color.mainGray))
                binding.etEmail.setTextColor(ContextCompat.getColor(this, R.color.mainBlack))
                isValidEmail = true
            }
            buttonEnabled()
        }

        binding.etPassword.addTextChangedListener {
            if (LoginPatternCheckUtil.isNotValidPassword(binding.etPassword.text.toString())) {
                isValidPassword = false
                binding.ivAlertPassword.visibility = View.VISIBLE
                binding.tvPasswordAlert.visibility = View.VISIBLE
                binding.tvPasswordAlert.text = getString(R.string.password_alert)
            } else {
                isValidPassword = true
                binding.ivAlertPassword.visibility = View.INVISIBLE
                binding.tvPasswordAlert.visibility = View.INVISIBLE
                if (!LoginPatternCheckUtil.isPasswordCheckSuccess(
                        binding.etPassword.text.toString(),
                        binding.etPasswordConfirm.text.toString()
                    )
                ) {
                    binding.ivAlertPassword.visibility = View.VISIBLE
                    binding.tvPasswordAlert.visibility = View.VISIBLE
                    binding.tvPasswordAlert.text = getString(R.string.password_dismatch)
                    passwordSame = false
                } else {
                    binding.ivAlertPassword.visibility = View.INVISIBLE
                    binding.tvPasswordAlert.visibility = View.INVISIBLE
                    passwordSame = true
                }
            }
            buttonEnabled()
        }

        binding.etPasswordConfirm.addTextChangedListener {
            if (isValidPassword) {
                if (!LoginPatternCheckUtil.isPasswordCheckSuccess(
                        binding.etPassword.text.toString(),
                        binding.etPasswordConfirm.text.toString()
                    )
                ) {
                    binding.ivAlertPassword.visibility = View.VISIBLE
                    binding.tvPasswordAlert.visibility = View.VISIBLE
                    binding.tvPasswordAlert.text = getString(R.string.password_dismatch)
                    passwordSame = false
                } else {
                    binding.ivAlertPassword.visibility = View.INVISIBLE
                    binding.tvPasswordAlert.visibility = View.INVISIBLE
                    passwordSame = true
                }
                buttonEnabled()
            }
        }
    }

    private fun visibleButtonChange() {
        binding.ivVisibleButton.setOnClickListener {
            if (passwordIsVisible) {
                binding.ivVisibleButton.setBackgroundResource(R.drawable.ic_visible)
                binding.etPassword.transformationMethod = HideReturnsTransformationMethod.getInstance()
                passwordIsVisible = false
            } else {
                binding.ivVisibleButton.setBackgroundResource(R.drawable.ic_invisible)
                binding.etPassword.transformationMethod = PasswordTransformationMethod.getInstance()
                passwordIsVisible = true
            }
        }

        binding.ivVisibleButtonConfirm.setOnClickListener {
            if (passwordConfirmIsVisible) {
                binding.ivVisibleButtonConfirm.setBackgroundResource(R.drawable.ic_visible)
                binding.etPasswordConfirm.transformationMethod =
                    HideReturnsTransformationMethod.getInstance()
                passwordConfirmIsVisible = false
            } else {
                binding.ivVisibleButtonConfirm.setBackgroundResource(R.drawable.ic_invisible)
                binding.etPasswordConfirm.transformationMethod =
                    PasswordTransformationMethod.getInstance()
                passwordConfirmIsVisible = true
            }
        }
    }

    private fun navigationClickEvent() {
        binding.tbSignUp.setNavigationOnClickListener {
            finish()
        }
    }

    private fun buttonEnabled() {
        binding.btnSignUp.isEnabled = isValidPassword && isValidEmail && isValidName && passwordSame
    }

    private fun signUpButtonClickEvent() {
        binding.btnSignUp.setOnClickListener {
            viewModel.postSignUp(
                binding.etEmail.text.toString(),
                binding.etPassword.text.toString(),
                binding.etPasswordConfirm.text.toString(),
                binding.etName.text.toString()
            )
            finish()
        }
    }

    private fun observeSignUpResult() {
        viewModel.signUpEvent.observe(this, EventObserver{ success ->
            if(success){
                finish()
            }
        })
    }
}

(2) 다양한 Listener를 사용한 예외처리

  • LoginPatternCheckUtil.kt
object LoginPatternCheckUtil {
    fun isNotValidName(name: String?): Boolean {
        val namePattern: Pattern = Pattern.compile("[ㄱ-ㅎ가-힣ㅏ-ㅣa-zA-Z0-9\\!\\@\\#\\$]{0,24}")
        return name.isNullOrEmpty() || !namePattern.matcher(name).matches()
    }

    fun isNotValidEmail(email: String?): Boolean {
        return email.isNullOrEmpty() || !Patterns.EMAIL_ADDRESS.matcher(email).matches()
    }

    fun isNotValidPassword(password: String?): Boolean {
        val passwordPattern: Pattern = Pattern.compile("[a-zA-Z0-9\\!\\@\\#\\$]{6,24}")
        return password.isNullOrEmpty() || !passwordPattern.matcher(password).matches()
    }

    /**
     * use to check first password and second password are valid
     */
    fun isPasswordCheckSuccess(password: String?, password2: String?): Boolean {
        return TextUtils.equals(password, password2)
    }
}

회원가입 동의

(1) 버튼 두개 체크 시에만 화면 전환

  • SignUpTermsActivity.kt
class SignUpTermsActivity : BaseActivity<ActivitySignUpTermsBinding, UserViewModel>() {
    override val layoutResourceId: Int
        get() = R.layout.activity_sign_up_terms
    override val viewModel: UserViewModel by viewModel()

    override fun initView() {
        initStartView()
        initClickEvent()
    }

    override fun initBeforeBinding() {

    }

    override fun initAfterBinding() {

    }

    private fun initStartView() {
        binding.btnSignUp.isEnabled = false
    }

    private fun initClickEvent() {
        binding.tbSignUpTerms.setNavigationOnClickListener {
            finish()
        }
        binding.ibAllowPersonalInformation.setOnClickListener {
            it.isSelected = !it.isSelected
            checkTermsSelected()
        }
        binding.ibAllowServiceTerms.setOnClickListener {
            it.isSelected = !it.isSelected
            checkTermsSelected()
        }
        binding.btnSignUp.setOnClickListener {
            startActivity(Intent(this, SignUpActivity::class.java))
            finish()
        }
    }

    private fun checkTermsSelected() {
        binding.btnSignUp.isEnabled = binding.ibAllowPersonalInformation.isSelected && binding.ibAllowServiceTerms.isSelected
    }

실행 화면

회원가입 Main
img