Skip to content

Commit

Permalink
[BUD-50] feat : Buddy 관리 화면 구현(#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
KDW03 committed Apr 9, 2023
1 parent e22701c commit 88df992
Show file tree
Hide file tree
Showing 26 changed files with 468 additions and 38 deletions.
Original file line number Diff line number Diff line change
@@ -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<BuddyData, RecyclerView.ViewHolder>(BuddyListDiffCallback()) {

var prePosition = -1

) : ListAdapter<BuddyData, RecyclerView.ViewHolder>(BuddyListDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return BuddyListViewHolder(
ItemBuddyProfileBinding.inflate(
ItemBuddyDetailBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
Expand All @@ -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()
}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<BuddyData, RecyclerView.ViewHolder>(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<BuddyData>() {
override fun areItemsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean {
return oldItem === newItem
}

override fun areContentsTheSame(oldItem: BuddyData, newItem: BuddyData): Boolean {
return oldItem == newItem
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,9 @@ interface BuddyService {
@Part image: MultipartBody.Part
): CommonResponse<String?>

@GET("users")
suspend fun readMasterInfo(
@Header("Authorization") token: String,
): CommonResponse<MasterInfoResponse>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.nocapstone.buddyvet.buddy.domain.entity

data class MasterInfoResponse(
val userId : Int,
val nickname : String,
val profile : String
)
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -30,4 +32,8 @@ class BuddyUseCase @Inject constructor(
buddyService.uploadBuddyImg(token, buddyId, image)
}

suspend fun readMasterInfo(token: String): MasterInfoResponse {
return buddyService.readMasterInfo(token).data
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -42,6 +43,9 @@ class BuddyViewModel @Inject constructor(
private val _selectBuddy = MutableStateFlow<Int?>(null)
val selectBuddy: StateFlow<Int?> = _selectBuddy

private val _masterInfo = MutableStateFlow<MasterInfoResponse?>(null)
val masterInfo: StateFlow<MasterInfoResponse?> = _masterInfo

fun setSelectCheckBuddy(position: Int) {
_selectBuddy.value = position
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {

}
}
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,9 @@ class CompleteRegistrationFragment : Fragment() {
}

}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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?) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}

}
5 changes: 5 additions & 0 deletions buddy/src/main/res/drawable/img_add_buddy.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#DCAE89"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>
13 changes: 13 additions & 0 deletions buddy/src/main/res/drawable/img_right_arrow.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="15dp"
android:viewportWidth="14"
android:viewportHeight="15">
<group>
<clip-path
android:pathData="M0,0.5h14v14h-14z"/>
<path
android:pathData="M3.786,12.243L4.818,13.275L10.593,7.5L4.818,1.725L3.786,2.757L8.528,7.5L3.786,12.243Z"
android:fillColor="#000000"/>
</group>
</vector>
Loading

0 comments on commit 88df992

Please sign in to comment.