From 79862e3a7dee911c67a7a5cdc21a4771abba46fe Mon Sep 17 00:00:00 2001 From: kimdowoo Date: Sun, 9 Apr 2023 21:08:39 +0900 Subject: [PATCH] =?UTF-8?q?[BUD-50]=20refactor=20:=20buddy=20DTO,ViewModel?= =?UTF-8?q?=20=EA=B5=AC=EB=B6=84=20=EC=A0=81=EC=9A=A9(#34)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../buddyvet/buddy/BuddyListAdapter.kt | 17 +- .../buddyvet/buddy/BuddyProfileListAdapter.kt | 14 +- .../nocapstone/buddyvet/buddy/BuddyUtil.kt | 13 ++ .../buddy/HomeBuddyProfileListAdapter.kt | 16 +- .../buddyvet/buddy/domain/entity/BuddyData.kt | 26 ++- .../buddy/domain/entity/BuddyDataLocal.kt | 39 ++++ .../buddy/domain/entity/BuddyRequest.kt | 10 +- .../buddy/domain/usecase/BuddyUseCase.kt | 5 +- .../buddyvet/buddy/ui/BuddyViewModel.kt | 47 ++-- .../buddy/ui/CompleteRegistrationFragment.kt | 2 +- .../buddy/ui/InputBuddyInfoFragment.kt | 15 +- .../buddyvet/buddy/ui/PutBuddyFragment.kt | 110 ++++++++++ .../layout/fragment_complete_registration.xml | 4 +- .../main/res/layout/fragment_put_buddy.xml | 202 ++++++++++++++++++ .../src/main/res/layout/item_buddy_detail.xml | 4 +- .../main/res/layout/item_buddy_profile.xml | 10 +- .../res/layout/item_buddy_profile_home.xml | 4 +- buddy/src/main/res/navigation/nav_buddy.xml | 11 + 18 files changed, 474 insertions(+), 75 deletions(-) create mode 100644 buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyUtil.kt create mode 100644 buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyDataLocal.kt create mode 100644 buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/PutBuddyFragment.kt create mode 100644 buddy/src/main/res/layout/fragment_put_buddy.xml diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyListAdapter.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyListAdapter.kt index 7e53f42..f4493c8 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyListAdapter.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyListAdapter.kt @@ -13,12 +13,14 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.nocapstone.buddyvet.buddy.databinding.ItemBuddyDetailBinding import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData +import com.nocapstone.buddyvet.buddy.domain.entity.BuddyDataLocal import com.nocapstone.buddyvet.buddy.ui.MyBuddyFragment +import com.nocapstone.buddyvet.buddy.ui.MyBuddyFragmentDirections import com.nocapstone.common_ui.R.menu.common_menu class BuddyListAdapter( val fragment: Fragment -) : ListAdapter(BuddyListDiffCallback()) { +) : ListAdapter(BuddyListDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return BuddyListViewHolder( ItemBuddyDetailBinding.inflate( @@ -31,14 +33,14 @@ class BuddyListAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is BuddyListViewHolder) { - val buddyData = getItem(position) - holder.bind(buddyData, position) + val buddyDataLocal = getItem(position) + holder.bind(buddyDataLocal, position) } } inner class BuddyListViewHolder(private val binding: ItemBuddyDetailBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(data: BuddyData, position: Int) { + fun bind(data: BuddyDataLocal, position: Int) { binding.apply { buddyData = data more.setOnClickListener { @@ -58,6 +60,7 @@ class BuddyListAdapter( (fragment as MyBuddyFragment).buddyViewModel.deleteBuddy(id) } com.nocapstone.common_ui.R.id.put -> { + fragment.findNavController().navigate(MyBuddyFragmentDirections.putFragment(id)) } } true @@ -68,12 +71,12 @@ class BuddyListAdapter( } } -private class BuddyListDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { +private class BuddyListDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BuddyDataLocal, newItem: BuddyDataLocal): Boolean { return oldItem === newItem } - override fun areContentsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { + override fun areContentsTheSame(oldItem: BuddyDataLocal, newItem: BuddyDataLocal): Boolean { return oldItem == newItem } } \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt index 47717d9..bfdef44 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt @@ -6,13 +6,13 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.nocapstone.buddyvet.buddy.databinding.ItemBuddyProfileBinding -import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData +import com.nocapstone.buddyvet.buddy.domain.entity.BuddyDataLocal class BuddyProfileListAdapter( private val ColorChange: Boolean, private val onClickBuddyListener: (Int) -> Unit ) : - ListAdapter(BuddyProfileListDiffCallback()) { + ListAdapter(BuddyProfileListDiffCallback()) { var prePosition = -1 @@ -35,10 +35,10 @@ class BuddyProfileListAdapter( inner class BuddyListViewHolder(private val binding: ItemBuddyProfileBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(data: BuddyData, position: Int) { + fun bind(data: BuddyDataLocal, position: Int) { binding.apply { - buddyData = data + buddyDataLocal = data } itemView.setOnClickListener { @@ -56,12 +56,12 @@ class BuddyProfileListAdapter( } } -private class BuddyProfileListDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { +private class BuddyProfileListDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BuddyDataLocal, newItem: BuddyDataLocal): Boolean { return oldItem === newItem } - override fun areContentsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { + override fun areContentsTheSame(oldItem: BuddyDataLocal, newItem: BuddyDataLocal): Boolean { return oldItem == newItem } } \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyUtil.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyUtil.kt new file mode 100644 index 0000000..67797af --- /dev/null +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyUtil.kt @@ -0,0 +1,13 @@ +package com.nocapstone.buddyvet.buddy + +object BuddyDtoToLocal { + fun transformKind(kind: String): String = if (kind == "D") "강아지" else "고양이" + fun transformGender(gender: String): String = if (gender == "M") "남자" else "여자" + fun transformNeutered(neutered : Boolean) : String = if (neutered) "예" else "아니요" +} + +object BuddyLocalToDto { + fun transformKind(kind: String): String = if (kind == "강아지") "D" else "C" + fun transformGender(gender: String): String = if (gender == "남자") "M" else "F" + fun transformNeutered(neutered : String?) : Boolean = neutered == "예" +} diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/HomeBuddyProfileListAdapter.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/HomeBuddyProfileListAdapter.kt index 63cac97..88a0c92 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/HomeBuddyProfileListAdapter.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/HomeBuddyProfileListAdapter.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.nocapstone.buddyvet.buddy.databinding.ItemBuddyProfileBinding import com.nocapstone.buddyvet.buddy.databinding.ItemBuddyProfileHomeBinding import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData +import com.nocapstone.buddyvet.buddy.domain.entity.BuddyDataLocal class HomeBuddyProfileListAdapter() : - ListAdapter(HomeBuddyProfileListDiffCallback()) { + ListAdapter(HomeBuddyProfileListDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return BuddyListViewHolder( ItemBuddyProfileHomeBinding.inflate( @@ -23,15 +24,14 @@ class HomeBuddyProfileListAdapter() : override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is BuddyListViewHolder) { - val buddyData = getItem(position) - holder.bind(buddyData, position) + val buddyDataLocal = getItem(position) + holder.bind(buddyDataLocal, position) } } inner class BuddyListViewHolder(private val binding: ItemBuddyProfileHomeBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(data: BuddyData, position: Int) { - + fun bind(data: BuddyDataLocal, position: Int) { binding.apply { buddyData = data } @@ -39,12 +39,12 @@ class HomeBuddyProfileListAdapter() : } } -private class HomeBuddyProfileListDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { +private class HomeBuddyProfileListDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BuddyDataLocal, newItem: BuddyDataLocal): Boolean { return oldItem === newItem } - override fun areContentsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { + override fun areContentsTheSame(oldItem: BuddyDataLocal, newItem: BuddyDataLocal): Boolean { return oldItem == newItem } } \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyData.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyData.kt index 0cf1bb6..4e5e498 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyData.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyData.kt @@ -1,5 +1,7 @@ package com.nocapstone.buddyvet.buddy.domain.entity +import com.nocapstone.buddyvet.buddy.BuddyDtoToLocal + data class BuddyListResponse( val buddies: List? ) @@ -11,8 +13,16 @@ data class BuddyData( val gender: String, val profile: String, val age: String, - var isSelect : Boolean = false -) +) { + fun replaceForLocal() = BuddyDataLocal( + id, + BuddyDtoToLocal.transformKind(kind), + name, + BuddyDtoToLocal.transformGender(gender), + profile, + age + ) +} data class BuddyId( val buddyId: Long @@ -30,4 +40,14 @@ data class BuddyDetailData( val adoptDay: String, val isNeutered: Boolean, val gender: String -) +) { + fun replaceForLocal() = BuddyDetailDataLocal( + BuddyDtoToLocal.transformKind(kind), + name, + BuddyDtoToLocal.transformGender(gender), + profile, + BuddyDtoToLocal.transformNeutered(isNeutered), + adoptDay, + birthday + ) +} diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyDataLocal.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyDataLocal.kt new file mode 100644 index 0000000..cb2a209 --- /dev/null +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyDataLocal.kt @@ -0,0 +1,39 @@ +package com.nocapstone.buddyvet.buddy.domain.entity + +import com.nocapstone.buddyvet.buddy.BuddyLocalToDto + +// BuddyDetailDataLocal를 BuddyRequest로 변환 +// BuddyResponse를 BuddyDataLocal로 변환 + +data class BuddyDetailDataLocal( + val kind: String, + var name: String? = null, + var gender: String? = null, + var profile: String? = null, + var neutered: String? = null, + var adoptDay: String? = null, + var birthday: String? = null +) { + fun replaceForDto() = BuddyRequest( + BuddyLocalToDto.transformKind(kind), + name, + birthday, + adoptDay, + BuddyLocalToDto.transformNeutered(neutered), + gender + ) +} + + +data class BuddyDataLocal( + val id: Long, + val kind: String, + val name: String, + val gender: String, + val profile: String, + val age: String, + var isSelect: Boolean = false +) + + + diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyRequest.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyRequest.kt index 64443bb..f0bcae5 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyRequest.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/BuddyRequest.kt @@ -2,9 +2,9 @@ package com.nocapstone.buddyvet.buddy.domain.entity data class BuddyRequest( val kind : String, - var name : String = "DOWOO", - var birthday : String = "2023-04-08", - var adoptDay : String = "2023-04-08", - var isNeutered : Boolean = false, - var gender : String = "M" + var name : String?, + var birthday : String?, + var adoptDay : String?, + var isNeutered : Boolean?, + var gender : String? ) \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/usecase/BuddyUseCase.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/usecase/BuddyUseCase.kt index e3ce7dd..8da8f6c 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/usecase/BuddyUseCase.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/usecase/BuddyUseCase.kt @@ -2,6 +2,7 @@ package com.nocapstone.buddyvet.buddy.domain.usecase import com.nocapstone.buddyvet.buddy.data.BuddyService import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData +import com.nocapstone.buddyvet.buddy.domain.entity.BuddyDetailResponse import com.nocapstone.buddyvet.buddy.domain.entity.BuddyRequest import com.nocapstone.buddyvet.buddy.domain.entity.MasterInfoResponse import com.nocapstone.common.data.dto.CommonResponse @@ -20,8 +21,8 @@ class BuddyUseCase @Inject constructor( return buddyService.createBuddy(token, buddyRequest).data.buddyId } - suspend fun readBuddyDetail(token: String, buddyId: Long) { - buddyService.readBuddyDetail(token, buddyId) + suspend fun readBuddyDetail(token: String, buddyId: Long): BuddyDetailResponse { + return buddyService.readBuddyDetail(token, buddyId).data } suspend fun deleteBuddy(token: String, buddyId: Long) { diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/BuddyViewModel.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/BuddyViewModel.kt index c7d52f0..5b2eae2 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/BuddyViewModel.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/BuddyViewModel.kt @@ -6,9 +6,7 @@ import android.provider.OpenableColumns import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData -import com.nocapstone.buddyvet.buddy.domain.entity.BuddyRequest -import com.nocapstone.buddyvet.buddy.domain.entity.MasterInfoResponse +import com.nocapstone.buddyvet.buddy.domain.entity.* import com.nocapstone.buddyvet.buddy.domain.usecase.BuddyUseCase import com.nocapstone.common.domain.usecase.DataStoreUseCase import dagger.hilt.android.lifecycle.HiltViewModel @@ -33,11 +31,11 @@ class BuddyViewModel @Inject constructor( private val dataStoreUseCase: DataStoreUseCase ) : ViewModel() { - private val _buddyList = MutableStateFlow?>(null) - val buddyList: StateFlow?> = _buddyList + private val _buddyList = MutableStateFlow?>(null) + val buddyList: StateFlow?> = _buddyList - private val _newBuddy = MutableStateFlow(null) - val newBuddy: StateFlow = _newBuddy + private val _newBuddy = MutableStateFlow(null) + val newBuddy: StateFlow = _newBuddy private val _selectImgUri = MutableStateFlow(null) val selectImgUri: StateFlow = _selectImgUri @@ -48,12 +46,15 @@ class BuddyViewModel @Inject constructor( private val _masterInfo = MutableStateFlow(null) val masterInfo: StateFlow = _masterInfo + private val _detailBuddy = MutableStateFlow(null) + val detailBuddy: StateFlow = _detailBuddy + fun setSelectCheckBuddy(position: Int) { _selectBuddy.value = position } fun setKind(kind: String) { - _newBuddy.value = BuddyRequest(kind) + _newBuddy.value = BuddyDetailDataLocal(kind) } fun setName(name: String) { @@ -68,26 +69,28 @@ class BuddyViewModel @Inject constructor( _newBuddy.value?.adoptDay = adoptDay } - fun setNeutered(Neutered: Boolean) { - _newBuddy.value?.isNeutered = Neutered + fun setNeutered(Neutered: String) { + _newBuddy.value?.neutered = Neutered } fun setGender(gender: String) { - _newBuddy.value?.gender = gender + _newBuddy.value?.gender = gender } fun setSelectImgUri(uri: Uri?) { _selectImgUri.value = uri } + fun getKind(): String = _detailBuddy.value!!.kind fun getBuddyLists() = _buddyList.value - fun readBuddyList() { viewModelScope.launch(Dispatchers.IO) { try { val token = dataStoreUseCase.bearerJsonWebToken.first() if (token != null) { - _buddyList.value = buddyUseCase.readBuddyList(token) + _buddyList.value = buddyUseCase.readBuddyList(token)?.map { + it.replaceForLocal() + } } } catch (e: Exception) { } @@ -98,21 +101,27 @@ class BuddyViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { try { val jwt = dataStoreUseCase.bearerJsonWebToken.first()!! - val buddyId = buddyUseCase.createBuddy(jwt, _newBuddy.value!!) + val buddyId = buddyUseCase.createBuddy(jwt, _newBuddy.value!!.replaceForDto()) if (_selectImgUri.value != null) { uploadBuddyImg(jwt, buddyId).await() } callback.invoke() } catch (e: Exception) { - Log.d("createBuddy", e.message.toString()) } } } fun readBuddyDetail(buddyId: Long) { - viewModelScope.launch { - val jwt = dataStoreUseCase.bearerJsonWebToken.first()!! - buddyUseCase.readBuddyDetail(jwt, buddyId) + viewModelScope.launch(Dispatchers.IO) { + val token = dataStoreUseCase.bearerJsonWebToken.first() + if (token != null) { + try { + _detailBuddy.value = + buddyUseCase.readBuddyDetail(token, buddyId).buddy.replaceForLocal() + } catch (e: Exception) { + + } + } } } @@ -124,7 +133,7 @@ class BuddyViewModel @Inject constructor( } } - private fun uploadBuddyImg(token: String, buddyId: Long) : Deferred { + private fun uploadBuddyImg(token: String, buddyId: Long): Deferred { return viewModelScope.async(Dispatchers.IO) { val imgUri = _selectImgUri.value!! val inputStream = context.contentResolver.openInputStream(imgUri) diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/CompleteRegistrationFragment.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/CompleteRegistrationFragment.kt index 95cadc2..f12d351 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/CompleteRegistrationFragment.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/CompleteRegistrationFragment.kt @@ -41,7 +41,7 @@ class CompleteRegistrationFragment : Fragment() { } binding.next.setOnClickListener { - buddyViewModel.createBuddy(){ + buddyViewModel.createBuddy() { LoginUtil.startMainActivity(requireActivity(), mainActivityClass) } } diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyInfoFragment.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyInfoFragment.kt index 3c2e425..cd85747 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyInfoFragment.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyInfoFragment.kt @@ -91,22 +91,11 @@ class InputBuddyInfoFragment : Fragment() { private fun setData() { with(binding) { buddyViewModel.setName(nameTv.text.toString()) - buddyViewModel.setNeutered( - when (isNeuteredTv.text.toString()) { - neuteredItem[0] -> true - else -> false - } - ) - buddyViewModel.setGender( - when (genderTv.text.toString()) { - genderListItem[0] -> "M" - else -> "F" - } - ) + buddyViewModel.setNeutered(isNeuteredTv.text.toString()) + buddyViewModel.setGender(genderTv.text.toString()) buddyViewModel.setAdoptDay(adoptDayTv.text.toString()) buddyViewModel.setBirthDay(birthDayTv.text.toString()) } - } diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/PutBuddyFragment.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/PutBuddyFragment.kt new file mode 100644 index 0000000..490945b --- /dev/null +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/PutBuddyFragment.kt @@ -0,0 +1,110 @@ +package com.nocapstone.buddyvet.buddy.ui + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.TextView +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import com.nocapstone.buddyvet.buddy.databinding.FragmentPutBuddyBinding +import com.nocapstone.buddyvet.buddy.domain.entity.BuddyDetailData +import com.nocapstone.buddyvet.buddy.domain.entity.BuddyRequest +import com.nocapstone.common_ui.CalendarUtil +import com.nocapstone.common_ui.DialogForDatePicker +import com.nocapstone.common_ui.MainActivityUtil +import com.nocapstone.common_ui.R +import dagger.hilt.android.AndroidEntryPoint +import gun0912.tedimagepicker.builder.TedImagePicker + +@AndroidEntryPoint +class PutBuddyFragment : Fragment() { + + private val args: PutBuddyFragmentArgs by navArgs() + private var buddyId = 0L + private val buddyViewModel: BuddyViewModel by viewModels({ requireActivity() }) + private var _binding: FragmentPutBuddyBinding? = null + private val binding get() = _binding!! + private val neuteredItem = listOf("예", "아니오") + private val genderListItem = listOf("남자", "여자") + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentPutBuddyBinding.inflate(inflater, container, false) + buddyId = args.buddyId + + (activity as MainActivityUtil).run { + setToolbarTitle("버디 수정") + setVisibilityBottomAppbar(View.GONE) + } + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val neuteredAdapter = ArrayAdapter( + requireContext(), + R.layout.list_item, + neuteredItem + ) + val genderAdapter = ArrayAdapter( + requireContext(), + R.layout.list_item, + genderListItem + ) + + binding.apply { + lifecycleOwner = viewLifecycleOwner + viewModel = buddyViewModel + genderTv.setAdapter(genderAdapter) + isNeuteredTv.setAdapter(neuteredAdapter) + birthDayTv.setOnClickListener { + DialogForDatePicker.Builder(requireContext()) + .setInitDate(CalendarUtil.parseStringToDate(binding.birthDayTv.text.toString())!!) + .setOnClickPositiveButton { newDate -> + binding.birthDayTv.text = CalendarUtil.parseDateToFormatString(newDate) + } + .build().show() + } + adoptDayTv.setOnClickListener { + DialogForDatePicker.Builder(requireContext()) + .setInitDate(CalendarUtil.parseStringToDate(binding.adoptDayTv.text.toString())!!) + .setOnClickPositiveButton { newDate -> + binding.adoptDayTv.text = CalendarUtil.parseDateToFormatString(newDate) + } + .build().show() + } + imgSelect.setOnClickListener { + TedImagePicker.with(requireContext()) + .start { + buddyViewModel.setSelectImgUri(it) + } + } + binding.next.setOnClickListener { + putData() + findNavController().navigate(com.nocapstone.buddyvet.buddy.R.id.next) + } + } + buddyViewModel.readBuddyDetail(buddyId) + } + + private fun putData() { + with(binding) { + BuddyRequest( + buddyViewModel.getKind(), + nameTv.text.toString(), + birthDayTv.text.toString(), + adoptDayTv.text.toString(), + isNeuteredTv.text.toString().toBoolean(), + genderTv.text.toString() + ) + } + } +} \ No newline at end of file diff --git a/buddy/src/main/res/layout/fragment_complete_registration.xml b/buddy/src/main/res/layout/fragment_complete_registration.xml index 93337b6..0728dae 100644 --- a/buddy/src/main/res/layout/fragment_complete_registration.xml +++ b/buddy/src/main/res/layout/fragment_complete_registration.xml @@ -65,7 +65,7 @@ android:layout_height="wrap_content" android:layout_marginTop="32dp" android:fontFamily="@font/cafe24_ssurround" - android:text='@{viewModel.newBuddy.gender == "M" ? "남아" : "여아"}' + android:text='@{viewModel.newBuddy.gender}' android:textColor="@color/black" android:textSize="17sp" /> @@ -74,7 +74,7 @@ android:layout_height="wrap_content" android:layout_marginTop="32dp" android:fontFamily="@font/cafe24_ssurround" - android:text='@{"중성화 여부 : " + (viewModel.newBuddy.neutered ? "O" : "X")}' + android:text='@{"중성화 여부 : " + viewModel.newBuddy.neutered}' android:textColor="@color/black" android:textSize="17sp" /> diff --git a/buddy/src/main/res/layout/fragment_put_buddy.xml b/buddy/src/main/res/layout/fragment_put_buddy.xml new file mode 100644 index 0000000..49e09cd --- /dev/null +++ b/buddy/src/main/res/layout/fragment_put_buddy.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buddy/src/main/res/layout/item_buddy_detail.xml b/buddy/src/main/res/layout/item_buddy_detail.xml index 486c680..bae62a6 100644 --- a/buddy/src/main/res/layout/item_buddy_detail.xml +++ b/buddy/src/main/res/layout/item_buddy_detail.xml @@ -7,7 +7,7 @@ + type="com.nocapstone.buddyvet.buddy.domain.entity.BuddyDataLocal" /> + name="BuddyDataLocal" + type="com.nocapstone.buddyvet.buddy.domain.entity.BuddyDataLocal" /> @@ -25,7 +25,7 @@ android:layout_height="60dp" android:layout_margin="8dp" android:elevation="16dp" - app:cardBackgroundColor="@{buddyData.isSelect ? @color/butter : @color/white}" + app:cardBackgroundColor="@{BuddyDataLocal.isSelect ? @color/butter : @color/white}" app:cardCornerRadius="50dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -34,7 +34,7 @@ + type="com.nocapstone.buddyvet.buddy.domain.entity.BuddyDataLocal" /> @@ -26,6 +26,8 @@ android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center" + app:civ_border_width="1dp" + app:civ_border_color="@color/black" app:civ_border_overlay="true" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/buddy/src/main/res/navigation/nav_buddy.xml b/buddy/src/main/res/navigation/nav_buddy.xml index 2d89439..17009f8 100644 --- a/buddy/src/main/res/navigation/nav_buddy.xml +++ b/buddy/src/main/res/navigation/nav_buddy.xml @@ -31,5 +31,16 @@ + + + + \ No newline at end of file