From 95acefa01923dc63d568f01c2877c5bc323c0eae Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 21:57:52 +0900 Subject: [PATCH 01/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20add=20JoinActiv?= =?UTF-8?q?ity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 6 +++-- .../mumu/presentation/join/JoinActivity.kt | 26 +++++++++++++++++++ .../mumu/presentation/join/JoinViewModel.kt | 4 +++ app/src/main/res/layout/activity_join.xml | 10 +++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt create mode 100644 app/src/main/res/layout/activity_join.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f0aaafd..111c250 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,6 @@ + @@ -30,5 +33,4 @@ android:exported="false" /> - \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt new file mode 100644 index 0000000..723609d --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -0,0 +1,26 @@ +package kr.ac.anu.mumu.presentation.join + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import kr.ac.anu.mumu.R +import kr.ac.anu.mumu.databinding.ActivityJoinBinding + +class JoinActivity : AppCompatActivity() { + + private lateinit var binding: ActivityJoinBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + binding = ActivityJoinBinding.inflate(layoutInflater) + setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt new file mode 100644 index 0000000..4b94dc0 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -0,0 +1,4 @@ +package kr.ac.anu.mumu.presentation.join + +class JoinViewModel { +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_join.xml b/app/src/main/res/layout/activity_join.xml new file mode 100644 index 0000000..1adf8a7 --- /dev/null +++ b/app/src/main/res/layout/activity_join.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file From c9e4b8e617ca3b7159af41d753ce59a11c607b6c Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:04:39 +0900 Subject: [PATCH 02/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20add=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/ac/anu/mumu/presentation/join/AccountFragment.kt | 4 ++++ app/src/main/res/drawable/back.xml | 9 +++++++++ app/src/main/res/layout/fragment_account.xml | 6 ++++++ 3 files changed, 19 insertions(+) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt create mode 100644 app/src/main/res/drawable/back.xml create mode 100644 app/src/main/res/layout/fragment_account.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt new file mode 100644 index 0000000..68f9847 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt @@ -0,0 +1,4 @@ +package kr.ac.anu.mumu.presentation.join + +class AccountFragment { +} \ No newline at end of file diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml new file mode 100644 index 0000000..3544a7b --- /dev/null +++ b/app/src/main/res/drawable/back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml new file mode 100644 index 0000000..cdc89f2 --- /dev/null +++ b/app/src/main/res/layout/fragment_account.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file From 6b62ec1a08c6525b12dc5192109d3ca97d6bfccc Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:05:00 +0900 Subject: [PATCH 03/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20navigation=20pl?= =?UTF-8?q?ugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eecd9ed..3dbbbf2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -70,4 +70,8 @@ dependencies { // UI 확장 implementation(libs.androidx.activity.ktx) implementation(libs.androidx.fragment.ktx) + + // 네비게이션 + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) } From 22eec227c81f9ecf970af356580f095e0aaee64b Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:19:23 +0900 Subject: [PATCH 04/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20account=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚡️ :: add view background color --- app/src/main/res/layout/fragment_account.xml | 131 ++++++++++++++++++- 1 file changed, 129 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index cdc89f2..fb08d5a 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -1,6 +1,133 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/white"> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From da3bf66628a784dd25493a59f2adc9a58768b36f Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:38:05 +0900 Subject: [PATCH 05/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20accountFragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/AccountFragment.kt | 93 ++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt index 68f9847..482f3ef 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt @@ -1,4 +1,95 @@ package kr.ac.anu.mumu.presentation.join -class AccountFragment { +import android.os.Bundle +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.ForegroundColorSpan +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.widget.addTextChangedListener +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.transition.TransitionManager +import kr.ac.anu.mumu.R +import kr.ac.anu.mumu.databinding.FragmentAccountBinding + +class AccountFragment : Fragment() { + + private var _binding: FragmentAccountBinding? = null + private val binding get() = _binding!! + + // Activity와 공유하는 ViewModel + private val viewModel: JoinViewModel by activityViewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentAccountBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + // 텍스트 색상 변경 + viewSet() + + // 입력값 리스너 + binding.etId.addTextChangedListener { viewModel.inputId.value = it.toString() } + binding.etPw.addTextChangedListener { viewModel.inputPw.value = it.toString() } + binding.etPwCheck.addTextChangedListener { viewModel.inputPwCheck.value = it.toString() } + + // 단계별 UI 오픈 + viewModel.accountStep.observe(viewLifecycleOwner) { step -> + TransitionManager.beginDelayedTransition(binding.root as ViewGroup) + when (step) { + 1 -> binding.groupStepPw.visibility = View.VISIBLE + 2 -> binding.groupStepPwCheck.visibility = View.VISIBLE + } + } + + // 에러 메시지 보이기 / 숨기기 + viewModel.isIdErrorVisible.observe(viewLifecycleOwner) { isVisible -> + binding.tvIdError.visibility = if (isVisible) View.VISIBLE else View.GONE + } + viewModel.isPwErrorVisible.observe(viewLifecycleOwner) { isVisible -> + binding.tvPwError.visibility = if (isVisible) View.VISIBLE else View.GONE + } + viewModel.isPwCheckErrorVisible.observe(viewLifecycleOwner) { isVisible -> + binding.tvPwCheckError.visibility = if (isVisible) View.VISIBLE else View.GONE + } + + } + + private fun viewSet() { + val originText = binding.tvTitle.text.toString() + val spannable = SpannableStringBuilder(originText) + + val targetWord = "Mumu" + val start = originText.indexOf(targetWord) + val end = start + targetWord.length + + if (start != -1) { + context?.let { ctx -> + val color = ContextCompat.getColor(ctx, R.color.mumumint_300) + + spannable.setSpan( + ForegroundColorSpan(color), + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + } + binding.tvTitle.text = spannable + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } \ No newline at end of file From 85fa7541f0c6a093fcaaabb76db97f0770f91b71 Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:49:38 +0900 Subject: [PATCH 06/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20nav=5Fgraph=5Fj?= =?UTF-8?q?oin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚡️ :: nav_graph_join --- .../main/res/navigation/nav_graph_join.xml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 app/src/main/res/navigation/nav_graph_join.xml diff --git a/app/src/main/res/navigation/nav_graph_join.xml b/app/src/main/res/navigation/nav_graph_join.xml new file mode 100644 index 0000000..998e8c8 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph_join.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file From 1b03aff59609c5799e5715111316e9689936df73 Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:50:28 +0900 Subject: [PATCH 07/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20add=20NameFragm?= =?UTF-8?q?ent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/ac/anu/mumu/presentation/join/NameFragment.kt | 11 +++++++++++ app/src/main/res/layout/fragment_name.xml | 8 ++++++++ 2 files changed, 19 insertions(+) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt create mode 100644 app/src/main/res/layout/fragment_name.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt new file mode 100644 index 0000000..52edd2c --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt @@ -0,0 +1,11 @@ +package kr.ac.anu.mumu.presentation.join + +import androidx.fragment.app.Fragment +import kr.ac.anu.mumu.databinding.FragmentNameBinding + +class NameFragment : Fragment() { + private var _binding: FragmentNameBinding? = null + private val binding get() = _binding!! + + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_name.xml b/app/src/main/res/layout/fragment_name.xml new file mode 100644 index 0000000..f595b16 --- /dev/null +++ b/app/src/main/res/layout/fragment_name.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file From 0ed19bbb3648f80e5c024d10b327bd4c96952e7e Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:51:13 +0900 Subject: [PATCH 08/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20navigation=20ve?= =?UTF-8?q?rsion=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f58600b..6ec3a43 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,7 @@ lifecycleViewmodelKtx = "2.10.0" material = "1.13.0" activity = "1.12.1" constraintlayout = "2.2.1" +navigationFragmentKtx = "2.9.7" retrofit2 = "2.9.0" [libraries] @@ -22,6 +23,8 @@ androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = androidx-fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragmentKtx" } androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleViewmodelKtx" } androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } +androidx-navigation-fragment-ktx = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } +androidx-navigation-ui-ktx = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "navigationFragmentKtx" } converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit2" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" } hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hiltAndroid" } From f16209c7e2a653f752eba3f5f34dcc1735af3e1b Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:51:26 +0900 Subject: [PATCH 09/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20activity=5Fjoin?= =?UTF-8?q?=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_join.xml | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/app/src/main/res/layout/activity_join.xml b/app/src/main/res/layout/activity_join.xml index 1adf8a7..2d0930f 100644 --- a/app/src/main/res/layout/activity_join.xml +++ b/app/src/main/res/layout/activity_join.xml @@ -7,4 +7,51 @@ android:layout_height="match_parent" tools:context=".presentation.join.JoinActivity"> + + + + + + + + + + \ No newline at end of file From 664558c51369f15ea1909699fd824596c51cdc17 Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:51:50 +0900 Subject: [PATCH 10/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20join=20move=20c?= =?UTF-8?q?ode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/JoinActivity.kt | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 723609d..8dacfe8 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -2,15 +2,20 @@ package kr.ac.anu.mumu.presentation.join import android.os.Bundle import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment import kr.ac.anu.mumu.R import kr.ac.anu.mumu.databinding.ActivityJoinBinding class JoinActivity : AppCompatActivity() { private lateinit var binding: ActivityJoinBinding + private val viewModel: JoinViewModel by viewModels() + private lateinit var navController: NavController override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -22,5 +27,30 @@ class JoinActivity : AppCompatActivity() { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } + + val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment + navController = navHostFragment.navController + + + // 뒤로 가기 + binding.ibBack.setOnClickListener { + navController.popBackStack() + } + + // 다음 버튼 + binding.btnNext.setOnClickListener { + viewModel.onNextClick() + } + + // 페이지 이동 신호 감지 + viewModel.moveToNextPage.observe(this) { move -> + if (move) { + if (navController.currentDestination?.id == R.id.accountFragment) { + navController.navigate(R.id.action_accountFragment_to_nameFragment) + } + viewModel.doneNavigation() + } + + } } } \ No newline at end of file From 1d71c509c42e124ec25280718662bb7762040169 Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:54:25 +0900 Subject: [PATCH 11/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20JoinViewModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/JoinViewModel.kt | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 4b94dc0..3e6da4c 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -1,4 +1,76 @@ package kr.ac.anu.mumu.presentation.join -class JoinViewModel { +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class JoinViewModel : ViewModel() { + + // 입력 데이터 + val inputId = MutableLiveData("") + val inputPw = MutableLiveData("") + val inputPwCheck = MutableLiveData("") + + // 화면 상태 + private val _accountStep = MutableLiveData(0) + val accountStep: LiveData get() = _accountStep + + // 에러 메시지 표시 여부 + val isIdErrorVisible = MutableLiveData(false) + val isPwErrorVisible = MutableLiveData(false) + val isPwCheckErrorVisible = MutableLiveData(false) + + // 페이지 이동 이벤트 + private val _moveToNextPage = MutableLiveData() + val moveToNextPage: LiveData get() = _moveToNextPage + + // 정규식 + private val ID_REGEX = Regex("^[a-zA-Z0-9]{7,12}\$") + private val PW_REGEX = Regex("^(?=.*[!@#\$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?]).{8,16}\$") + + // 다음 버튼 클릭시 호출 + fun onNextClick() { + when (_accountStep.value) { + 0 -> checkIdStep() + 1 -> checkPwStep() + 2 -> checkPwCheckStep() + } + } + + private fun checkIdStep() { + val id = inputId.value ?: "" + + if (ID_REGEX.matches(id)) { + isIdErrorVisible.value = false + _accountStep.value = 1 + } else { + isIdErrorVisible.value = true + } + } + + private fun checkPwStep() { + val pw = inputPw.value ?: "" + + if (PW_REGEX.matches(pw)) { + isPwErrorVisible.value = false + _accountStep.value = 2 + } else { + isPwErrorVisible.value = true + } + } + + private fun checkPwCheckStep() { + val pw = inputPw.value ?: "" + val pwCheck = inputPwCheck.value ?: "" + + if (pw == pwCheck && pw.isNotBlank()) { + isPwCheckErrorVisible.value = false + _moveToNextPage.value = true + } else { + isPwCheckErrorVisible.value = true + } + } + + // 네비게이션 완료 후 이벤트 초기화 + fun doneNavigation() { _moveToNextPage.value = false } } \ No newline at end of file From 40ce94758d154b0c1bdacf124c1dce1e98983a20 Mon Sep 17 00:00:00 2001 From: bhindor Date: Wed, 11 Feb 2026 23:54:38 +0900 Subject: [PATCH 12/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20Login=20to=20Jo?= =?UTF-8?q?in?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/ac/anu/mumu/presentation/login/LoginActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/login/LoginActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/login/LoginActivity.kt index 5856b43..5d1dd44 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/login/LoginActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/login/LoginActivity.kt @@ -22,6 +22,7 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import kr.ac.anu.mumu.R import kr.ac.anu.mumu.databinding.ActivityLoginBinding +import kr.ac.anu.mumu.presentation.join.JoinActivity import kr.ac.anu.mumu.presentation.main.MainActivity @AndroidEntryPoint @@ -94,6 +95,10 @@ class LoginActivity : AppCompatActivity() { viewModel.login(id, pw) } + binding.btnJoin.setOnClickListener { + val intent = Intent(this, JoinActivity::class.java) + startActivity(intent) + } } // 로그인 결과 -> UI 업데이트 From eb848d8865ed7df5992df7eeb74c9b092dd54317 Mon Sep 17 00:00:00 2001 From: bhindor Date: Thu, 12 Feb 2026 00:00:23 +0900 Subject: [PATCH 13/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20connect=20JoinF?= =?UTF-8?q?ragment=20to=20Activity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_join.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_join.xml b/app/src/main/res/layout/activity_join.xml index 2d0930f..2439810 100644 --- a/app/src/main/res/layout/activity_join.xml +++ b/app/src/main/res/layout/activity_join.xml @@ -5,6 +5,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/white" tools:context=".presentation.join.JoinActivity"> + app:layout_constraintTop_toBottomOf="@id/layout_header" + app:navGraph="@navigation/nav_graph_join" /> Date: Thu, 12 Feb 2026 00:13:47 +0900 Subject: [PATCH 14/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20modify=20next?= =?UTF-8?q?=20btn=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/AccountFragment.kt | 22 +++++++++++++++---- .../mumu/presentation/join/JoinActivity.kt | 4 ++++ .../mumu/presentation/join/JoinViewModel.kt | 17 ++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt index 482f3ef..1040b76 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt @@ -39,9 +39,21 @@ class AccountFragment : Fragment() { viewSet() // 입력값 리스너 - binding.etId.addTextChangedListener { viewModel.inputId.value = it.toString() } - binding.etPw.addTextChangedListener { viewModel.inputPw.value = it.toString() } - binding.etPwCheck.addTextChangedListener { viewModel.inputPwCheck.value = it.toString() } + binding.etId.addTextChangedListener { + viewModel.inputId.value = it.toString() + viewModel.checkButtonEnabled() + viewModel.isIdErrorVisible.value = false + } + binding.etPw.addTextChangedListener { + viewModel.inputPw.value = it.toString() + viewModel.checkButtonEnabled() + viewModel.isPwErrorVisible.value = false + } + binding.etPwCheck.addTextChangedListener { + viewModel.inputPwCheck.value = it.toString() + viewModel.checkButtonEnabled() + viewModel.isPwCheckErrorVisible.value = false + } // 단계별 UI 오픈 viewModel.accountStep.observe(viewLifecycleOwner) { step -> @@ -50,9 +62,11 @@ class AccountFragment : Fragment() { 1 -> binding.groupStepPw.visibility = View.VISIBLE 2 -> binding.groupStepPwCheck.visibility = View.VISIBLE } + + viewModel.checkButtonEnabled() } - // 에러 메시지 보이기 / 숨기기 + // 에러 메시지 UI 반영 viewModel.isIdErrorVisible.observe(viewLifecycleOwner) { isVisible -> binding.tvIdError.visibility = if (isVisible) View.VISIBLE else View.GONE } diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 8dacfe8..f6ec5b7 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -31,10 +31,14 @@ class JoinActivity : AppCompatActivity() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment navController = navHostFragment.navController + viewModel.isButtonEnabled.observe(this) { isEnabled -> + binding.btnNext.isEnabled = isEnabled + } // 뒤로 가기 binding.ibBack.setOnClickListener { navController.popBackStack() + finish() } // 다음 버튼 diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 3e6da4c..d985753 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -24,10 +24,25 @@ class JoinViewModel : ViewModel() { private val _moveToNextPage = MutableLiveData() val moveToNextPage: LiveData get() = _moveToNextPage + // 버튼 활성화 여부 + private val _isButtonEnabled = MutableLiveData(false) + val isButtonEnabled: LiveData get() = _isButtonEnabled + // 정규식 private val ID_REGEX = Regex("^[a-zA-Z0-9]{7,12}\$") private val PW_REGEX = Regex("^(?=.*[!@#\$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?]).{8,16}\$") + fun checkButtonEnabled() { + val step = _accountStep.value ?: 0 + val hasInput = when (step) { + 0 -> !inputId.value.isNullOrBlank() // ID 칸에 뭐라도 썼니? + 1 -> !inputPw.value.isNullOrBlank() // PW 칸에 뭐라도 썼니? + 2 -> !inputPwCheck.value.isNullOrBlank() // 확인 칸에 뭐라도 썼니? + else -> false + } + _isButtonEnabled.value = hasInput + } + // 다음 버튼 클릭시 호출 fun onNextClick() { when (_accountStep.value) { @@ -43,6 +58,7 @@ class JoinViewModel : ViewModel() { if (ID_REGEX.matches(id)) { isIdErrorVisible.value = false _accountStep.value = 1 + checkButtonEnabled() } else { isIdErrorVisible.value = true } @@ -54,6 +70,7 @@ class JoinViewModel : ViewModel() { if (PW_REGEX.matches(pw)) { isPwErrorVisible.value = false _accountStep.value = 2 + checkButtonEnabled() } else { isPwErrorVisible.value = true } From 6dc4273400f53d6887aaba36c40fde0e44eb1b01 Mon Sep 17 00:00:00 2001 From: bhindor Date: Thu, 12 Feb 2026 00:21:15 +0900 Subject: [PATCH 15/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20Modify=20View?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/fragment_account.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index fb08d5a..9b788ca 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -120,14 +120,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:constraint_referenced_ids="et_pw, tv_pw_error" /> + app:constraint_referenced_ids="et_pw" /> + app:constraint_referenced_ids="et_pw_check" /> \ No newline at end of file From 05cfbd8f47cca8dca49752c77802fe4595c39e27 Mon Sep 17 00:00:00 2001 From: bhindor Date: Thu, 12 Feb 2026 00:21:30 +0900 Subject: [PATCH 16/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20modify=20back?= =?UTF-8?q?=20btn=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/ac/anu/mumu/presentation/join/JoinActivity.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index f6ec5b7..783fda1 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -37,8 +37,13 @@ class JoinActivity : AppCompatActivity() { // 뒤로 가기 binding.ibBack.setOnClickListener { - navController.popBackStack() - finish() + val currentDest = navController.currentDestination?.id + + if (currentDest == R.id.accountFragment) { + finish() + } else { + navController.popBackStack() + } } // 다음 버튼 From 5abdede64cd5ee03d69248e5bbd28e54bafcad32 Mon Sep 17 00:00:00 2001 From: bhindor Date: Thu, 12 Feb 2026 00:23:37 +0900 Subject: [PATCH 17/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20account=20view?= =?UTF-8?q?=20check=20logic=20modfiy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/ac/anu/mumu/presentation/join/AccountFragment.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt index 1040b76..3018a9b 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt @@ -58,10 +58,9 @@ class AccountFragment : Fragment() { // 단계별 UI 오픈 viewModel.accountStep.observe(viewLifecycleOwner) { step -> TransitionManager.beginDelayedTransition(binding.root as ViewGroup) - when (step) { - 1 -> binding.groupStepPw.visibility = View.VISIBLE - 2 -> binding.groupStepPwCheck.visibility = View.VISIBLE - } + binding.groupStepPw.visibility = if (step >= 1) View.VISIBLE else View.GONE + + binding.groupStepPwCheck.visibility = if (step >= 2) View.VISIBLE else View.GONE viewModel.checkButtonEnabled() } From 9d3f718509a1bda3bd81e901e8a8f1e39a0171f1 Mon Sep 17 00:00:00 2001 From: bhindor Date: Thu, 12 Feb 2026 00:25:02 +0900 Subject: [PATCH 18/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20editbox=20maxli?= =?UTF-8?q?ne=20setting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_login.xml | 2 ++ app/src/main/res/layout/fragment_account.xml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 0c52a7a..86de2a7 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -29,6 +29,7 @@ android:layout_marginTop="30dp" android:background="@drawable/gray_edit_box" android:hint="아이디" + android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" android:textColorHint="@color/mumugray_150" @@ -46,6 +47,7 @@ android:background="@drawable/gray_edit_box" android:hint="비밀번호" android:inputType="textPassword" + android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumublack" android:textColorHint="@color/mumugray_150" diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index 9b788ca..1f22320 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -39,6 +39,7 @@ android:background="@drawable/gray_edit_box" android:fontFamily="@font/pretendard_medium" android:hint="아이디" + android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" android:textColorHint="@color/mumugray_150" @@ -67,6 +68,7 @@ android:background="@drawable/gray_edit_box" android:fontFamily="@font/pretendard_medium" android:hint="비밀번호" + android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" android:textColorHint="@color/mumugray_150" @@ -95,6 +97,7 @@ android:background="@drawable/gray_edit_box" android:fontFamily="@font/pretendard_medium" android:hint="비밀번호 재확인" + android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" android:textColorHint="@color/mumugray_150" From ce4792fe921a6c639787f59b3a6e94ebaf7c50af Mon Sep 17 00:00:00 2001 From: bhindor Date: Fri, 13 Feb 2026 08:51:15 +0900 Subject: [PATCH 19/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20connect=20name?= =?UTF-8?q?=20to=20join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/JoinViewModel.kt | 6 +++ .../mumu/presentation/join/NameFragment.kt | 32 +++++++++++++ app/src/main/res/layout/fragment_name.xml | 45 ++++++++++++++++++- 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index d985753..2c0f3d1 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -10,6 +10,7 @@ class JoinViewModel : ViewModel() { val inputId = MutableLiveData("") val inputPw = MutableLiveData("") val inputPwCheck = MutableLiveData("") + val inputName = MutableLiveData("") // 화면 상태 private val _accountStep = MutableLiveData(0) @@ -88,6 +89,11 @@ class JoinViewModel : ViewModel() { } } + fun checkNameStep() { + val hasName = !inputName.value.isNullOrBlank() + _isButtonEnabled.value = hasName + } + // 네비게이션 완료 후 이벤트 초기화 fun doneNavigation() { _moveToNextPage.value = false } } \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt index 52edd2c..7f17cd8 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt @@ -1,11 +1,43 @@ package kr.ac.anu.mumu.presentation.join +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import kr.ac.anu.mumu.databinding.FragmentNameBinding class NameFragment : Fragment() { private var _binding: FragmentNameBinding? = null private val binding get() = _binding!! + private val viewModel: JoinViewModel by activityViewModels() + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentNameBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel.checkNameStep() + + binding.etName.addTextChangedListener { text -> + viewModel.inputName.value = text.toString() + viewModel.checkNameStep() + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_name.xml b/app/src/main/res/layout/fragment_name.xml index f595b16..78c2051 100644 --- a/app/src/main/res/layout/fragment_name.xml +++ b/app/src/main/res/layout/fragment_name.xml @@ -1,8 +1,49 @@ - + + + + + + \ No newline at end of file From 3363d53e464c7a404d83dde12137158e97c37dff Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Sat, 21 Feb 2026 10:35:38 +0900 Subject: [PATCH 20/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20add=20PhoneFrag?= =?UTF-8?q?ment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/PhoneFragment.kt | 34 +++++++++++++++++++ app/src/main/res/layout/fragment_phone.xml | 13 +++++++ 2 files changed, 47 insertions(+) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt create mode 100644 app/src/main/res/layout/fragment_phone.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt new file mode 100644 index 0000000..fd84201 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt @@ -0,0 +1,34 @@ +package kr.ac.anu.mumu.presentation.join + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import kr.ac.anu.mumu.databinding.FragmentPhoneBinding + +class PhoneFragment : Fragment() { + private var _binding: FragmentPhoneBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentPhoneBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_phone.xml b/app/src/main/res/layout/fragment_phone.xml new file mode 100644 index 0000000..60b4338 --- /dev/null +++ b/app/src/main/res/layout/fragment_phone.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file From 66574111fcdee4a22882cc29349a0b725b78e177 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Sat, 21 Feb 2026 16:12:27 +0900 Subject: [PATCH 21/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20bg=5Fedit=5Fund?= =?UTF-8?q?erline=20xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/bg_edit_underline.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/src/main/res/drawable/bg_edit_underline.xml diff --git a/app/src/main/res/drawable/bg_edit_underline.xml b/app/src/main/res/drawable/bg_edit_underline.xml new file mode 100644 index 0000000..e1af031 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_underline.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file From b08b1de85f30200fd107fa8c872ee767d830c6dd Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Sat, 21 Feb 2026 16:13:12 +0900 Subject: [PATCH 22/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20nav=EC=97=90=20?= =?UTF-8?q?phone=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anu/mumu/presentation/join/JoinActivity.kt | 15 +++++++++++++-- .../anu/mumu/presentation/join/JoinViewModel.kt | 15 +++++++++++++++ app/src/main/res/navigation/nav_graph_join.xml | 16 +++++++++++++++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 783fda1..27966f5 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -48,15 +48,26 @@ class JoinActivity : AppCompatActivity() { // 다음 버튼 binding.btnNext.setOnClickListener { - viewModel.onNextClick() + val currentDest = navController.currentDestination?.id + + if (currentDest == R.id.accountFragment) { + viewModel.onNextClick() + } else if (currentDest == R.id.nameFragment) { + viewModel.onNameCheckClick() + } } // 페이지 이동 신호 감지 viewModel.moveToNextPage.observe(this) { move -> if (move) { - if (navController.currentDestination?.id == R.id.accountFragment) { + val currentDest = navController.currentDestination?.id + + if (currentDest == R.id.accountFragment) { navController.navigate(R.id.action_accountFragment_to_nameFragment) + } else if (currentDest == R.id.nameFragment) { + navController.navigate(R.id.action_nameFragment_to_phoneFragment) } + viewModel.doneNavigation() } diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 2c0f3d1..b3c78b3 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -11,6 +11,8 @@ class JoinViewModel : ViewModel() { val inputPw = MutableLiveData("") val inputPwCheck = MutableLiveData("") val inputName = MutableLiveData("") + val inputPhoneNum = MutableLiveData("") + val inputCheckNum = MutableLiveData("") // 화면 상태 private val _accountStep = MutableLiveData(0) @@ -89,11 +91,24 @@ class JoinViewModel : ViewModel() { } } + // Name Code fun checkNameStep() { val hasName = !inputName.value.isNullOrBlank() _isButtonEnabled.value = hasName } + fun onNameCheckClick() { + if (!inputName.value.isNullOrBlank()) { + _moveToNextPage.value = true + } + } + + // Phone Code + fun checkPhoneStep() { + val hasPhone = !inputPhoneNum.value.isNullOrBlank() + _isButtonEnabled.value = hasPhone + } + // 네비게이션 완료 후 이벤트 초기화 fun doneNavigation() { _moveToNextPage.value = false } } \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph_join.xml b/app/src/main/res/navigation/nav_graph_join.xml index 998e8c8..5ece0df 100644 --- a/app/src/main/res/navigation/nav_graph_join.xml +++ b/app/src/main/res/navigation/nav_graph_join.xml @@ -23,6 +23,20 @@ android:id="@+id/nameFragment" android:name="kr.ac.anu.mumu.presentation.join.NameFragment" android:label="NameFragment" - tools:layout="@layout/fragment_name" /> + tools:layout="@layout/fragment_name" > + + + + \ No newline at end of file From d1daec03e75fe75f5da8f8cf8e7c0f0f71ec536f Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Sat, 21 Feb 2026 16:24:12 +0900 Subject: [PATCH 23/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20only=20?= =?UTF-8?q?=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/PhoneFragment.kt | 45 +++++++++++ app/src/main/res/layout/fragment_phone.xml | 80 ++++++++++++++++++- 2 files changed, 123 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt index fd84201..de61bae 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt @@ -1,15 +1,19 @@ package kr.ac.anu.mumu.presentation.join import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import kr.ac.anu.mumu.databinding.FragmentPhoneBinding class PhoneFragment : Fragment() { private var _binding: FragmentPhoneBinding? = null private val binding get() = _binding!! + private val viewModel: JoinViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, @@ -23,7 +27,48 @@ class PhoneFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.checkPhoneStep() + binding.etPhoneNum.addTextChangedListener(object : TextWatcher { + + private var isFormatting = false // 무한 루프 방지용 플래그 + + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + + override fun afterTextChanged(s: Editable?) { + if (isFormatting || s == null) return + + isFormatting = true + + // 입력 값중 숫자만 추출 + val phoneNumber = s.toString().replace(Regex("[^0-9]"), "") + + // viewModel에 숫자만 저장 + viewModel.inputPhoneNum.value = phoneNumber + + // 화면에 보여줄 하이픈 포맷 만들기 + val formattedNumber = formatPhoneNumber(phoneNumber) + + s.replace(0, s.length, formattedNumber) + + viewModel.checkPhoneStep() + + isFormatting = false + + } + }) + } + + private fun formatPhoneNumber(raw: String): String { + return when { + raw.length <= 3 -> raw + raw.length <= 7 -> "${raw.substring(0, 3)}-${raw.substring(3)}" + else -> { + val limit = if (raw.length > 11) raw.substring(0, 11) else raw + "${limit.substring(0, 3)}-${limit.substring(3, 7)}-${limit.substring(7)}" + } + } } override fun onDestroyView() { diff --git a/app/src/main/res/layout/fragment_phone.xml b/app/src/main/res/layout/fragment_phone.xml index 60b4338..d8cdf78 100644 --- a/app/src/main/res/layout/fragment_phone.xml +++ b/app/src/main/res/layout/fragment_phone.xml @@ -1,13 +1,89 @@ + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="52dp" + android:fontFamily="@font/pretendard_medium" + android:text="3 / 4" + android:textColor="@color/mumugray_200" + android:textSize="@dimen/body_6" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + \ No newline at end of file From 724ea3a75d7f4ae61c29280881fbf9779523ab62 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Sat, 21 Feb 2026 17:00:56 +0900 Subject: [PATCH 24/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20editbox=20?= =?UTF-8?q?=ED=95=9C=EC=A4=84=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_login.xml | 3 +++ app/src/main/res/layout/fragment_account.xml | 6 ++++++ app/src/main/res/layout/fragment_name.xml | 2 ++ 3 files changed, 11 insertions(+) diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 86de2a7..779ee7a 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -29,6 +29,8 @@ android:layout_marginTop="30dp" android:background="@drawable/gray_edit_box" android:hint="아이디" + android:imeOptions="actionNext" + android:inputType="text" android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" @@ -46,6 +48,7 @@ android:layout_marginTop="8dp" android:background="@drawable/gray_edit_box" android:hint="비밀번호" + android:imeOptions="actionDone" android:inputType="textPassword" android:maxLines="1" android:paddingHorizontal="16dp" diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index 1f22320..28d3a0a 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -39,6 +39,8 @@ android:background="@drawable/gray_edit_box" android:fontFamily="@font/pretendard_medium" android:hint="아이디" + android:imeOptions="actionDone" + android:inputType="text" android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" @@ -68,6 +70,8 @@ android:background="@drawable/gray_edit_box" android:fontFamily="@font/pretendard_medium" android:hint="비밀번호" + android:imeOptions="actionDone" + android:inputType="text" android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" @@ -97,6 +101,8 @@ android:background="@drawable/gray_edit_box" android:fontFamily="@font/pretendard_medium" android:hint="비밀번호 재확인" + android:imeOptions="actionDone" + android:inputType="text" android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_350" diff --git a/app/src/main/res/layout/fragment_name.xml b/app/src/main/res/layout/fragment_name.xml index 78c2051..6417d6d 100644 --- a/app/src/main/res/layout/fragment_name.xml +++ b/app/src/main/res/layout/fragment_name.xml @@ -38,6 +38,8 @@ android:layout_marginTop="18dp" android:background="@drawable/gray_edit_box" android:hint="이름" + android:imeOptions="actionDone" + android:inputType="text" android:paddingHorizontal="20dp" android:textColor="@color/mumugray_350" android:textColorHint="@color/mumugray_150" From 254f2cc3a0f80bec7a474e26f40468f0eae32c3f Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Sat, 21 Feb 2026 17:36:47 +0900 Subject: [PATCH 25/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EB=B7=B0=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/JoinActivity.kt | 4 ++ .../mumu/presentation/join/JoinViewModel.kt | 37 +++++++++++++++++-- .../mumu/presentation/join/PhoneFragment.kt | 18 ++++++++- .../main/res/drawable/bg_edit_underline.xml | 6 +-- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 27966f5..e73c532 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -8,9 +8,11 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment +import dagger.hilt.android.AndroidEntryPoint import kr.ac.anu.mumu.R import kr.ac.anu.mumu.databinding.ActivityJoinBinding +@AndroidEntryPoint class JoinActivity : AppCompatActivity() { private lateinit var binding: ActivityJoinBinding @@ -54,6 +56,8 @@ class JoinActivity : AppCompatActivity() { viewModel.onNextClick() } else if (currentDest == R.id.nameFragment) { viewModel.onNameCheckClick() + } else if (currentDest == R.id.phoneFragment) { + viewModel.onPhoneCheckClick() } } diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index b3c78b3..799799b 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -3,8 +3,11 @@ package kr.ac.anu.mumu.presentation.join import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject -class JoinViewModel : ViewModel() { +@HiltViewModel +class JoinViewModel @Inject constructor() : ViewModel() { // 입력 데이터 val inputId = MutableLiveData("") @@ -104,9 +107,37 @@ class JoinViewModel : ViewModel() { } // Phone Code + // 인증번호 visiable 여부 결정하는 LiveData + private val _isVerificationVisible = MutableLiveData(false) + val isVerificationVisible: LiveData get() = _isVerificationVisible + fun checkPhoneStep() { - val hasPhone = !inputPhoneNum.value.isNullOrBlank() - _isButtonEnabled.value = hasPhone + val phoneLength = inputPhoneNum.value?.length ?: 0 + val isPhoneValid = phoneLength == 10 || phoneLength == 11 + + _isVerificationVisible.value = isPhoneValid + + checkPhoneButtonEnabled() + } + + fun checkPhoneButtonEnabled() { + val phoneLength = inputPhoneNum.value?.length ?: 0 + val isPhoneValid = phoneLength == 10 || phoneLength == 11 + + val isCodeValid = !inputCheckNum.value.isNullOrBlank() + + // 전화번호도 맞고 인증번호도 쳤을 때만 최종 버튼 켜기 + _isButtonEnabled.value = isPhoneValid && isCodeValid + } + + fun onPhoneCheckClick() { + val phoneLength = inputPhoneNum.value?.length ?: 0 + val isPhoneValid = phoneLength == 10 || phoneLength == 11 + val isCodeValid = !inputCheckNum.value.isNullOrBlank() + + if (isPhoneValid && isCodeValid) { + _moveToNextPage.value = true + } } // 네비게이션 완료 후 이벤트 초기화 diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt index de61bae..095502d 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt @@ -29,6 +29,11 @@ class PhoneFragment : Fragment() { viewModel.checkPhoneStep() + viewModel.isVerificationVisible.observe(viewLifecycleOwner) { isVisible -> + android.transition.TransitionManager.beginDelayedTransition(binding.root as ViewGroup) + binding.groupStepCheckNum.visibility = if (isVisible) View.VISIBLE else View.GONE + } + binding.etPhoneNum.addTextChangedListener(object : TextWatcher { private var isFormatting = false // 무한 루프 방지용 플래그 @@ -49,7 +54,6 @@ class PhoneFragment : Fragment() { // 화면에 보여줄 하이픈 포맷 만들기 val formattedNumber = formatPhoneNumber(phoneNumber) - s.replace(0, s.length, formattedNumber) viewModel.checkPhoneStep() @@ -58,6 +62,18 @@ class PhoneFragment : Fragment() { } }) + + binding.etCheckNum.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + + override fun afterTextChanged(s: Editable?) { + viewModel.inputCheckNum.value = s?.toString() ?: "" + + viewModel.checkPhoneButtonEnabled() + } + }) } private fun formatPhoneNumber(raw: String): String { diff --git a/app/src/main/res/drawable/bg_edit_underline.xml b/app/src/main/res/drawable/bg_edit_underline.xml index e1af031..3c179c5 100644 --- a/app/src/main/res/drawable/bg_edit_underline.xml +++ b/app/src/main/res/drawable/bg_edit_underline.xml @@ -1,9 +1,9 @@ + android:top="-10dp" + android:left="-10dp" + android:right="-10dp"> Date: Sat, 21 Feb 2026 17:54:58 +0900 Subject: [PATCH 26/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=A0=84?= =?UTF-8?q?=ED=99=94=EB=B2=88=ED=98=B8=20=EC=9D=B8=EC=A6=9D=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EB=B7=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ac/anu/mumu/presentation/join/JoinViewModel.kt | 14 ++++++++++---- .../ac/anu/mumu/presentation/join/PhoneFragment.kt | 11 +++++++++++ .../main/res/drawable/bg_edit_error_underline.xml | 14 ++++++++++++++ app/src/main/res/layout/fragment_phone.xml | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/bg_edit_error_underline.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 799799b..78ad1ce 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -25,6 +25,7 @@ class JoinViewModel @Inject constructor() : ViewModel() { val isIdErrorVisible = MutableLiveData(false) val isPwErrorVisible = MutableLiveData(false) val isPwCheckErrorVisible = MutableLiveData(false) + val isCheckNumErrorVisible = MutableLiveData(false) // 페이지 이동 이벤트 private val _moveToNextPage = MutableLiveData() @@ -133,10 +134,15 @@ class JoinViewModel @Inject constructor() : ViewModel() { fun onPhoneCheckClick() { val phoneLength = inputPhoneNum.value?.length ?: 0 val isPhoneValid = phoneLength == 10 || phoneLength == 11 - val isCodeValid = !inputCheckNum.value.isNullOrBlank() - - if (isPhoneValid && isCodeValid) { - _moveToNextPage.value = true + val currentCode = inputCheckNum.value ?: "" + + if (isPhoneValid) { + if (currentCode == "123456") { + isCheckNumErrorVisible.value = false + _moveToNextPage.value = true + } else { + isCheckNumErrorVisible.value = true + } } } diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt index 095502d..601e6fe 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import kr.ac.anu.mumu.R import kr.ac.anu.mumu.databinding.FragmentPhoneBinding class PhoneFragment : Fragment() { @@ -63,6 +64,14 @@ class PhoneFragment : Fragment() { } }) + viewModel.isCheckNumErrorVisible.observe(viewLifecycleOwner) { isError -> + if (isError) { + binding.etCheckNum.setBackgroundResource(R.drawable.bg_edit_error_underline) + } else { + binding.etCheckNum.setBackgroundResource(R.drawable.bg_edit_underline) + } + } + binding.etCheckNum.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} @@ -71,6 +80,8 @@ class PhoneFragment : Fragment() { override fun afterTextChanged(s: Editable?) { viewModel.inputCheckNum.value = s?.toString() ?: "" + viewModel.isCheckNumErrorVisible.value = false + viewModel.checkPhoneButtonEnabled() } }) diff --git a/app/src/main/res/drawable/bg_edit_error_underline.xml b/app/src/main/res/drawable/bg_edit_error_underline.xml new file mode 100644 index 0000000..de75a35 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_error_underline.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_phone.xml b/app/src/main/res/layout/fragment_phone.xml index d8cdf78..38f78c7 100644 --- a/app/src/main/res/layout/fragment_phone.xml +++ b/app/src/main/res/layout/fragment_phone.xml @@ -70,6 +70,7 @@ android:fontFamily="@font/pretendard_medium" android:hint="인증번호" android:inputType="number" + android:maxLength="6" android:maxLines="1" android:paddingHorizontal="16dp" android:textColor="@color/mumugray_400" From 4b26b43c55c773f185169df5315f67352afa8eb4 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 06:55:51 +0900 Subject: [PATCH 27/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20fragment=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/AddressFragment.kt | 34 +++++++++++++++++++ app/src/main/res/layout/fragment_address.xml | 6 ++++ 2 files changed, 40 insertions(+) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt create mode 100644 app/src/main/res/layout/fragment_address.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt new file mode 100644 index 0000000..791de28 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt @@ -0,0 +1,34 @@ +package kr.ac.anu.mumu.presentation.join + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import kr.ac.anu.mumu.databinding.FragmentAddressBinding + +class AddressFragment : Fragment() { + private var _binding: FragmentAddressBinding? = null + private val binding get() = _binding!! + private val viewModel: JoinViewModel by activityViewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentAddressBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_address.xml b/app/src/main/res/layout/fragment_address.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_address.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file From e2072d09020f65657cceae9995aa35cf4813764d Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 07:43:12 +0900 Subject: [PATCH 28/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20address=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⚡️ :: id modify ⚡️ :: 상세주소 줄바꿈 막기 --- app/src/main/res/layout/fragment_address.xml | 106 ++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_address.xml b/app/src/main/res/layout/fragment_address.xml index 77d9ef6..d7e4b61 100644 --- a/app/src/main/res/layout/fragment_address.xml +++ b/app/src/main/res/layout/fragment_address.xml @@ -1,6 +1,110 @@ + android:layout_height="match_parent" + android:background="@color/white"> + + + + + + + + + + + + + + + \ No newline at end of file From 3bbebfffb6430e80692e76391b81f1338b1d8c7b Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 08:08:23 +0900 Subject: [PATCH 29/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20viewModel=20&=20fragment=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/AddressFragment.kt | 22 +++++++++++++++++++ .../mumu/presentation/join/JoinViewModel.kt | 10 +++++++++ 2 files changed, 32 insertions(+) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt index 791de28..9ffe160 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import kr.ac.anu.mumu.databinding.FragmentAddressBinding @@ -25,6 +26,27 @@ class AddressFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.checkAddressStep() + + viewModel.inputPostalCode.observe(viewLifecycleOwner) { postal -> + binding.tvPostalCode.text = postal + } + + viewModel.inputAddress.observe(viewLifecycleOwner) { address -> + binding.tvAddress.text = address + } + + binding.btnSearch.setOnClickListener { + //TODO 카카오 API + viewModel.inputPostalCode.value = "36729" + viewModel.inputAddress.value = "경상북도 안동시 경동로 1375" + } + + binding.etAddress.addTextChangedListener { text -> + viewModel.inputDetailAddress.value = text.toString() + + viewModel.checkAddressStep() + } } override fun onDestroyView() { diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 78ad1ce..d8a6cca 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -16,6 +16,9 @@ class JoinViewModel @Inject constructor() : ViewModel() { val inputName = MutableLiveData("") val inputPhoneNum = MutableLiveData("") val inputCheckNum = MutableLiveData("") + val inputPostalCode = MutableLiveData("") + val inputAddress = MutableLiveData("") + val inputDetailAddress = MutableLiveData("") // 화면 상태 private val _accountStep = MutableLiveData(0) @@ -146,6 +149,13 @@ class JoinViewModel @Inject constructor() : ViewModel() { } } + // Address + fun checkAddressStep() { + //TODO 우편번호랑 도로명은 주소 API 사용하면서 작성 + val hasDetail = !inputDetailAddress.value.isNullOrBlank() + _isButtonEnabled.value = hasDetail + } + // 네비게이션 완료 후 이벤트 초기화 fun doneNavigation() { _moveToNextPage.value = false } } \ No newline at end of file From d313b4a47c73569056e4a26b706bbe2b02d214aa Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 08:34:03 +0900 Subject: [PATCH 30/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20nav=EC=97=90=20?= =?UTF-8?q?phone=20to=20address=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anu/mumu/presentation/join/JoinActivity.kt | 2 ++ app/src/main/res/navigation/nav_graph_join.xml | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index e73c532..873a48e 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -70,6 +70,8 @@ class JoinActivity : AppCompatActivity() { navController.navigate(R.id.action_accountFragment_to_nameFragment) } else if (currentDest == R.id.nameFragment) { navController.navigate(R.id.action_nameFragment_to_phoneFragment) + } else if (currentDest == R.id.phoneFragment) { + navController.navigate(R.id.action_phoneFragment_to_addressFragment) } viewModel.doneNavigation() diff --git a/app/src/main/res/navigation/nav_graph_join.xml b/app/src/main/res/navigation/nav_graph_join.xml index 5ece0df..605d294 100644 --- a/app/src/main/res/navigation/nav_graph_join.xml +++ b/app/src/main/res/navigation/nav_graph_join.xml @@ -23,7 +23,7 @@ android:id="@+id/nameFragment" android:name="kr.ac.anu.mumu.presentation.join.NameFragment" android:label="NameFragment" - tools:layout="@layout/fragment_name" > + tools:layout="@layout/fragment_name"> + tools:layout="@layout/fragment_phone"> + + + + \ No newline at end of file From 57fac685f37a7870a42b2d0fa1b475853a649c5f Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 08:45:22 +0900 Subject: [PATCH 31/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20add=20=EC=95=BD?= =?UTF-8?q?=EA=B4=80=20fragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ac/anu/mumu/presentation/join/TermsFragment.kt | 13 +++++++++++++ app/src/main/res/layout/fragment_terms.xml | 9 +++++++++ 2 files changed, 22 insertions(+) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt create mode 100644 app/src/main/res/layout/fragment_terms.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt new file mode 100644 index 0000000..b77bc74 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt @@ -0,0 +1,13 @@ +package kr.ac.anu.mumu.presentation.join + +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import kr.ac.anu.mumu.databinding.FragmentTermsBinding + +class TermsFragment : Fragment() { + private var _binding: FragmentTermsBinding? = null + private val binding get() = _binding!! + private val viewModel: JoinViewModel by activityViewModels() + + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_terms.xml b/app/src/main/res/layout/fragment_terms.xml new file mode 100644 index 0000000..2b7f034 --- /dev/null +++ b/app/src/main/res/layout/fragment_terms.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file From 31793e9a67eb9f6dc23a9ef5f18f4524996595ca Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 13:55:06 +0900 Subject: [PATCH 32/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=95=BD?= =?UTF-8?q?=EA=B4=80=20=EB=B7=B0=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/fragment_terms.xml | 155 ++++++++++++++++++++- 1 file changed, 154 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_terms.xml b/app/src/main/res/layout/fragment_terms.xml index 2b7f034..497a385 100644 --- a/app/src/main/res/layout/fragment_terms.xml +++ b/app/src/main/res/layout/fragment_terms.xml @@ -1,9 +1,162 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From df074f062a9e737f305f14514d154ad6e1db5a74 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 13:55:26 +0900 Subject: [PATCH 33/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20fragment=20&=20?= =?UTF-8?q?viewModel=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/JoinViewModel.kt | 44 +++++++++++++ .../mumu/presentation/join/TermsFragment.kt | 62 +++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index d8a6cca..3704bf2 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -19,6 +19,10 @@ class JoinViewModel @Inject constructor() : ViewModel() { val inputPostalCode = MutableLiveData("") val inputAddress = MutableLiveData("") val inputDetailAddress = MutableLiveData("") + val isAllAgreed = MutableLiveData(false) + val isTermsAgreed = MutableLiveData(false) + val isPrivacyAgreed = MutableLiveData(false) + val isMarketingAgreed = MutableLiveData(false) // 화면 상태 private val _accountStep = MutableLiveData(0) @@ -156,6 +160,46 @@ class JoinViewModel @Inject constructor() : ViewModel() { _isButtonEnabled.value = hasDetail } + fun onAddressCheckClick() { + if (!inputDetailAddress.value.isNullOrBlank()) { + _moveToNextPage.value = true + } + } + + // Terms + fun checkAgreementStep() { + val terms = isTermsAgreed.value ?: false + val privacy = isPrivacyAgreed.value ?: false + + _isButtonEnabled.value = terms && privacy + } + + fun onAllAgreeClicked(isChecked: Boolean) { + isAllAgreed.value = isChecked + isTermsAgreed.value = isChecked + isPrivacyAgreed.value = isChecked + + checkAgreementStep() + } + + fun onSingleAgreeClicked() { + val terms = isTermsAgreed.value ?: false + val privacy = isPrivacyAgreed.value ?: false + val marketing = isMarketingAgreed.value ?: false + + isAllAgreed.value = terms && privacy && marketing + + checkAgreementStep() + } + + fun onFinalRegisterClick() { + val terms = isTermsAgreed.value ?: false + val privacy = isPrivacyAgreed.value ?: false + val marketing = isMarketingAgreed.value ?: false + + // viewModelScop.launch { registerUserUseCase() } -> useCase 연결 + } + // 네비게이션 완료 후 이벤트 초기화 fun doneNavigation() { _moveToNextPage.value = false } } \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt index b77bc74..f0ab1b8 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt @@ -1,5 +1,9 @@ package kr.ac.anu.mumu.presentation.join +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import kr.ac.anu.mumu.databinding.FragmentTermsBinding @@ -9,5 +13,63 @@ class TermsFragment : Fragment() { private val binding get() = _binding!! private val viewModel: JoinViewModel by activityViewModels() + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentTermsBinding.inflate(inflater, container, false) + return binding.root + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel.checkAgreementStep() + + // 상태에 따른 체크박스 UI 변경 + viewModel.isAllAgreed.observe(viewLifecycleOwner) { isChecked -> + binding.cbAll.isChecked = isChecked + } + viewModel.isTermsAgreed.observe(viewLifecycleOwner) { isChecked -> + binding.cbTerms.isChecked = isChecked + } + viewModel.isPrivacyAgreed.observe(viewLifecycleOwner) { isChecked -> + binding.cbPrivacy.isChecked = isChecked + } + + viewModel.isMarketingAgreed.observe(viewLifecycleOwner) { isChecked -> + binding.cbMarketing.isChecked = isChecked + } + + // 뷰 클릭시 viewModel에 상태 전달 + binding.cbAll.setOnClickListener { + val isChecked = binding.cbAll.isChecked + viewModel.onAllAgreeClicked(isChecked) + } + + binding.cbTerms.setOnClickListener { + viewModel.isTermsAgreed.value = binding.cbTerms.isChecked + viewModel.onSingleAgreeClicked() + } + + binding.cbPrivacy.setOnClickListener { + viewModel.isPrivacyAgreed.value = binding.cbPrivacy.isChecked + viewModel.onSingleAgreeClicked() + } + + binding.cbMarketing.setOnClickListener { + viewModel.isMarketingAgreed.value = binding.cbMarketing.isChecked + viewModel.onSingleAgreeClicked() + } + + binding.tvTermsDetail.setOnClickListener { + // 약관 내용 보여주기 + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } \ No newline at end of file From 5d205591afa9d50f2f1f369d8c1f8880f13dba0c Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 13:56:01 +0900 Subject: [PATCH 34/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20nav=EC=97=90=20?= =?UTF-8?q?address=20to=20terms=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anu/mumu/presentation/join/JoinActivity.kt | 4 ++++ app/src/main/res/navigation/nav_graph_join.xml | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 873a48e..3593e7e 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -58,6 +58,8 @@ class JoinActivity : AppCompatActivity() { viewModel.onNameCheckClick() } else if (currentDest == R.id.phoneFragment) { viewModel.onPhoneCheckClick() + } else if (currentDest == R.id.addressFragment) { + viewModel.onAddressCheckClick() } } @@ -72,6 +74,8 @@ class JoinActivity : AppCompatActivity() { navController.navigate(R.id.action_nameFragment_to_phoneFragment) } else if (currentDest == R.id.phoneFragment) { navController.navigate(R.id.action_phoneFragment_to_addressFragment) + } else if (currentDest == R.id.addressFragment) { + navController.navigate(R.id.action_addressFragment_to_TermsFragment) } viewModel.doneNavigation() diff --git a/app/src/main/res/navigation/nav_graph_join.xml b/app/src/main/res/navigation/nav_graph_join.xml index 605d294..7522c37 100644 --- a/app/src/main/res/navigation/nav_graph_join.xml +++ b/app/src/main/res/navigation/nav_graph_join.xml @@ -51,6 +51,20 @@ android:id="@+id/addressFragment" android:name="kr.ac.anu.mumu.presentation.join.AddressFragment" android:label="AddressFragment" - tools:layout="@layout/fragment_address" /> + tools:layout="@layout/fragment_address"> + + + + \ No newline at end of file From e913b6ddd68a42627525987d349be43da9c7fa6c Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 15:10:37 +0900 Subject: [PATCH 35/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20=EB=B7=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/AddressFragment.kt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt index 9ffe160..bc8dc9e 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt @@ -1,12 +1,17 @@ package kr.ac.anu.mumu.presentation.join import android.os.Bundle +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.ForegroundColorSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import kr.ac.anu.mumu.R import kr.ac.anu.mumu.databinding.FragmentAddressBinding class AddressFragment : Fragment() { @@ -26,6 +31,8 @@ class AddressFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewSet() + viewModel.checkAddressStep() viewModel.inputPostalCode.observe(viewLifecycleOwner) { postal -> @@ -49,6 +56,28 @@ class AddressFragment : Fragment() { } } + private fun viewSet() { + val originText = binding.tvTitle.text.toString() + val spannable = SpannableStringBuilder(originText) + + val targetWord = "Mumu" + val start = originText.indexOf(targetWord) + val end = start + targetWord.length + + if (start != -1) { + val color = ContextCompat.getColor(requireContext(), R.color.mumumint_300) + + spannable.setSpan( + ForegroundColorSpan(color), + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + + binding.tvTitle.text = spannable + } + override fun onDestroyView() { super.onDestroyView() _binding = null From ef941fd15d8219af700402f2e832494a4745f641 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 15:10:52 +0900 Subject: [PATCH 36/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=9D=B4=EB=8F=99=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/JoinActivity.kt | 22 +++++++++------- .../mumu/presentation/join/JoinViewModel.kt | 26 +++++++++++++++---- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 3593e7e..1f5a05e 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -50,16 +50,20 @@ class JoinActivity : AppCompatActivity() { // 다음 버튼 binding.btnNext.setOnClickListener { - val currentDest = navController.currentDestination?.id + viewModel.onNextClick() + } - if (currentDest == R.id.accountFragment) { - viewModel.onNextClick() - } else if (currentDest == R.id.nameFragment) { - viewModel.onNameCheckClick() - } else if (currentDest == R.id.phoneFragment) { - viewModel.onPhoneCheckClick() - } else if (currentDest == R.id.addressFragment) { - viewModel.onAddressCheckClick() + viewModel.accountStep.observe(this) { currentStep -> + if (currentStep == 7) { + binding.btnNext.text = "완료" + } else { + binding.btnNext.text = "다음" + } + } + + viewModel.finishJoinFlow.observe(this) { isFinished -> + if (isFinished) { + finish() } } diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 3704bf2..4759831 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -38,6 +38,9 @@ class JoinViewModel @Inject constructor() : ViewModel() { private val _moveToNextPage = MutableLiveData() val moveToNextPage: LiveData get() = _moveToNextPage + private val _finishJoinFlow = MutableLiveData() + val finishJoinFlow: LiveData get() = _finishJoinFlow + // 버튼 활성화 여부 private val _isButtonEnabled = MutableLiveData(false) val isButtonEnabled: LiveData get() = _isButtonEnabled @@ -63,6 +66,15 @@ class JoinViewModel @Inject constructor() : ViewModel() { 0 -> checkIdStep() 1 -> checkPwStep() 2 -> checkPwCheckStep() + 3 -> { + if (!inputName.value.isNullOrBlank()) _moveToNextPage.value = true + } + 4 -> onPhoneCheckClick() + 5 -> { + if (!inputDetailAddress.value.isNullOrBlank()) _moveToNextPage.value = true + } + 6 -> onTermsNextClick() + 7 -> _finishJoinFlow.value = true } } @@ -178,6 +190,7 @@ class JoinViewModel @Inject constructor() : ViewModel() { isAllAgreed.value = isChecked isTermsAgreed.value = isChecked isPrivacyAgreed.value = isChecked + isMarketingAgreed.value = isChecked checkAgreementStep() } @@ -192,12 +205,15 @@ class JoinViewModel @Inject constructor() : ViewModel() { checkAgreementStep() } - fun onFinalRegisterClick() { - val terms = isTermsAgreed.value ?: false - val privacy = isPrivacyAgreed.value ?: false - val marketing = isMarketingAgreed.value ?: false - + fun onTermsNextClick() { // viewModelScop.launch { registerUserUseCase() } -> useCase 연결 + + _moveToNextPage.value = true + } + + // Finish + fun onFinishClick() { + _finishJoinFlow.value = true } // 네비게이션 완료 후 이벤트 초기화 From 7f3c9ee4034c8b978280982e6c0cfcc12f095863 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Mon, 23 Feb 2026 15:24:06 +0900 Subject: [PATCH 37/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20finishFragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mumu/presentation/join/FinishFragment.kt | 61 ++++++++++++++++++ .../mumu/presentation/join/JoinActivity.kt | 2 + .../mumu/presentation/join/JoinViewModel.kt | 5 -- app/src/main/res/drawable/mumu_logo.png | Bin 0 -> 15521 bytes app/src/main/res/layout/fragment_finish.xml | 32 +++++++++ .../main/res/navigation/nav_graph_join.xml | 16 ++++- 6 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt create mode 100644 app/src/main/res/drawable/mumu_logo.png create mode 100644 app/src/main/res/layout/fragment_finish.xml diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt new file mode 100644 index 0000000..2410d63 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt @@ -0,0 +1,61 @@ +package kr.ac.anu.mumu.presentation.join + +import android.os.Bundle +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.ForegroundColorSpan +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import kr.ac.anu.mumu.R +import kr.ac.anu.mumu.databinding.FragmentFinishBinding + +class FinishFragment : Fragment() { + private var _binding: FragmentFinishBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentFinishBinding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewSet() + } + + private fun viewSet() { + val originText = binding.tvTitle.text.toString() + val spannable = SpannableStringBuilder(originText) + + val targetWord = "Mumu" + val start = originText.indexOf(targetWord) + val end = start + targetWord.length + + if (start != -1) { + // requireContext()를 사용하여 안전하게 색상 가져오기 + val color = ContextCompat.getColor(requireContext(), R.color.mumumint_300) + + spannable.setSpan( + ForegroundColorSpan(color), + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + + binding.tvTitle.text = spannable + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 1f5a05e..c8d5c75 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -80,6 +80,8 @@ class JoinActivity : AppCompatActivity() { navController.navigate(R.id.action_phoneFragment_to_addressFragment) } else if (currentDest == R.id.addressFragment) { navController.navigate(R.id.action_addressFragment_to_TermsFragment) + } else if (currentDest == R.id.TermsFragment) { + navController.navigate(R.id.action_TermsFragment_to_FinishFragment) } viewModel.doneNavigation() diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 4759831..d9bacf8 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -211,11 +211,6 @@ class JoinViewModel @Inject constructor() : ViewModel() { _moveToNextPage.value = true } - // Finish - fun onFinishClick() { - _finishJoinFlow.value = true - } - // 네비게이션 완료 후 이벤트 초기화 fun doneNavigation() { _moveToNextPage.value = false } } \ No newline at end of file diff --git a/app/src/main/res/drawable/mumu_logo.png b/app/src/main/res/drawable/mumu_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc92a08b52c6769f41950cba4d5f50d890b3769a GIT binary patch literal 15521 zcmXwgcRXC*^Y`jv5rSPr?{yKP_b#GFL?=PC2%@YSEuyTtqW2bEv_x;wMTim-EQ08} zT3Frh`h1_~4==C1_nbL%=1h5?nYq#Wx*B98^duk2g@Qmh0>p&C6ZhDp zHsIeKcTH1I5C}|l`-cO{%%%k%;&>WrD1&Oo7`A{P_zp@sN+3{O0{HSd0SF{3uBEDE z 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 PC8jQ!+l2ie6e^Fm literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_finish.xml b/app/src/main/res/layout/fragment_finish.xml new file mode 100644 index 0000000..22a714b --- /dev/null +++ b/app/src/main/res/layout/fragment_finish.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph_join.xml b/app/src/main/res/navigation/nav_graph_join.xml index 7522c37..8fd4d8a 100644 --- a/app/src/main/res/navigation/nav_graph_join.xml +++ b/app/src/main/res/navigation/nav_graph_join.xml @@ -65,6 +65,20 @@ android:id="@+id/TermsFragment" android:name="kr.ac.anu.mumu.presentation.join.TermsFragment" android:label="TermsFragment" - tools:layout="@layout/fragment_terms" /> + tools:layout="@layout/fragment_terms"> + + + + \ No newline at end of file From 1f0b648b38629dceb5831148cc3240c1860a11d2 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Tue, 24 Feb 2026 10:57:09 +0900 Subject: [PATCH 38/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=9D=B4=EB=8F=99=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anu/mumu/presentation/join/JoinActivity.kt | 13 +++++++++++++ .../anu/mumu/presentation/join/JoinViewModel.kt | 16 ++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index c8d5c75..d7e839e 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -33,6 +33,19 @@ class JoinActivity : AppCompatActivity() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment navController = navHostFragment.navController + navController.addOnDestinationChangedListener { _, destination, _ -> + when (destination.id) { + R.id.nameFragment -> viewModel.setStep(3) + R.id.phoneFragment -> viewModel.setStep(4) + R.id.addressFragment -> viewModel.setStep(5) + R.id.TermsFragment -> viewModel.setStep(6) + R.id.FinishFragment -> { + viewModel.setStep(7) + binding.btnNext.isEnabled = true + } + } + } + viewModel.isButtonEnabled.observe(this) { isEnabled -> binding.btnNext.isEnabled = isEnabled } diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index d9bacf8..354cfa2 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -120,12 +120,6 @@ class JoinViewModel @Inject constructor() : ViewModel() { _isButtonEnabled.value = hasName } - fun onNameCheckClick() { - if (!inputName.value.isNullOrBlank()) { - _moveToNextPage.value = true - } - } - // Phone Code // 인증번호 visiable 여부 결정하는 LiveData private val _isVerificationVisible = MutableLiveData(false) @@ -172,12 +166,6 @@ class JoinViewModel @Inject constructor() : ViewModel() { _isButtonEnabled.value = hasDetail } - fun onAddressCheckClick() { - if (!inputDetailAddress.value.isNullOrBlank()) { - _moveToNextPage.value = true - } - } - // Terms fun checkAgreementStep() { val terms = isTermsAgreed.value ?: false @@ -213,4 +201,8 @@ class JoinViewModel @Inject constructor() : ViewModel() { // 네비게이션 완료 후 이벤트 초기화 fun doneNavigation() { _moveToNextPage.value = false } + + fun setStep(step: Int) { + _accountStep.value = step + } } \ No newline at end of file From 166d0d7d6ec7b9a71a47bbcc89fbe2f2313ffaf3 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Tue, 24 Feb 2026 14:08:04 +0900 Subject: [PATCH 39/40] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20api=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anu/mumu/data/datasource/JoinService.kt | 14 +++++++ .../java/kr/ac/anu/mumu/data/model/JoinDto.kt | 30 +++++++++++++ .../data/repository/JoinRepositoryImpl.kt | 30 +++++++++++++ .../java/kr/ac/anu/mumu/di/NetworkModule.kt | 7 ++++ .../kr/ac/anu/mumu/di/RepositoryModule.kt | 8 ++++ .../mumu/domain/repository/JoinRepository.kt | 7 ++++ .../ac/anu/mumu/domain/usecase/JoinUseCase.kt | 13 ++++++ .../mumu/presentation/join/JoinActivity.kt | 5 +++ .../mumu/presentation/join/JoinViewModel.kt | 42 +++++++++++++++++-- 9 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt create mode 100644 app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt create mode 100644 app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt create mode 100644 app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt create mode 100644 app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt diff --git a/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt b/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt new file mode 100644 index 0000000..e70d703 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt @@ -0,0 +1,14 @@ +package kr.ac.anu.mumu.data.datasource + +import kr.ac.anu.mumu.data.model.JoinRequest +import kr.ac.anu.mumu.data.model.JoinResponse +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.POST + +interface JoinService { + @POST("/api/users/register") + suspend fun registerUser( + @Body request: JoinRequest + ): Response +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt b/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt new file mode 100644 index 0000000..347519b --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt @@ -0,0 +1,30 @@ +package kr.ac.anu.mumu.data.model + +import com.google.gson.annotations.SerializedName + +data class JoinRequest( + val id: String, + val password: String, + val name: String, + val phone: String, + val address: String, + @SerializedName("detail_address") val detailAddress: String, + @SerializedName("postal_code") val postalCode: String, + @SerializedName("terms_agreed") val termsAgreed: Boolean, + @SerializedName("privacy_agreed") val privacyAgreed: Boolean, + @SerializedName("marketing_agreed") val marketingAgreed: Boolean +) + +data class JoinResponse( + val success: Boolean, + val message: String, + val token: String?, + val user: UserDto? +) { + data class UserDto( + val userId: Int, + val id: String, + val name: String, + val phone: String + ) +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt b/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt new file mode 100644 index 0000000..86ee217 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt @@ -0,0 +1,30 @@ +package kr.ac.anu.mumu.data.repository + +import kr.ac.anu.mumu.data.datasource.JoinService +import kr.ac.anu.mumu.data.model.JoinRequest +import kr.ac.anu.mumu.domain.repository.JoinRepository +import org.json.JSONObject +import javax.inject.Inject + +class JoinRepositoryImpl @Inject constructor( + private val joinService: JoinService +) : JoinRepository { + override suspend fun register(request: JoinRequest): Result { + return try { + val response = joinService.registerUser(request) + if (response.isSuccessful) { + Result.success(Unit) + } else { + val errorString = response.errorBody()?.string() + val errorMessage = try { + JSONObject(errorString ?: "").getString("error") + } catch (e: Exception) { + "회원가입에 실패했습니다." + } + Result.failure(Exception(errorMessage)) + } + } catch (e: Exception) { + Result.failure(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt b/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt index f0cdb98..8c979fb 100644 --- a/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt +++ b/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt @@ -5,6 +5,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kr.ac.anu.mumu.data.datasource.AuthService +import kr.ac.anu.mumu.data.datasource.JoinService import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import javax.inject.Singleton @@ -26,4 +27,10 @@ object NetworkModule { fun provideAuthService(retrofit: Retrofit): AuthService { return retrofit.create(AuthService::class.java) } + + @Provides + @Singleton + fun provideJoinService(retrofit: Retrofit): JoinService { + return retrofit.create(JoinService::class.java) + } } diff --git a/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt b/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt index 3e12006..8591104 100644 --- a/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt +++ b/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt @@ -4,7 +4,9 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import kr.ac.anu.mumu.data.repository.JoinRepositoryImpl import kr.ac.anu.mumu.data.repository.LoginRepositoryImpl +import kr.ac.anu.mumu.domain.repository.JoinRepository import kr.ac.anu.mumu.domain.repository.LoginRepository import javax.inject.Singleton @@ -16,4 +18,10 @@ abstract class RepositoryModule { abstract fun bindLoginRepository( loginRepositoryImpl: LoginRepositoryImpl ): LoginRepository + + @Binds + @Singleton + abstract fun bindJoinRepository( + joinRepositoryImpl: JoinRepositoryImpl + ): JoinRepository } diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt b/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt new file mode 100644 index 0000000..c1c4973 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt @@ -0,0 +1,7 @@ +package kr.ac.anu.mumu.domain.repository + +import kr.ac.anu.mumu.data.model.JoinRequest + +interface JoinRepository { + suspend fun register(request: JoinRequest): Result +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt b/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt new file mode 100644 index 0000000..b3827fe --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt @@ -0,0 +1,13 @@ +package kr.ac.anu.mumu.domain.usecase + +import kr.ac.anu.mumu.data.model.JoinRequest +import kr.ac.anu.mumu.domain.repository.JoinRepository +import javax.inject.Inject + +class JoinUseCase @Inject constructor( + private val repository: JoinRepository +) { + suspend operator fun invoke(request: JoinRequest): Result { + return repository.register(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index d7e839e..9a56f5b 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -1,6 +1,7 @@ package kr.ac.anu.mumu.presentation.join import android.os.Bundle +import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -101,5 +102,9 @@ class JoinActivity : AppCompatActivity() { } } + + viewModel.joinErrorMessage.observe(this) { message -> + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } } } \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 354cfa2..95f61f7 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -3,11 +3,17 @@ package kr.ac.anu.mumu.presentation.join import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import kr.ac.anu.mumu.data.model.JoinRequest +import kr.ac.anu.mumu.domain.usecase.JoinUseCase import javax.inject.Inject @HiltViewModel -class JoinViewModel @Inject constructor() : ViewModel() { +class JoinViewModel @Inject constructor( + private val joinUseCase: JoinUseCase +) : ViewModel() { // 입력 데이터 val inputId = MutableLiveData("") @@ -45,6 +51,9 @@ class JoinViewModel @Inject constructor() : ViewModel() { private val _isButtonEnabled = MutableLiveData(false) val isButtonEnabled: LiveData get() = _isButtonEnabled + private val _joinErrorMessage = MutableLiveData() + val joinErrorMessage: LiveData get() = _joinErrorMessage + // 정규식 private val ID_REGEX = Regex("^[a-zA-Z0-9]{7,12}\$") private val PW_REGEX = Regex("^(?=.*[!@#\$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?]).{8,16}\$") @@ -194,9 +203,34 @@ class JoinViewModel @Inject constructor() : ViewModel() { } fun onTermsNextClick() { - // viewModelScop.launch { registerUserUseCase() } -> useCase 연결 - - _moveToNextPage.value = true + _isButtonEnabled.value = false + + viewModelScope.launch { + val request = JoinRequest( + id = inputId.value ?: "", + password = inputPw.value ?: "", + name = inputName.value ?: "", + phone = inputPhoneNum.value ?: "", + address = inputAddress.value ?: "", + detailAddress = inputDetailAddress.value ?: "", + postalCode = inputPostalCode.value ?: "", + termsAgreed = isTermsAgreed.value ?: false, + privacyAgreed = isPrivacyAgreed.value ?: false, + marketingAgreed = isMarketingAgreed.value ?: false + ) + + val result = joinUseCase(request) + + result.fold( + onSuccess = { + _moveToNextPage.value = true + }, + onFailure = { error -> + _joinErrorMessage.value = error.message ?: "네트워크 오류가 발생했습니다." + _isButtonEnabled.value = true + } + ) + } } // 네비게이션 완료 후 이벤트 초기화 From 5c11f254b430246ca147a9a6397b00f73ee9be04 Mon Sep 17 00:00:00 2001 From: bhindor <20250199@student.anu.ac.kr> Date: Tue, 24 Feb 2026 16:52:20 +0900 Subject: [PATCH 40/40] =?UTF-8?q?=F0=9F=8E=A8=20::=20ktlint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt | 2 +- app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt | 2 +- .../java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt | 2 +- .../java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt | 2 +- .../main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt | 2 +- .../java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt | 3 +-- .../java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt | 4 ++-- .../java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt | 2 +- .../java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt | 3 +-- .../java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt | 4 ++-- .../java/kr/ac/anu/mumu/presentation/join/NameFragment.kt | 4 +--- .../java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt | 4 +--- .../java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt | 2 +- 13 files changed, 15 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt b/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt index e70d703..9dd4e87 100644 --- a/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt +++ b/app/src/main/java/kr/ac/anu/mumu/data/datasource/JoinService.kt @@ -11,4 +11,4 @@ interface JoinService { suspend fun registerUser( @Body request: JoinRequest ): Response -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt b/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt index 347519b..314dbd8 100644 --- a/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt +++ b/app/src/main/java/kr/ac/anu/mumu/data/model/JoinDto.kt @@ -27,4 +27,4 @@ data class JoinResponse( val name: String, val phone: String ) -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt b/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt index 86ee217..4313d7d 100644 --- a/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt +++ b/app/src/main/java/kr/ac/anu/mumu/data/repository/JoinRepositoryImpl.kt @@ -27,4 +27,4 @@ class JoinRepositoryImpl @Inject constructor( Result.failure(e) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt b/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt index c1c4973..967bcc4 100644 --- a/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt +++ b/app/src/main/java/kr/ac/anu/mumu/domain/repository/JoinRepository.kt @@ -4,4 +4,4 @@ import kr.ac.anu.mumu.data.model.JoinRequest interface JoinRepository { suspend fun register(request: JoinRequest): Result -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt b/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt index b3827fe..126eabc 100644 --- a/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt +++ b/app/src/main/java/kr/ac/anu/mumu/domain/usecase/JoinUseCase.kt @@ -10,4 +10,4 @@ class JoinUseCase @Inject constructor( suspend operator fun invoke(request: JoinRequest): Result { return repository.register(request) } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt index 3018a9b..53d45db 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AccountFragment.kt @@ -75,7 +75,6 @@ class AccountFragment : Fragment() { viewModel.isPwCheckErrorVisible.observe(viewLifecycleOwner) { isVisible -> binding.tvPwCheckError.visibility = if (isVisible) View.VISIBLE else View.GONE } - } private fun viewSet() { @@ -105,4 +104,4 @@ class AccountFragment : Fragment() { super.onDestroyView() _binding = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt index bc8dc9e..afb8663 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/AddressFragment.kt @@ -44,7 +44,7 @@ class AddressFragment : Fragment() { } binding.btnSearch.setOnClickListener { - //TODO 카카오 API + // TODO 카카오 API viewModel.inputPostalCode.value = "36729" viewModel.inputAddress.value = "경상북도 안동시 경동로 1375" } @@ -82,4 +82,4 @@ class AddressFragment : Fragment() { super.onDestroyView() _binding = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt index 2410d63..7cd2df2 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/FinishFragment.kt @@ -58,4 +58,4 @@ class FinishFragment : Fragment() { super.onDestroyView() _binding = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt index 9a56f5b..4f88653 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinActivity.kt @@ -100,11 +100,10 @@ class JoinActivity : AppCompatActivity() { viewModel.doneNavigation() } - } viewModel.joinErrorMessage.observe(this) { message -> Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt index 95f61f7..55d2428 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/JoinViewModel.kt @@ -170,7 +170,7 @@ class JoinViewModel @Inject constructor( // Address fun checkAddressStep() { - //TODO 우편번호랑 도로명은 주소 API 사용하면서 작성 + // TODO 우편번호랑 도로명은 주소 API 사용하면서 작성 val hasDetail = !inputDetailAddress.value.isNullOrBlank() _isButtonEnabled.value = hasDetail } @@ -239,4 +239,4 @@ class JoinViewModel @Inject constructor( fun setStep(step: Int) { _accountStep.value = step } -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt index 7f17cd8..a05eaba 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/NameFragment.kt @@ -14,7 +14,6 @@ class NameFragment : Fragment() { private val binding get() = _binding!! private val viewModel: JoinViewModel by activityViewModels() - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -39,5 +38,4 @@ class NameFragment : Fragment() { super.onDestroyView() _binding = null } - -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt index 601e6fe..a3bc11c 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/PhoneFragment.kt @@ -60,7 +60,6 @@ class PhoneFragment : Fragment() { viewModel.checkPhoneStep() isFormatting = false - } }) @@ -102,5 +101,4 @@ class PhoneFragment : Fragment() { super.onDestroyView() _binding = null } - -} \ No newline at end of file +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt index f0ab1b8..5a1c540 100644 --- a/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/join/TermsFragment.kt @@ -72,4 +72,4 @@ class TermsFragment : Fragment() { super.onDestroyView() _binding = null } -} \ No newline at end of file +}