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 e006797..43330e2 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyListAdapter.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyListAdapter.kt @@ -1,25 +1,18 @@ package com.nocapstone.buddyvet.buddy -import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup 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.databinding.ItemBuddyDetailBinding import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData class BuddyListAdapter( - private val ColorChange: Boolean, - private val onClickBuddyListener: (Int) -> Unit -) : - ListAdapter(BuddyListDiffCallback()) { - - var prePosition = -1 - +) : ListAdapter(BuddyListDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return BuddyListViewHolder( - ItemBuddyProfileBinding.inflate( + ItemBuddyDetailBinding.inflate( LayoutInflater.from(parent.context), parent, false @@ -34,25 +27,12 @@ class BuddyListAdapter( } } - inner class BuddyListViewHolder(private val binding: ItemBuddyProfileBinding) : + inner class BuddyListViewHolder(private val binding: ItemBuddyDetailBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(data: BuddyData, position: Int) { - binding.apply { buddyData = data } - - itemView.setOnClickListener { - onClickBuddyListener(position) - if (ColorChange) { - if (prePosition >= 0) { - getItem(prePosition).isSelect = false - } - getItem(position).isSelect = true - prePosition = position - notifyDataSetChanged() - } - } } } } diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt new file mode 100644 index 0000000..47717d9 --- /dev/null +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/BuddyProfileListAdapter.kt @@ -0,0 +1,67 @@ +package com.nocapstone.buddyvet.buddy + +import android.view.LayoutInflater +import android.view.ViewGroup +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 + +class BuddyProfileListAdapter( + private val ColorChange: Boolean, + private val onClickBuddyListener: (Int) -> Unit +) : + ListAdapter(BuddyProfileListDiffCallback()) { + + var prePosition = -1 + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return BuddyListViewHolder( + ItemBuddyProfileBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is BuddyListViewHolder) { + val buddyData = getItem(position) + holder.bind(buddyData, position) + } + } + + inner class BuddyListViewHolder(private val binding: ItemBuddyProfileBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(data: BuddyData, position: Int) { + + binding.apply { + buddyData = data + } + + itemView.setOnClickListener { + onClickBuddyListener(position) + if (ColorChange) { + if (prePosition >= 0) { + getItem(prePosition).isSelect = false + } + getItem(position).isSelect = true + prePosition = position + notifyDataSetChanged() + } + } + } + } +} + +private class BuddyProfileListDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { + return oldItem === newItem + } + + override fun areContentsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean { + return oldItem == newItem + } +} \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/data/BuddyService.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/data/BuddyService.kt index f49a346..98a3465 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/data/BuddyService.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/data/BuddyService.kt @@ -40,4 +40,9 @@ interface BuddyService { @Part image: MultipartBody.Part ): CommonResponse + @GET("users") + suspend fun readMasterInfo( + @Header("Authorization") token: String, + ): CommonResponse + } \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/MasterInfoResponse.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/MasterInfoResponse.kt new file mode 100644 index 0000000..65628ac --- /dev/null +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/domain/entity/MasterInfoResponse.kt @@ -0,0 +1,7 @@ +package com.nocapstone.buddyvet.buddy.domain.entity + +data class MasterInfoResponse( + val userId : Int, + val nickname : String, + val profile : 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 ff5b350..e3ce7dd 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 @@ -3,6 +3,8 @@ 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.BuddyRequest +import com.nocapstone.buddyvet.buddy.domain.entity.MasterInfoResponse +import com.nocapstone.common.data.dto.CommonResponse import okhttp3.MultipartBody import javax.inject.Inject @@ -30,4 +32,8 @@ class BuddyUseCase @Inject constructor( buddyService.uploadBuddyImg(token, buddyId, image) } + suspend fun readMasterInfo(token: String): MasterInfoResponse { + return buddyService.readMasterInfo(token).data + } + } \ No newline at end of file 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 aa2302e..b0572ea 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 @@ -8,6 +8,7 @@ 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.usecase.BuddyUseCase import com.nocapstone.common.domain.usecase.DataStoreUseCase import dagger.hilt.android.lifecycle.HiltViewModel @@ -42,6 +43,9 @@ class BuddyViewModel @Inject constructor( private val _selectBuddy = MutableStateFlow(null) val selectBuddy: StateFlow = _selectBuddy + private val _masterInfo = MutableStateFlow(null) + val masterInfo: StateFlow = _masterInfo + fun setSelectCheckBuddy(position: Int) { _selectBuddy.value = position } @@ -84,7 +88,7 @@ class BuddyViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { try { val token = dataStoreUseCase.bearerJsonWebToken.first() - if (token != null){ + if (token != null) { _buddyList.value = buddyUseCase.readBuddyList(token) } } catch (e: Exception) { @@ -145,5 +149,18 @@ class BuddyViewModel @Inject constructor( } } + fun readMasterProfile() { + viewModelScope.launch(Dispatchers.IO) { + val token = dataStoreUseCase.bearerJsonWebToken.first() + if (token != null) { + try { + _masterInfo.value = buddyUseCase.readMasterInfo(token) + } catch (e: Exception) { + + } + } + } + } + } \ No newline at end of file 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 0c4ac0c..009059b 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 @@ -44,4 +44,9 @@ class CompleteRegistrationFragment : Fragment() { } } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } \ No newline at end of file diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyTypeFragment.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyTypeFragment.kt index 9818e5b..2e7b6fd 100644 --- a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyTypeFragment.kt +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/InputBuddyTypeFragment.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.nocapstone.buddyvet.buddy.R import com.nocapstone.buddyvet.buddy.databinding.FragmentInputBuddyTypeBinding +import com.nocapstone.common_ui.MainActivityUtil import dagger.hilt.android.AndroidEntryPoint @@ -25,7 +26,14 @@ class InputBuddyTypeFragment : Fragment() { ): View? { // Inflate the layout for this fragment _binding = FragmentInputBuddyTypeBinding.inflate(inflater, container, false) + + (activity as MainActivityUtil).run { + setToolbarTitle("버디 추가") + setVisibilityBottomAppbar(View.GONE) + } + return binding.root + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/MyBuddyFragment.kt b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/MyBuddyFragment.kt new file mode 100644 index 0000000..ebe58af --- /dev/null +++ b/buddy/src/main/java/com/nocapstone/buddyvet/buddy/ui/MyBuddyFragment.kt @@ -0,0 +1,81 @@ +package com.nocapstone.buddyvet.buddy.ui + +import android.os.Bundle +import android.view.* +import androidx.fragment.app.Fragment +import android.widget.ListAdapter +import androidx.core.view.MenuHost +import androidx.core.view.MenuProvider +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.navigation.fragment.findNavController +import com.nocapstone.buddyvet.buddy.BuddyListAdapter +import com.nocapstone.buddyvet.buddy.R +import com.nocapstone.buddyvet.buddy.databinding.FragmentMyBuddyBinding +import com.nocapstone.common_ui.MainActivityUtil +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MyBuddyFragment : Fragment() { + + private var _binding: FragmentMyBuddyBinding? = null + private val binding get() = _binding!! + private val buddyViewModel: BuddyViewModel by viewModels({ requireActivity() }) + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + _binding = FragmentMyBuddyBinding.inflate(inflater, container, false) + + (activity as MainActivityUtil).run { + setToolbarTitle("My Buddy") + } + + return binding.root + } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + buddyViewModel.readMasterProfile() + buddyViewModel.readBuddyList() + initMenu() + binding.apply { + lifecycleOwner = viewLifecycleOwner + viewModel = buddyViewModel + adapter = BuddyListAdapter() + } + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + private fun initMenu() { + val menuHost: MenuHost = requireActivity() + + menuHost.addMenuProvider(object : MenuProvider { + + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.my_buddy_menu, menu) + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + when (menuItem.itemId) { + android.R.id.home -> { + findNavController().popBackStack() + } + R.id.add_buddy -> { + findNavController().navigate(R.id.next) + } + } + return true + } + }, viewLifecycleOwner, Lifecycle.State.RESUMED) + } + +} \ No newline at end of file diff --git a/buddy/src/main/res/drawable/img_add_buddy.xml b/buddy/src/main/res/drawable/img_add_buddy.xml new file mode 100644 index 0000000..94336ab --- /dev/null +++ b/buddy/src/main/res/drawable/img_add_buddy.xml @@ -0,0 +1,5 @@ + + + diff --git a/buddy/src/main/res/drawable/img_right_arrow.xml b/buddy/src/main/res/drawable/img_right_arrow.xml new file mode 100644 index 0000000..29a2b4d --- /dev/null +++ b/buddy/src/main/res/drawable/img_right_arrow.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/buddy/src/main/res/layout/fragment_my_buddy.xml b/buddy/src/main/res/layout/fragment_my_buddy.xml new file mode 100644 index 0000000..57670ff --- /dev/null +++ b/buddy/src/main/res/layout/fragment_my_buddy.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buddy/src/main/res/layout/item_buddy_detail.xml b/buddy/src/main/res/layout/item_buddy_detail.xml new file mode 100644 index 0000000..911c80b --- /dev/null +++ b/buddy/src/main/res/layout/item_buddy_detail.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buddy/src/main/res/menu/my_buddy_menu.xml b/buddy/src/main/res/menu/my_buddy_menu.xml new file mode 100644 index 0000000..0305351 --- /dev/null +++ b/buddy/src/main/res/menu/my_buddy_menu.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/buddy/src/main/res/navigation/nav_buddy.xml b/buddy/src/main/res/navigation/nav_buddy.xml index fdc1354..2d89439 100644 --- a/buddy/src/main/res/navigation/nav_buddy.xml +++ b/buddy/src/main/res/navigation/nav_buddy.xml @@ -2,7 +2,7 @@ + app:startDestination="@id/myBuddyFragment"> + + + \ No newline at end of file diff --git a/buddy/src/main/res/values/strings.xml b/buddy/src/main/res/values/strings.xml new file mode 100644 index 0000000..6048840 --- /dev/null +++ b/buddy/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Hello blank fragment + \ No newline at end of file diff --git a/common-ui/src/main/res/drawable/img_add.xml b/common-ui/src/main/res/drawable/img_add.xml new file mode 100644 index 0000000..d99aee6 --- /dev/null +++ b/common-ui/src/main/res/drawable/img_add.xml @@ -0,0 +1,5 @@ + + + diff --git a/common-ui/src/main/res/drawable/img_manage.xml b/common-ui/src/main/res/drawable/img_manage.xml new file mode 100644 index 0000000..f524947 --- /dev/null +++ b/common-ui/src/main/res/drawable/img_manage.xml @@ -0,0 +1,5 @@ + + + diff --git a/common-ui/src/main/res/drawable/img_more.xml b/common-ui/src/main/res/drawable/img_more.xml new file mode 100644 index 0000000..c45470d --- /dev/null +++ b/common-ui/src/main/res/drawable/img_more.xml @@ -0,0 +1,5 @@ + + + diff --git a/common-ui/src/main/res/drawable/img_setting.xml b/common-ui/src/main/res/drawable/img_setting.xml new file mode 100644 index 0000000..e057be4 --- /dev/null +++ b/common-ui/src/main/res/drawable/img_setting.xml @@ -0,0 +1,5 @@ + + + diff --git a/home/src/main/java/com/nocapstone/home/ui/DialogForSelectBuddy.kt b/home/src/main/java/com/nocapstone/home/ui/DialogForSelectBuddy.kt index f33ae71..3917d7c 100644 --- a/home/src/main/java/com/nocapstone/home/ui/DialogForSelectBuddy.kt +++ b/home/src/main/java/com/nocapstone/home/ui/DialogForSelectBuddy.kt @@ -5,9 +5,7 @@ import android.content.Context import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle -import android.util.Log -import com.nocapstone.buddyvet.buddy.BuddyListAdapter -import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData +import com.nocapstone.buddyvet.buddy.BuddyProfileListAdapter import com.nocapstone.buddyvet.buddy.ui.BuddyViewModel import com.nocapstone.home.databinding.DialogForSelectBuddyBinding @@ -31,7 +29,7 @@ class DialogForSelectBuddy constructor( binding.apply { viewModel = buddyViewModel - adapter = BuddyListAdapter(true) { nowSelectPosition -> + adapter = BuddyProfileListAdapter(true) { nowSelectPosition -> buddyViewModel.setSelectCheckBuddy(nowSelectPosition) } } diff --git a/home/src/main/java/com/nocapstone/home/ui/HomeFragment.kt b/home/src/main/java/com/nocapstone/home/ui/HomeFragment.kt index f9f4629..3dac574 100644 --- a/home/src/main/java/com/nocapstone/home/ui/HomeFragment.kt +++ b/home/src/main/java/com/nocapstone/home/ui/HomeFragment.kt @@ -1,15 +1,13 @@ package com.nocapstone.home.ui import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import com.nocapstone.buddyvet.buddy.BuddyListAdapter -import com.nocapstone.buddyvet.buddy.domain.entity.BuddyData +import com.nocapstone.buddyvet.buddy.BuddyProfileListAdapter import com.nocapstone.buddyvet.buddy.ui.BuddyViewModel import com.nocapstone.common_ui.MainActivityUtil import com.nocapstone.eye_check.ui.EyeCheckViewModel @@ -34,10 +32,13 @@ class HomeFragment : Fragment() { binding.apply { lifecycleOwner = viewLifecycleOwner - adapter = BuddyListAdapter(false) { + adapter = BuddyProfileListAdapter(false) { buddyViewModel.setSelectCheckBuddy(it) } viewModel = buddyViewModel + buddySetting.setOnClickListener { + findNavController().navigate(R.id.toBuddy) + } } (activity as MainActivityUtil).run { @@ -52,6 +53,29 @@ class HomeFragment : Fragment() { buddyViewModel.readBuddyList() } +// private fun showMenu(v: View, @MenuRes menuRes: Int) { +// val popup = PopupMenu(requireContext(), v) +// popup.menuInflater.inflate(menuRes, popup.menu) +// +// popup.setOnMenuItemClickListener { menuItem: MenuItem -> +// when(menuItem.itemId){ +// R.id.add_buddy -> { +// findNavController().navigate() +// } +// R.id.manage_buddy -> { +// findNavController().navigate() +// } +// } +// true +// } +// popup.setOnDismissListener { +// // Respond to popup being dismissed. +// } +// // Show the popup menu. +// popup.show() +// } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.eyeCheckBtn.setOnClickListener { @@ -61,7 +85,7 @@ class HomeFragment : Fragment() { .errorListener { } .start { uri -> eyeViewModel.setImage(uri) - findNavController().navigate(R.id.next) + findNavController().navigate(R.id.toEyeCheck) } } .build().show() diff --git a/home/src/main/res/layout/dialog_for_select_buddy.xml b/home/src/main/res/layout/dialog_for_select_buddy.xml index 4987543..7f1ee2d 100644 --- a/home/src/main/res/layout/dialog_for_select_buddy.xml +++ b/home/src/main/res/layout/dialog_for_select_buddy.xml @@ -13,7 +13,7 @@ + type="com.nocapstone.buddyvet.buddy.BuddyProfileListAdapter" /> diff --git a/home/src/main/res/layout/fragment_home.xml b/home/src/main/res/layout/fragment_home.xml index 5326c1c..d0235a3 100644 --- a/home/src/main/res/layout/fragment_home.xml +++ b/home/src/main/res/layout/fragment_home.xml @@ -12,7 +12,7 @@ + type="com.nocapstone.buddyvet.buddy.BuddyProfileListAdapter" /> @@ -35,6 +35,15 @@ android:layout_height="wrap_content" android:padding="16dp"> + + + + + + \ No newline at end of file diff --git a/home/src/main/res/navigation/nav_home.xml b/home/src/main/res/navigation/nav_home.xml index 32b7898..d8cc3ec 100644 --- a/home/src/main/res/navigation/nav_home.xml +++ b/home/src/main/res/navigation/nav_home.xml @@ -10,12 +10,16 @@ android:label="HomeFragment"> + + \ No newline at end of file