diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4fa56e57..29c2ca63 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") + id("kotlin-kapt") } android { @@ -35,6 +36,7 @@ android { } buildFeatures { viewBinding = true + dataBinding = true } } diff --git a/app/src/main/java/umc/com/mobile/project/data/model/gradInfo/ScheduleSpinner.kt b/app/src/main/java/umc/com/mobile/project/data/model/gradInfo/ScheduleSpinner.kt new file mode 100644 index 00000000..ac3a717b --- /dev/null +++ b/app/src/main/java/umc/com/mobile/project/data/model/gradInfo/ScheduleSpinner.kt @@ -0,0 +1,5 @@ +package umc.com.mobile.project.data.model.gradInfo + +data class ScheduleSpinner( + val name: String, +) \ No newline at end of file diff --git a/app/src/main/java/umc/com/mobile/project/data/model/login/LoginResponse.kt b/app/src/main/java/umc/com/mobile/project/data/model/login/LoginResponse.kt new file mode 100644 index 00000000..8c4f71b6 --- /dev/null +++ b/app/src/main/java/umc/com/mobile/project/data/model/login/LoginResponse.kt @@ -0,0 +1,6 @@ +package umc.com.mobile.project.data.model.login + +data class LoginResponse ( + val id: String, + val pw: String +) \ No newline at end of file diff --git a/app/src/main/java/umc/com/mobile/project/ui/gradInfo/GradeFragment.kt b/app/src/main/java/umc/com/mobile/project/ui/gradInfo/GradeFragment.kt index 5136b51f..48ff1ba3 100644 --- a/app/src/main/java/umc/com/mobile/project/ui/gradInfo/GradeFragment.kt +++ b/app/src/main/java/umc/com/mobile/project/ui/gradInfo/GradeFragment.kt @@ -1,19 +1,17 @@ package umc.com.mobile.project.ui.gradInfo +import android.R import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.SpinnerAdapter +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.viewpager2.widget.ViewPager2 -import com.google.android.material.tabs.TabLayout -import com.google.android.material.tabs.TabLayoutMediator -import umc.com.mobile.project.databinding.FragmentCareerBinding -import umc.com.mobile.project.databinding.FragmentGradInfoBinding import umc.com.mobile.project.databinding.FragmentGradeBinding -import umc.com.mobile.project.ui.career.CareerViewModel -import umc.com.mobile.project.ui.gradInfo.adapter.GradInfoVPAdapter class GradeFragment : Fragment() { private var _binding: FragmentGradeBinding? = null @@ -27,9 +25,8 @@ class GradeFragment : Fragment() { ): View { _binding = FragmentGradeBinding.inflate(inflater, container, false) - viewModel.text.observe(viewLifecycleOwner) { -// binding.text.text = it - } + initSpinnerSchedule() // spinner 설정 + return binding.root } @@ -37,4 +34,28 @@ class GradeFragment : Fragment() { super.onDestroyView() _binding = null } + + private fun initSpinnerSchedule() { + binding.spinnerSchedule.onItemSelectedListener = + object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, + view: View?, + position: Int, + id: Long + ) { + if (!binding.spinnerSchedule.getItemAtPosition(position).equals("시간표 불러오기")) { + Toast.makeText( + context, + "Selected: ${binding.spinnerSchedule.getItemAtPosition(position)}", + Toast.LENGTH_LONG + ) + } + } + + override fun onNothingSelected(p0: AdapterView<*>?) { + + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/umc/com/mobile/project/ui/gradInfo/adapter/SpinnerAdapter.kt b/app/src/main/java/umc/com/mobile/project/ui/gradInfo/adapter/SpinnerAdapter.kt new file mode 100644 index 00000000..ec7aec13 --- /dev/null +++ b/app/src/main/java/umc/com/mobile/project/ui/gradInfo/adapter/SpinnerAdapter.kt @@ -0,0 +1,51 @@ +package umc.com.mobile.project.ui.gradInfo.adapter + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.annotation.LayoutRes +import androidx.core.content.ContextCompat +import umc.com.mobile.project.R +import umc.com.mobile.project.data.model.gradInfo.ScheduleSpinner +import umc.com.mobile.project.databinding.ItemSpinnerGradInfoScheduleBinding + +class SpinnerAdapter( + context: Context, + @LayoutRes private val resId: Int, + private val values: MutableList +) : ArrayAdapter(context, resId, values) { + + override fun getCount() = values.size + + + override fun getItem(position: Int) = values[position] + + @SuppressLint("ViewHolder") + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val binding = ItemSpinnerGradInfoScheduleBinding.inflate(LayoutInflater.from(parent.context), parent, false) + val model = values[position] + try { + binding.tvSchedule.text = model.name + binding.tvSchedule.setTextColor(ContextCompat.getColor(context, R.color.white)) + } catch (e: Exception) { + e.printStackTrace() + } + return binding.root + } + + override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { + val binding = ItemSpinnerGradInfoScheduleBinding.inflate(LayoutInflater.from(parent.context), parent, false) + val model = values[position] + try { + binding.tvSchedule.text = model.name + + } catch (e: Exception) { + e.printStackTrace() + } + return binding.root + } + +} \ No newline at end of file diff --git a/app/src/main/java/umc/com/mobile/project/ui/login/LoginActivity.kt b/app/src/main/java/umc/com/mobile/project/ui/login/LoginActivity.kt index 502d6d40..bd32fb65 100644 --- a/app/src/main/java/umc/com/mobile/project/ui/login/LoginActivity.kt +++ b/app/src/main/java/umc/com/mobile/project/ui/login/LoginActivity.kt @@ -2,12 +2,15 @@ package umc.com.mobile.project.ui.login import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import umc.com.mobile.project.MainActivity import umc.com.mobile.project.databinding.ActivityLoginBinding +import umc.com.mobile.project.ui.login.viewmodel.LoginViewModel class LoginActivity : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding + private val viewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -15,6 +18,9 @@ class LoginActivity : AppCompatActivity() { binding = ActivityLoginBinding.inflate(layoutInflater) setContentView(binding.root) + binding.vm = viewModel + binding.lifecycleOwner = this + binding.btnLogin.setOnClickListener { val intent = Intent(this@LoginActivity, MainActivity::class.java) startActivity(intent) diff --git a/app/src/main/java/umc/com/mobile/project/ui/login/viewmodel/LoginViewModel.kt b/app/src/main/java/umc/com/mobile/project/ui/login/viewmodel/LoginViewModel.kt new file mode 100644 index 00000000..742ab155 --- /dev/null +++ b/app/src/main/java/umc/com/mobile/project/ui/login/viewmodel/LoginViewModel.kt @@ -0,0 +1,28 @@ +package umc.com.mobile.project.ui.login.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class LoginViewModel: ViewModel() { + /** + * 버튼 활성화 기능 + */ + val id: MutableLiveData = MutableLiveData() + val pw: MutableLiveData = MutableLiveData() + + val isFilledAllOptions: LiveData = MediatorLiveData().apply { + addSource(id) { value = isBothFieldsFilled() } + addSource(pw) { value = isBothFieldsFilled() } + } + + private fun isBothFieldsFilled(): Boolean { + return !id.value.isNullOrEmpty() && !pw.value.isNullOrEmpty() + } + + fun init() { + id.postValue("") + pw.postValue("") + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_blue_radius_25.xml b/app/src/main/res/drawable/bg_solid_blue_radius_25.xml new file mode 100644 index 00000000..d4ca2d7a --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_blue_radius_25.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_spinner_solid_blue_radius_16_5.xml b/app/src/main/res/drawable/bg_spinner_solid_blue_radius_16_5.xml new file mode 100644 index 00000000..3a81d1e2 --- /dev/null +++ b/app/src/main/res/drawable/bg_spinner_solid_blue_radius_16_5.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_blue_radius_16_5.xml b/app/src/main/res/drawable/bg_stroke_blue_radius_16_5.xml new file mode 100644 index 00000000..6cec5aa6 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_blue_radius_16_5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_top_gray_1.xml b/app/src/main/res/drawable/bg_stroke_top_gray_1.xml new file mode 100644 index 00000000..59f4b0de --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_top_gray_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down_14.xml b/app/src/main/res/drawable/ic_down_14.xml new file mode 100644 index 00000000..b3a6554e --- /dev/null +++ b/app/src/main/res/drawable/ic_down_14.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index dcd67656..aafb641c 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,90 +1,103 @@ - + xmlns:tools="http://schemas.android.com/tools"> - + - + + - - - + android:layout_height="match_parent" + android:background="@color/ivory" + android:gravity="center" + android:orientation="vertical" + tools:context=".ui.verification.VerificationFragment"> - + - + - + + + + + + + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b8749beb..2b81dd68 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,7 +16,7 @@ android:paddingBottom="10dp" app:itemIconTint="@color/selector_selected_skyblue_else_gray" app:itemPaddingBottom="5dp" - app:itemRippleColor="@android:color/transparent" + app:itemRippleColor="@null" app:itemTextAppearanceActive="@style/MediumFont.12" app:itemTextColor="@color/selector_selected_skyblue_else_gray" app:labelVisibilityMode="labeled" diff --git a/app/src/main/res/layout/fragment_grad_info.xml b/app/src/main/res/layout/fragment_grad_info.xml index 60f6a816..10d531d2 100644 --- a/app/src/main/res/layout/fragment_grad_info.xml +++ b/app/src/main/res/layout/fragment_grad_info.xml @@ -19,11 +19,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_spinner_grad_info_schedule.xml b/app/src/main/res/layout/item_spinner_grad_info_schedule.xml new file mode 100644 index 00000000..e11aa5da --- /dev/null +++ b/app/src/main/res/layout/item_spinner_grad_info_schedule.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1d0b409f..5bbb227c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,14 +36,17 @@ 사진이나 파일을 업로드해주세요 추가하기 - + + + 졸업까지 내 전공의 졸업요건 \n한눈에 알아보기 더보기 나만의 \n다음 계획 + 로그인 ID/PW는 학교 서버에 접속할 때만 사용합니다. \n어떠한 데이터도 수집하지 않습니다. 비밀번호 (PW) @@ -51,4 +54,12 @@ 종합정보시스템의 ID/PW를 입력하세요. HANSUNG UNIV + + + 시간표 불러오기 + 1학년 1학기 + 1학년 2학기 + 2학년 1학기 + + \ No newline at end of file