diff --git a/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt index de37ec2..387257a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt @@ -1,9 +1,16 @@ package kr.co.vividnext.sodalive.user.login import android.content.Intent +import android.graphics.Rect import android.os.Bundle -import android.text.InputType +import android.transition.TransitionManager +import android.view.inputmethod.EditorInfo +import android.widget.LinearLayout import android.widget.Toast +import androidx.annotation.OptIn +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.media3.common.util.UnstableApi import com.jakewharton.rxbinding4.widget.textChanges import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers @@ -11,11 +18,13 @@ 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.databinding.ActivityLoginBinding +import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.main.MainActivity import kr.co.vividnext.sodalive.user.find_password.FindPasswordActivity import kr.co.vividnext.sodalive.user.signup.SignUpActivity import org.koin.android.ext.android.inject +@OptIn(UnstableApi::class) class LoginActivity : BaseActivity(ActivityLoginBinding::inflate) { private val viewModel: LoginViewModel by inject() @@ -24,33 +33,37 @@ class LoginActivity : BaseActivity(ActivityLoginBinding::i override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - bindData() } override fun setupView() { + binding.root.viewTreeObserver.addOnGlobalLayoutListener { + val rect = Rect() + binding.root.getWindowVisibleDisplayFrame(rect) + + val keypadHeight = screenHeight - rect.bottom + if (keypadHeight > screenHeight * 0.15) { + updateMarginWithAnimation( + binding.llLoginContainer, + -100f.dpToPx().toInt() + ) + } else { + updateMarginWithAnimation(binding.llLoginContainer, 0) + } + } + binding.tvToolbar.text = "로그인" loadingDialog = LoadingDialog(this, layoutInflater) - binding.tvLogin.setOnClickListener { - viewModel.login { - it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() } - finishAffinity() - val nextIntent = Intent(applicationContext, MainActivity::class.java) - val extras = intent.getBundleExtra(Constants.EXTRA_DATA) - ?: if (intent.extras != null) { - intent.extras - } else { - null - } - if (extras != null) { - nextIntent.putExtra(Constants.EXTRA_DATA, extras) - } - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) - startActivity(nextIntent) + binding.etPassword.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + login() + true + } else { + false } } + binding.tvLogin.setOnClickListener { login() } binding.tvSignUp.setOnClickListener { val nextIntent = Intent(applicationContext, SignUpActivity::class.java) @@ -74,8 +87,26 @@ class LoginActivity : BaseActivity(ActivityLoginBinding::i ) ) } + } - binding.tvVisiblePassword.setOnClickListener { viewModel.onClickVisiblePassword() } + private fun login() { + viewModel.login { + it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() } + finishAffinity() + val nextIntent = Intent(applicationContext, MainActivity::class.java) + val extras = intent.getBundleExtra(Constants.EXTRA_DATA) + ?: if (intent.extras != null) { + intent.extras + } else { + null + } + if (extras != null) { + nextIntent.putExtra(Constants.EXTRA_DATA, extras) + } + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + startActivity(nextIntent) + } } private fun bindData() { @@ -108,16 +139,24 @@ class LoginActivity : BaseActivity(ActivityLoginBinding::i loadingDialog.dismiss() } } + } - viewModel.visiblePasswordLiveData.observe(this) { - binding.tvVisiblePassword.isSelected = it - if (it) { - binding.etPassword.inputType = - InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - } else { - binding.etPassword.inputType = - InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD - } - } + private fun updateMarginWithAnimation(view: LinearLayout, newMargin: Int) { + val constraintLayout = view.parent as ConstraintLayout + val constraintSet = ConstraintSet() + constraintSet.clone(constraintLayout) + + // 변경할 Constraint 적용 (margin 변경) + constraintSet.connect( + view.id, + ConstraintSet.TOP, + ConstraintSet.PARENT_ID, + ConstraintSet.TOP, + newMargin + ) + + // 애니메이션 적용 + TransitionManager.beginDelayedTransition(constraintLayout) + constraintSet.applyTo(constraintLayout) } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginViewModel.kt index d2b8f5d..6c4ecc1 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginViewModel.kt @@ -14,10 +14,6 @@ class LoginViewModel(private val repository: UserRepository) : BaseViewModel() { var email = "" var password = "" - private val _visiblePasswordLiveData = MutableLiveData(false) - val visiblePasswordLiveData: LiveData - get() = _visiblePasswordLiveData - private val _toastLiveData = MutableLiveData() val toastLiveData: LiveData get() = _toastLiveData @@ -71,8 +67,4 @@ class LoginViewModel(private val repository: UserRepository) : BaseViewModel() { ) ) } - - fun onClickVisiblePassword() { - _visiblePasswordLiveData.postValue(!_visiblePasswordLiveData.value!!) - } } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 2a7bb94..fad02f0 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:animateLayoutChanges="true" android:background="@color/black"> - + android:layout_marginHorizontal="13.3dp" + android:hint="이메일" + app:boxBackgroundColor="@color/color_cc333333" + app:boxBackgroundMode="filled" + app:boxCornerRadiusBottomEnd="6.7dp" + app:boxCornerRadiusBottomStart="6.7dp" + app:boxCornerRadiusTopEnd="6.7dp" + app:boxCornerRadiusTopStart="6.7dp" + app:boxStrokeColor="@color/color_cc333333"> - - - + android:textSize="15sp" /> + - - - + android:layout_marginHorizontal="13.3dp" + android:layout_marginTop="16dp" + android:hint="비밀번호" + app:boxBackgroundColor="@color/color_cc333333" + app:boxBackgroundMode="filled" + app:boxCornerRadiusBottomEnd="6.7dp" + app:boxCornerRadiusBottomStart="6.7dp" + app:boxCornerRadiusTopEnd="6.7dp" + app:boxCornerRadiusTopStart="6.7dp" + app:boxStrokeColor="@color/color_cc333333" + app:endIconMode="password_toggle"> - - - - - - - + android:textSize="15sp" /> + - + android:fontFamily="@font/gmarket_sans_medium" + android:text="비밀번호를 잊으셨나요?" + android:textColor="@color/color_bbbbbb" + android:textSize="13.3sp" /> - - - - - - +