Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/Team-Going/Going-Android
Browse files Browse the repository at this point in the history
…into refactor/#185-todo
  • Loading branch information
Marchbreeze committed Jan 24, 2024
2 parents e238172 + 9ae5f5f commit d304617
Show file tree
Hide file tree
Showing 12 changed files with 395 additions and 342 deletions.
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
android:screenOrientation="portrait" />

<activity
android:name="com.going.presentation.onboarding.signup.OnboardingProfileSettingActivity"
android:name="com.going.presentation.onboarding.signup.SignUpActivity"
android:exported="false"
android:screenOrientation="portrait" />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.going.presentation.designsystem.edittext

enum class EditTextState {
EMPTY, BLANK, SUCCESS, OVER
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package com.going.presentation.designsystem.edittext

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.isVisible
import androidx.core.widget.doAfterTextChanged
import com.going.presentation.R
import com.going.presentation.databinding.ViewEmojiCounterEdittextBinding
import com.going.ui.extension.colorOf
import com.going.ui.extension.getGraphemeLength

class EmojiCounterEditText(context: Context, attrs: AttributeSet) :
ConstraintLayout(context, attrs) {

private val binding: ViewEmojiCounterEdittextBinding

private var maxLen: Int = 0
private var canBlankError: Boolean = false
lateinit var overWarning: String
var blankWarning: String = ""

val editText
get() = binding.etEmojiCounterEtContent

var state: EditTextState = EditTextState.EMPTY
set(value) {
field = value
when (field) {
EditTextState.SUCCESS -> setEditTextState(
R.color.gray_700,
R.drawable.shape_rect_4_gray700_line,
)

EditTextState.EMPTY -> setEditTextState(
R.color.gray_200,
R.drawable.shape_rect_4_gray200_line,
)

EditTextState.BLANK -> setEditTextState(
R.color.red_500,
R.drawable.shape_rect_4_red500_line,
blankWarning,
)

EditTextState.OVER -> setEditTextState(
R.color.red_500,
R.drawable.shape_rect_4_red500_line,
overWarning,
)
}
}

init {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.EmojiCounterEditText)

binding = ViewEmojiCounterEdittextBinding.inflate(
LayoutInflater.from(context),
this,
true,
)

binding.tvEmojiCounterEtTitle.text =
typedArray.getString(R.styleable.EmojiCounterEditText_title)
binding.etEmojiCounterEtContent.hint =
typedArray.getString(R.styleable.EmojiCounterEditText_hint)
canBlankError = typedArray.getBoolean(R.styleable.EmojiCounterEditText_canBlankError, false)
binding.etEmojiCounterEtContent.minLines = typedArray.getInt(R.styleable.EmojiCounterEditText_minLines, 1)

typedArray.recycle()

binding.tvEmojiCounterEtNameCounter.text = context.getString(R.string.counter, 0, maxLen)

checkTextAvailable()
}

private fun checkTextAvailable() {
binding.etEmojiCounterEtContent.doAfterTextChanged { text ->
val len = text.toString().getGraphemeLength()

state =
if (text.toString().isBlank() && len != 0 && canBlankError) {
EditTextState.BLANK
} else if (len > maxLen) {
EditTextState.OVER
} else if (len > 0) {
EditTextState.SUCCESS
} else {
EditTextState.EMPTY
}

binding.tvEmojiCounterEtNameCounter.text =
context.getString(R.string.counter, len, maxLen)
}
}

fun setMaxLen(len: Int) {
maxLen = len
binding.tvEmojiCounterEtNameCounter.text = context.getString(R.string.counter, 0, maxLen)
}

private fun setEditTextState(color: Int, background: Int, text: String = "") {
binding.tvEmojiCounterEtWarningMessage.isVisible = color == R.color.red_500
binding.tvEmojiCounterEtWarningMessage.text = text
binding.tvEmojiCounterEtNameCounter.setTextColor(context.colorOf(color))
binding.etEmojiCounterEtContent.background = ResourcesCompat.getDrawable(
this.resources,
background,
context.theme,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.going.domain.entity.AuthState
import com.going.presentation.R
import com.going.presentation.dashboard.DashBoardActivity
import com.going.presentation.databinding.ActivitySigninBinding
import com.going.presentation.onboarding.signup.OnboardingProfileSettingActivity
import com.going.presentation.onboarding.signup.SignUpActivity
import com.going.presentation.tendency.splash.TendencySplashActivity
import com.going.presentation.util.initOnBackPressedListener
import com.going.ui.base.BaseActivity
Expand Down Expand Up @@ -82,7 +82,7 @@ class SignInActivity : BaseActivity<ActivitySigninBinding>(R.layout.activity_sig
}

private fun navigateToOnboardingScreen() {
Intent(this, OnboardingProfileSettingActivity::class.java).apply {
Intent(this, SignUpActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(this)
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.going.presentation.onboarding.signup

import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.core.widget.doAfterTextChanged
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.going.domain.entity.AuthState
import com.going.presentation.R
import com.going.presentation.databinding.ActivitySignUpBinding
import com.going.presentation.onboarding.splash.SplashActivity
import com.going.presentation.tendency.splash.TendencySplashActivity
import com.going.presentation.util.initOnBackPressedListener
import com.going.ui.base.BaseActivity
import com.going.ui.extension.setOnSingleClickListener
import com.going.ui.extension.toast
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

@AndroidEntryPoint
class SignUpActivity :
BaseActivity<ActivitySignUpBinding>(R.layout.activity_sign_up) {

private val viewModel by viewModels<SignUpViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

initBindingViewModel()
setEtNameArguments()
setEtInfoArguments()
initSignUpBtnClickListener()
observeNameTextChanged()
observeInfoTextChanged()
observeIsSignUpState()
initOnBackPressedListener()
}

private fun initBindingViewModel() {
binding.viewModel = viewModel
}

private fun setEtNameArguments() {
with(binding.etSignUpName) {
setMaxLen(viewModel.getMaxNameLen())
overWarning = getString(R.string.name_over_error)
blankWarning = getString(R.string.name_blank_error)
}
}

private fun setEtInfoArguments() {
with(binding.etSignUpInfo) {
setMaxLen(viewModel.getMaxInfoLen())
overWarning = getString(R.string.info_over_error)
}
}

private fun initSignUpBtnClickListener() {
binding.btnSignUpFinish.setOnSingleClickListener {
viewModel.startSignUp()
}
}

private fun observeNameTextChanged() {
binding.etSignUpName.editText.doAfterTextChanged {
viewModel.setNameState(it.toString(), binding.etSignUpName.state)
}
}

private fun observeInfoTextChanged() {
binding.etSignUpInfo.editText.doAfterTextChanged {
viewModel.setInfoState(it.toString(), binding.etSignUpInfo.state)
}
}

private fun observeIsSignUpState() {
viewModel.isSignUpState.flowWithLifecycle(lifecycle).onEach { state ->
when (state) {
AuthState.LOADING -> return@onEach
AuthState.SUCCESS -> navigateToTendencySplashScreen()
AuthState.FAILURE -> toast(getString(R.string.server_error))
AuthState.SIGNUP -> return@onEach
AuthState.SIGNIN -> navigateToSplashScreen()
AuthState.TENDENCY -> return@onEach
AuthState.EMPTY -> return@onEach
}
}.launchIn(lifecycleScope)
}

private fun navigateToSplashScreen() {
Intent(this, SplashActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(this)
}
finish()
}

private fun navigateToTendencySplashScreen() {
Intent(this, TendencySplashActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(this)
}
finish()
}
}
Loading

0 comments on commit d304617

Please sign in to comment.