From ff387a9291c4d035cdae4dc75ea896ce476f2569 Mon Sep 17 00:00:00 2001 From: sujin-kk Date: Sun, 19 Jun 2022 20:25:39 +0900 Subject: [PATCH 01/15] =?UTF-8?q?=EC=A7=91=EC=95=88=EC=9D=BC=20=EB=8B=B4?= =?UTF-8?q?=EB=8B=B9=EC=9E=90=20rv=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/fragment_add_house_work.xml | 45 +++++++++++++++++-- app/src/main/res/layout/item_add_assignee.xml | 43 ++++++++++++++++++ app/src/main/res/values/strings.xml | 7 +++ 3 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/layout/item_add_assignee.xml diff --git a/app/src/main/res/layout/fragment_add_house_work.xml b/app/src/main/res/layout/fragment_add_house_work.xml index 39f45657..c0cb0706 100644 --- a/app/src/main/res/layout/fragment_add_house_work.xml +++ b/app/src/main/res/layout/fragment_add_house_work.xml @@ -101,7 +101,45 @@ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintTop_toBottomOf="@id/add_house_work_date_tv" tools:listitem="@layout/item_recycler_add_todo_list" /> - + + + + + + + + app:layout_constraintTop_toBottomOf="@id/add_house_work_assignee_rv" /> + + + + + + + + + + + + + + + + + \ 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 f0c91ad4..5ff5932e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,13 @@ 수정 완료 기타 공간 + + 집안일 담당자 + 집안일 담당자 선택 + 취소 + 확인 + + 취소 From 20e8e946f7eb00849591b01a3ab06ce8d04ef1f5 Mon Sep 17 00:00:00 2001 From: sujin-kk Date: Sun, 19 Jun 2022 21:37:36 +0900 Subject: [PATCH 02/15] create bottom sheet dialog --- .../dialog/AssigneeBottomSheetDialog.kt | 21 ++++++ .../bg_assignee_bottom_sheet_dialog.xml | 8 +++ .../bottom_sheet_item_assignee_selector.xml | 8 +++ .../bottom_sheet_item_check_selector.xml | 8 +++ .../res/drawable/ic_circle_check_active.xml | 16 +++++ .../res/drawable/ic_circle_check_inactive.xml | 11 +++ .../fragment_assignee_bottom_sheet_dialog.xml | 69 +++++++++++++++++++ .../res/layout/item_bottom_sheet_assignee.xml | 44 ++++++++++++ app/src/main/res/values/strings.xml | 7 +- 9 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt create mode 100644 app/src/main/res/drawable/bg_assignee_bottom_sheet_dialog.xml create mode 100644 app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml create mode 100644 app/src/main/res/drawable/bottom_sheet_item_check_selector.xml create mode 100644 app/src/main/res/drawable/ic_circle_check_active.xml create mode 100644 app/src/main/res/drawable/ic_circle_check_inactive.xml create mode 100644 app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml create mode 100644 app/src/main/res/layout/item_bottom_sheet_assignee.xml diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt b/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt new file mode 100644 index 00000000..e49022df --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt @@ -0,0 +1,21 @@ +package com.depromeet.housekeeper.ui.custom.dialog + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.depromeet.housekeeper.R +import com.google.android.material.bottomsheet.BottomSheetDialogFragment + +class AssigneeBottomSheetDialog : BottomSheetDialogFragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_assignee_bottom_sheet_dialog, container, false) + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_assignee_bottom_sheet_dialog.xml b/app/src/main/res/drawable/bg_assignee_bottom_sheet_dialog.xml new file mode 100644 index 00000000..112b86ce --- /dev/null +++ b/app/src/main/res/drawable/bg_assignee_bottom_sheet_dialog.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml b/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml new file mode 100644 index 00000000..9bac0dde --- /dev/null +++ b/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_sheet_item_check_selector.xml b/app/src/main/res/drawable/bottom_sheet_item_check_selector.xml new file mode 100644 index 00000000..2a39e9aa --- /dev/null +++ b/app/src/main/res/drawable/bottom_sheet_item_check_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_circle_check_active.xml b/app/src/main/res/drawable/ic_circle_check_active.xml new file mode 100644 index 00000000..6f6a83f7 --- /dev/null +++ b/app/src/main/res/drawable/ic_circle_check_active.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_circle_check_inactive.xml b/app/src/main/res/drawable/ic_circle_check_inactive.xml new file mode 100644 index 00000000..ba3b9ce9 --- /dev/null +++ b/app/src/main/res/drawable/ic_circle_check_inactive.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml b/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml new file mode 100644 index 00000000..10da506a --- /dev/null +++ b/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_bottom_sheet_assignee.xml b/app/src/main/res/layout/item_bottom_sheet_assignee.xml new file mode 100644 index 00000000..2b850de3 --- /dev/null +++ b/app/src/main/res/layout/item_bottom_sheet_assignee.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ff5932e..e13edb87 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,10 +26,9 @@ 집안일 담당자 - 집안일 담당자 선택 - 취소 - 확인 - + 집안일 담당자 선택 + 취소 + 확인 From e9cb12acedc5d1924c0724bf74684b0b8baf291d Mon Sep 17 00:00:00 2001 From: sujin-kk Date: Sun, 19 Jun 2022 22:16:19 +0900 Subject: [PATCH 03/15] =?UTF-8?q?=EC=A7=91=EC=95=88=EC=9D=BC=20=EB=8B=B4?= =?UTF-8?q?=EB=8B=B9=EC=9E=90=20rv=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housekeeper/adapter/AddAssigneeAdapter.kt | 36 +++++++++ .../depromeet/housekeeper/model/Assignee.kt | 1 + .../com/depromeet/housekeeper/model/Chore.kt | 2 +- ...orkFramgent.kt => AddHouseWorkFragment.kt} | 76 +++++++++++-------- .../housekeeper/ui/AddHouseWorkViewModel.kt | 15 ++++ .../housekeeper/ui/SelectSpaceFragment.kt | 2 +- .../res/layout/fragment_add_house_work.xml | 2 +- app/src/main/res/navigation/nav_graph.xml | 12 +-- 8 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/depromeet/housekeeper/adapter/AddAssigneeAdapter.kt rename app/src/main/java/com/depromeet/housekeeper/ui/{AddHouseWorkFramgent.kt => AddHouseWorkFragment.kt} (72%) diff --git a/app/src/main/java/com/depromeet/housekeeper/adapter/AddAssigneeAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/adapter/AddAssigneeAdapter.kt new file mode 100644 index 00000000..b6311c86 --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/adapter/AddAssigneeAdapter.kt @@ -0,0 +1,36 @@ +package com.depromeet.housekeeper.adapter + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.depromeet.housekeeper.databinding.ItemAddAssigneeBinding +import com.depromeet.housekeeper.model.Assignee +import com.depromeet.housekeeper.util.BindingAdapter + +class AddAssigneeAdapter(private val assignees: ArrayList) + : RecyclerView.Adapter() { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding: ItemAddAssigneeBinding = ItemAddAssigneeBinding.inflate( + LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + + @SuppressLint("NotifyDataSetChanged") + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(assignees[position]) + } + + override fun getItemCount(): Int = assignees.size + + inner class ViewHolder(val binding: ItemAddAssigneeBinding) + : RecyclerView.ViewHolder(binding.root){ + @SuppressLint("NotifyDataSetChanged") + fun bind(assignee: Assignee) { + binding.itemAddAssigneeNameTv.text = assignee.memberName +// BindingAdapter.loadImage(binding.itemAddAssigneeProfileIv, assignee.profilePath) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/model/Assignee.kt b/app/src/main/java/com/depromeet/housekeeper/model/Assignee.kt index 2667f9b5..efa6c75f 100644 --- a/app/src/main/java/com/depromeet/housekeeper/model/Assignee.kt +++ b/app/src/main/java/com/depromeet/housekeeper/model/Assignee.kt @@ -7,5 +7,6 @@ import kotlinx.parcelize.Parcelize data class Assignee( val memberId: Int, val memberName: String, + val profilePath: String, ): Parcelable diff --git a/app/src/main/java/com/depromeet/housekeeper/model/Chore.kt b/app/src/main/java/com/depromeet/housekeeper/model/Chore.kt index cd7c793c..e4cee2e2 100644 --- a/app/src/main/java/com/depromeet/housekeeper/model/Chore.kt +++ b/app/src/main/java/com/depromeet/housekeeper/model/Chore.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable @Serializable data class Chore( - var assignees: List = listOf(0), + var assignees: List = listOf(), var houseWorkName: String = "", var scheduledDate: String = "yyyy-MM-dd", var scheduledTime: String? = null, diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFramgent.kt b/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt similarity index 72% rename from app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFramgent.kt rename to app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt index 7d052196..a453563b 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFramgent.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt @@ -14,6 +14,7 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.depromeet.housekeeper.R +import com.depromeet.housekeeper.adapter.AddAssigneeAdapter import com.depromeet.housekeeper.adapter.AddHouseWorkChoreAdapter import com.depromeet.housekeeper.adapter.DayRepeatAdapter import com.depromeet.housekeeper.databinding.FragmentAddHouseWorkBinding @@ -21,12 +22,13 @@ import kotlinx.coroutines.flow.collect import timber.log.Timber import java.util.* -class AddHouseWorkFramgent : Fragment() { +class AddHouseWorkFragment : Fragment() { lateinit var binding: FragmentAddHouseWorkBinding lateinit var dayRepeatAdapter: DayRepeatAdapter lateinit var addHouseWorkChoreAdapter: AddHouseWorkChoreAdapter - private val addTodo2ViewModel: AddHouseWorkViewModel by viewModels() - private val navArgs by navArgs() + lateinit var addAssigneeAdapter: AddAssigneeAdapter + private val viewModel: AddHouseWorkViewModel by viewModels() + private val navArgs by navArgs() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -35,9 +37,9 @@ class AddHouseWorkFramgent : Fragment() { // Inflate the layout for this fragment binding = DataBindingUtil.inflate(inflater, R.layout.fragment_add_house_work, container, false) binding.lifecycleOwner = this.viewLifecycleOwner - binding.vm = addTodo2ViewModel - addTodo2ViewModel.addCalendarView(navArgs.selectDate.date) - binding.currentDate = addTodo2ViewModel.bindingDate() + binding.vm = viewModel + viewModel.addCalendarView(navArgs.selectDate.date) + binding.currentDate = viewModel.bindingDate() return binding.root } @@ -51,28 +53,28 @@ class AddHouseWorkFramgent : Fragment() { private fun bindingVm() { val choreNames = navArgs.spaceChores.houseWorks val space = navArgs.spaceChores.spaceName - addTodo2ViewModel.updateSpace(space) - addTodo2ViewModel.setDate(navArgs.selectDate.date) - addTodo2ViewModel.initChores(addTodo2ViewModel.getSpace(), choreNames) - Timber.d(addTodo2ViewModel.getChores().toString()) + viewModel.updateSpace(space) + viewModel.setDate(navArgs.selectDate.date) + viewModel.initChores(viewModel.getSpace(), choreNames) + Timber.d(viewModel.getChores().toString()) lifecycleScope.launchWhenStarted { - addTodo2ViewModel.selectCalendar.collect { - binding.addHouseWorkDateTv.text = addTodo2ViewModel.bindingDate() + viewModel.selectCalendar.collect { + binding.addHouseWorkDateTv.text = viewModel.bindingDate() } } lifecycleScope.launchWhenCreated { - addTodo2ViewModel.networkError.collect { + viewModel.networkError.collect { binding.isConnectedNetwork = it } } lifecycleScope.launchWhenCreated { - addTodo2ViewModel.houseWorkCreateResponse.collect { + viewModel.houseWorkCreateResponse.collect { if (it?.any { it.success } == false) { // 화면 전환 - findNavController().navigate(R.id.action_addHouseWorkFramgent_to_mainFragment) + findNavController().navigate(R.id.action_addHouseWorkFragment_to_mainFragment) } } } @@ -94,30 +96,38 @@ class AddHouseWorkFramgent : Fragment() { setOnClickListener { // 마지막 position update - updateChore(addTodo2ViewModel.getPosition(PositionType.CUR)) - addTodo2ViewModel.updateChoreDate() + updateChore(viewModel.getPosition(PositionType.CUR)) + viewModel.updateChoreDate() // 집안일 생성 api - addTodo2ViewModel.createHouseWorks() + viewModel.createHouseWorks() } } binding.todoTimePicker.setOnTimeChangedListener { _, _, _ -> binding.addHouseWorkAllDayCheckBox.isChecked = false val time = binding.todoTimePicker.getDisPlayedTime() - addTodo2ViewModel.updateTime(time.first, time.second) + viewModel.updateTime(time.first, time.second) } binding.addHouseWorkAllDayCheckBox.apply { setOnClickListener { val time = binding.todoTimePicker.getDisPlayedTime() - addTodo2ViewModel.updateTime(time.first, time.second) + viewModel.updateTime(time.first, time.second) } } binding.addHouseWorkDateTv.setOnClickListener { createDatePickerDialog() } + + binding.addAssigneeBtn.setOnClickListener{ + createBottomSheet() + } + } + + private fun createBottomSheet() { + } private fun createDatePickerDialog() { @@ -132,7 +142,7 @@ class AddHouseWorkFramgent : Fragment() { val datePickerDialog = DatePickerDialog( this.requireContext(), { _, year, month, dayOfMonth -> - addTodo2ViewModel.updateCalendarView(year, month, dayOfMonth) + viewModel.updateCalendarView(year, month, dayOfMonth) }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) - 1, @@ -144,15 +154,15 @@ class AddHouseWorkFramgent : Fragment() { private fun setAdapter() { // chore list rv adapter - addHouseWorkChoreAdapter = AddHouseWorkChoreAdapter(addTodo2ViewModel.getChores()) + addHouseWorkChoreAdapter = AddHouseWorkChoreAdapter(viewModel.getChores()) binding.addHouseWorkChoreListRv.adapter = addHouseWorkChoreAdapter addHouseWorkChoreAdapter.setMyItemClickListener(object : AddHouseWorkChoreAdapter.MyItemClickListener { override fun onItemClick(position: Int) { // 현재 chore 클릭하면 이전 chore 정보 업데이트 - addTodo2ViewModel.updatePositions(position) - val prePos = addTodo2ViewModel.getPosition(PositionType.PRE) + viewModel.updatePositions(position) + val prePos = viewModel.getPosition(PositionType.PRE) updateChore(prePos) // 현재 chore 기준으로 뷰 업데이트 @@ -166,14 +176,18 @@ class AddHouseWorkFramgent : Fragment() { // 현재 select 된 pos 정보 -> select 되지 않아도 remove 가능하기 때문 val selectedPos = addHouseWorkChoreAdapter.selectedChore.indexOf(1) - if (addTodo2ViewModel.getPosition(PositionType.CUR) != selectedPos) { - addTodo2ViewModel.updatePositions(selectedPos) + if (viewModel.getPosition(PositionType.CUR) != selectedPos) { + viewModel.updatePositions(selectedPos) } - updateView(addTodo2ViewModel.getPosition(PositionType.CUR)) + updateView(viewModel.getPosition(PositionType.CUR)) } }) + // 집안일 담당자 rv adapter + addAssigneeAdapter = AddAssigneeAdapter(viewModel.assignees.value) + binding.addHouseWorkChoreListRv.adapter = addHouseWorkChoreAdapter + // 요일 반복 rv adapter val days: Array = resources.getStringArray(R.array.day_array) dayRepeatAdapter = DayRepeatAdapter(days) @@ -183,17 +197,17 @@ class AddHouseWorkFramgent : Fragment() { private fun updateChore(position: Int) { when { - binding.addHouseWorkAllDayCheckBox.isChecked -> addTodo2ViewModel.updateChore( + binding.addHouseWorkAllDayCheckBox.isChecked -> viewModel.updateChore( null, position ) - else -> addTodo2ViewModel.updateChore(addTodo2ViewModel.curTime.value, position) + else -> viewModel.updateChore(viewModel.curTime.value, position) } - Timber.d(addTodo2ViewModel.chores.value.toString()) + Timber.d(viewModel.chores.value.toString()) } private fun updateView(position: Int) { - val chore = addTodo2ViewModel.getChore(position) + val chore = viewModel.getChore(position) if (chore.scheduledTime == null) { binding.todoTimePicker.initDisPlayedValue() binding.addHouseWorkAllDayCheckBox.isChecked = true diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkViewModel.kt index fc07f654..07fd9106 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkViewModel.kt @@ -2,6 +2,7 @@ package com.depromeet.housekeeper.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.depromeet.housekeeper.model.Assignee import com.depromeet.housekeeper.model.Chore import com.depromeet.housekeeper.model.Chores import com.depromeet.housekeeper.model.HouseWork @@ -15,6 +16,7 @@ import kotlinx.coroutines.launch import timber.log.Timber import java.text.SimpleDateFormat import java.util.* +import kotlin.collections.ArrayList class AddHouseWorkViewModel: ViewModel(){ private val _curDate: MutableStateFlow = @@ -45,6 +47,16 @@ class AddHouseWorkViewModel: ViewModel(){ return _curSpace.value } + // TODO : Assignee의 List vs memberId의 List + private val _curAssignees: MutableStateFlow> = + MutableStateFlow(arrayListOf()) + val assignees: StateFlow> + get() = _curAssignees + + fun setCurAssignees(assignees: ArrayList) { + _curAssignees.value = assignees + } + private val _curTime: MutableStateFlow = MutableStateFlow(null) val curTime: StateFlow @@ -75,6 +87,7 @@ class AddHouseWorkViewModel: ViewModel(){ val chores: StateFlow> get() = _chores + // TODO: assignee 추가 fun initChores(space:String, choreName: List) { val temp = arrayListOf() choreName.map{ name -> @@ -87,6 +100,7 @@ class AddHouseWorkViewModel: ViewModel(){ _chores.value.addAll(temp) } + // TODO: assignee 추가 fun updateChore(time: String?, position: Int) { _chores.value[position].scheduledTime = time } @@ -113,6 +127,7 @@ class AddHouseWorkViewModel: ViewModel(){ val houseWorkCreateResponse: StateFlow?> get() = _houseWorkCreateResponse + // TODO: assignee 추가 fun createHouseWorks() { viewModelScope.launch { Repository.createHouseWorks(Chores(_chores.value)) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/SelectSpaceFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/SelectSpaceFragment.kt index 65dc9812..f364fda8 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/SelectSpaceFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/SelectSpaceFragment.kt @@ -165,7 +165,7 @@ class SelectSpaceFragment : Fragment(), View.OnClickListener { } private fun navigateToAddTodoPage2() { - findNavController().navigate(SelectSpaceFragmentDirections.actionSelectSpaceFragmentToAddHouseWorkFramgent( + findNavController().navigate(SelectSpaceFragmentDirections.actionSelectSpaceFragmentToAddHouseWorkFragment( SpaceChores( spaceName = viewModel.selectSpace.value, houseWorks = viewModel.chores.value, diff --git a/app/src/main/res/layout/fragment_add_house_work.xml b/app/src/main/res/layout/fragment_add_house_work.xml index c0cb0706..2683ef3f 100644 --- a/app/src/main/res/layout/fragment_add_house_work.xml +++ b/app/src/main/res/layout/fragment_add_house_work.xml @@ -26,7 +26,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/main_white_background" - tools:context=".ui.AddHouseWorkFramgent"> + tools:context=".ui.AddHouseWorkFragment"> Date: Sun, 19 Jun 2022 23:27:20 +0900 Subject: [PATCH 04/15] =?UTF-8?q?=EB=B0=94=ED=85=80=20=EC=8B=9C=ED=8A=B8?= =?UTF-8?q?=20=EB=8F=99=EC=9E=91=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/BottomSheetAssigneeAdapter.kt | 57 +++++++++++++++++++ .../housekeeper/ui/AddHouseWorkFragment.kt | 4 +- .../dialog/AssigneeBottomSheetDialog.kt | 37 +++++++++++- .../bottom_sheet_item_assignee_selector.xml | 4 +- .../fragment_assignee_bottom_sheet_dialog.xml | 3 +- app/src/main/res/values/themes.xml | 9 +++ 6 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/depromeet/housekeeper/adapter/BottomSheetAssigneeAdapter.kt diff --git a/app/src/main/java/com/depromeet/housekeeper/adapter/BottomSheetAssigneeAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/adapter/BottomSheetAssigneeAdapter.kt new file mode 100644 index 00000000..aa3cc20b --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/adapter/BottomSheetAssigneeAdapter.kt @@ -0,0 +1,57 @@ +package com.depromeet.housekeeper.adapter + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.depromeet.housekeeper.databinding.ItemBottomSheetAssigneeBinding +import com.depromeet.housekeeper.model.Assignee +import com.depromeet.housekeeper.util.BindingAdapter + +class BottomSheetAssigneeAdapter(private val assignees: ArrayList) + : RecyclerView.Adapter() { + + private lateinit var mItemClickListener: MyItemClickListener + var selectedAssignee: ArrayList = arrayListOf() // for multiple choice + + interface MyItemClickListener { + fun onItemClick(position: Int) + } + + fun setMyItemClickListener(itemClickListener: MyItemClickListener){ + mItemClickListener = itemClickListener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding: ItemBottomSheetAssigneeBinding = ItemBottomSheetAssigneeBinding.inflate( + LayoutInflater.from(parent.context), parent, false) + + binding.itemBottomSheetAssigneeCl.isSelected = false + return ViewHolder(binding) + } + + @SuppressLint("NotifyDataSetChanged") + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(assignees[position]) + + holder.binding.itemBottomSheetAssigneeCl.apply { + setOnClickListener { + // mItemClickListener.onItemClick(position) + isSelected = !isSelected + } + } + } + + override fun getItemCount(): Int = assignees.size + + inner class ViewHolder(val binding: ItemBottomSheetAssigneeBinding) + : RecyclerView.ViewHolder(binding.root){ + + @SuppressLint("NotifyDataSetChanged") + fun bind(assignee: Assignee) { + binding.itemBottomSheetAssigneeNameTv.text = assignee.memberName + binding.itemBottomSheetAssigneeCheckIv.isSelected = binding.itemBottomSheetAssigneeCl.isSelected + // BindingAdapter.loadImage(binding.itemBottomSheetAssigneeProfileIv, assignee.profilePath) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt index a453563b..fd56f928 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/AddHouseWorkFragment.kt @@ -18,6 +18,7 @@ import com.depromeet.housekeeper.adapter.AddAssigneeAdapter import com.depromeet.housekeeper.adapter.AddHouseWorkChoreAdapter import com.depromeet.housekeeper.adapter.DayRepeatAdapter import com.depromeet.housekeeper.databinding.FragmentAddHouseWorkBinding +import com.depromeet.housekeeper.ui.custom.dialog.AssigneeBottomSheetDialog import kotlinx.coroutines.flow.collect import timber.log.Timber import java.util.* @@ -127,7 +128,8 @@ class AddHouseWorkFragment : Fragment() { } private fun createBottomSheet() { - + val bottomSheet = AssigneeBottomSheetDialog(requireContext()) + bottomSheet.show(childFragmentManager, bottomSheet.tag) } private fun createDatePickerDialog() { diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt b/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt index e49022df..80ecafc1 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/custom/dialog/AssigneeBottomSheetDialog.kt @@ -1,21 +1,52 @@ package com.depromeet.housekeeper.ui.custom.dialog +import android.content.Context import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.databinding.DataBindingUtil import com.depromeet.housekeeper.R +import com.depromeet.housekeeper.adapter.BottomSheetAssigneeAdapter +import com.depromeet.housekeeper.databinding.FragmentAssigneeBottomSheetDialogBinding +import com.depromeet.housekeeper.model.Assignee import com.google.android.material.bottomsheet.BottomSheetDialogFragment -class AssigneeBottomSheetDialog : BottomSheetDialogFragment() { +class AssigneeBottomSheetDialog(context: Context) : BottomSheetDialogFragment() { + lateinit var binding: FragmentAssigneeBottomSheetDialogBinding + lateinit var bottomSheetAssigneeAdapter: BottomSheetAssigneeAdapter + + private val tempAssignees = arrayListOf(Assignee(1,"고가혜", "url"), Assignee(1,"고가혜", "url"), Assignee(1,"고가혜", "url")) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_assignee_bottom_sheet_dialog, container, false) + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_assignee_bottom_sheet_dialog, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setAdapter() + initClickListener() + } + + private fun setAdapter() { + bottomSheetAssigneeAdapter = BottomSheetAssigneeAdapter(tempAssignees) + binding.bottomSheetAssigneeRv.adapter = bottomSheetAssigneeAdapter + } + + private fun initClickListener() { + binding.bottomSheetDlgCancelBtn.setOnClickListener { + dialog!!.dismiss() + } + + binding.bottomSheetDlgOkBtn.setOnClickListener { + // TODO : 선택 된 assignees 반환 + dialog!!.dismiss() + } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml b/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml index 9bac0dde..1ff9b4e3 100644 --- a/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml +++ b/app/src/main/res/drawable/bottom_sheet_item_assignee_selector.xml @@ -1,8 +1,8 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml b/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml index 10da506a..27e6b9b0 100644 --- a/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml +++ b/app/src/main/res/layout/fragment_assignee_bottom_sheet_dialog.xml @@ -6,8 +6,9 @@ diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d8a48c19..44202be2 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -13,6 +13,7 @@ @color/white true + @style/FairerBottomSheetDialogTheme @color/highlight @color/highlight @@ -24,6 +25,14 @@ @color/highlight + + + +