Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/main calender #113

Merged
merged 20 commits into from
Aug 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,6 @@ dependencies {

implementation Dependencies.workermanager

implementation Dependencies.coil

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.depromeet.housekeeper.adapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.depromeet.housekeeper.databinding.ItemHouseworkBinding
Expand All @@ -14,6 +15,8 @@ class HouseWorkAdapter(
private val onClick: (HouseWork) -> Unit,
private val onDone: (HouseWork) -> Unit,
) : RecyclerView.Adapter<HouseWorkAdapter.ItemViewHolder>() {
private var doneHouseWorks : MutableList<HouseWork> = mutableListOf()


private fun getTime(houseWork: HouseWork): String {
houseWork.scheduledTime?.let {
Expand All @@ -26,9 +29,11 @@ class HouseWorkAdapter(
} ?: return "하루 종일"
}

fun updateDate(houseWork: MutableList<HouseWork>) {
fun updateDate(remainHouseWork: MutableList<HouseWork>, doneHouseWork : MutableList<HouseWork>) {
list.clear()
list.addAll(houseWork)
list.addAll(remainHouseWork)
list.addAll(doneHouseWork)
doneHouseWorks = doneHouseWork
notifyDataSetChanged()
}
fun callDone(layoutPosition: Int) {
Expand Down Expand Up @@ -63,6 +68,15 @@ class HouseWorkAdapter(
inner class ItemViewHolder(private val binding: ItemHouseworkBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(houseWork: HouseWork) {
if(doneHouseWorks.isNotEmpty()){
if(doneHouseWorks.first()==houseWork){
binding.tvTitle.text = String.format("끝낸 집안일 %d" , doneHouseWorks.size)
binding.tvTitle.visibility = View.VISIBLE
}
else binding.tvTitle.visibility = View.GONE
}
else binding.tvTitle.visibility = View.GONE

binding.isOver = when {
houseWork.success -> false
houseWork.scheduledTime == null -> false
Expand All @@ -81,10 +95,6 @@ class HouseWorkAdapter(
binding.root.setOnClickListener {
onClick.invoke(houseWork)
}

/*binding.btDone.setOnClickListener {
onDone.invoke(houseWork)
}*/
val adapter = SmallProfileAdapter(houseWork.assignees.toMutableList())
binding.rvProfileAdapter.adapter = adapter

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.depromeet.housekeeper.model

data class SectionHouseWorks(
val title : String?,
val list: MutableList<HouseWork>
)
187 changes: 79 additions & 108 deletions app/src/main/java/com/depromeet/housekeeper/ui/MainFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ import com.depromeet.housekeeper.model.enums.ViewType
import com.depromeet.housekeeper.util.SwipeHelperCallback
import com.depromeet.housekeeper.util.VerticalItemDecorator
import kotlinx.coroutines.flow.collect
import timber.log.Timber
import java.text.SimpleDateFormat
import java.util.*


class MainFragment : Fragment() {

lateinit var binding: FragmentMainBinding
Expand All @@ -62,7 +62,6 @@ class MainFragment : Fragment() {
mainViewModel.apply {
getRules()
getGroupName()
updateState(MainViewModel.CurrentState.REMAIN)
updateSelectDate(getToday())
}

Expand All @@ -89,15 +88,11 @@ class MainFragment : Fragment() {
binding.tvMonth.setOnClickListener {
createDatePickerDialog()
}
binding.tvRemain.setOnClickListener {
mainViewModel.updateState(MainViewModel.CurrentState.REMAIN)
}
binding.tvEnd.setOnClickListener {
mainViewModel.updateState(MainViewModel.CurrentState.DONE)
}

binding.mainHeader.mainHeaderSettingIv.setOnClickListener {
findNavController().navigate(MainFragmentDirections.actionMainFragmentToSettingFragment())
}

binding.lvRule.root.setOnClickListener {
findNavController().navigate(MainFragmentDirections.actionMainFragmentToRuleFragment())
}
Expand Down Expand Up @@ -142,7 +137,7 @@ class MainFragment : Fragment() {

val list =
mainViewModel.selectHouseWork.value?.houseWorks?.toMutableList() ?: mutableListOf()
houseWorkAdapter = HouseWorkAdapter(list, onClick = { it
houseWorkAdapter = HouseWorkAdapter(list, onClick = {
findNavController().navigate(
MainFragmentDirections.actionMainFragmentToAddDirectTodoFragment(
viewType = ViewType.EDIT,
Expand All @@ -151,7 +146,7 @@ class MainFragment : Fragment() {
)
)
}, {
mainViewModel.updateChoreState(it.houseWorkId)
mainViewModel.updateChoreState(it)
}
)
binding.rvHouseWork.adapter = houseWorkAdapter
Expand All @@ -165,7 +160,6 @@ class MainFragment : Fragment() {
swipeHelperCallback.removePreviousClamp(binding.rvHouseWork)
false
}

groupProfileAdapter = GroupProfileAdapter(mainViewModel.groups.value.toMutableList()) {
mainViewModel.updateSelectUser(it.memberId)
}
Expand All @@ -180,8 +174,7 @@ class MainFragment : Fragment() {
binding.tvCompleteHouseChore.text = getString(R.string.complete_chore_yet)
}
else -> {
val completeFormat =
String.format(resources.getString(R.string.complete_chore), it)
val completeFormat = String.format(resources.getString(R.string.complete_chore), it)
binding.tvCompleteHouseChore.text =
getSpannableText(
completeFormat,
Expand All @@ -195,19 +188,13 @@ class MainFragment : Fragment() {

lifecycleScope.launchWhenCreated {
mainViewModel.selectHouseWork.collect { houseWork ->

houseWork?.let {
binding.isEmptyDone = it.countDone == 0
binding.isEmptyRemain = it.countLeft == 0

binding.layoutDoneScreen.root.isVisible =
mainViewModel.currentState.value == MainViewModel.CurrentState.REMAIN && it.countLeft == 0 && it.countDone > 0
it.countLeft == 0 && it.countDone > 0
binding.layoutEmptyScreen.root.isVisible =
(it.countLeft == 0 && it.countDone == 0)

binding.tvRemainBadge.text = it.countLeft.toString()
dayOfAdapter.updateChoreSize(it.countLeft)
binding.tvEndBadge.text = it.countDone.toString()
dayOfAdapter.updateChoreSize(it.countLeft)//TODO 나중에 api 연결할때 수정

binding.layoutEmptyScreen.root.isVisible = houseWork.houseWorks.isEmpty()
updateHouseWorkData(houseWork)
Expand All @@ -218,20 +205,6 @@ class MainFragment : Fragment() {
}
}

lifecycleScope.launchWhenStarted {
mainViewModel.currentState.collect {
binding.isSelectDone = it == MainViewModel.CurrentState.DONE
binding.isSelectRemain = it == MainViewModel.CurrentState.REMAIN
val houseWork = mainViewModel.selectHouseWork.value ?: return@collect
binding.layoutDoneScreen.root.isVisible =
it == MainViewModel.CurrentState.REMAIN && (houseWork.countLeft == 0 && houseWork.countDone > 0)

mainViewModel.selectHouseWork.value?.let {
updateHouseWorkData(it)
}
}
}

lifecycleScope.launchWhenStarted {
mainViewModel.dayOfWeek.collect {
val year = it.date.split("-")[0]
Expand Down Expand Up @@ -294,87 +267,85 @@ class MainFragment : Fragment() {
}

private fun updateHouseWorkData(houseWork: HouseWorks) {
val list = when (mainViewModel.currentState.value) {
MainViewModel.CurrentState.REMAIN -> {
houseWork.houseWorks
.filter { !it.success }
.sortedBy { it.scheduledTime }
.toMutableList()
}
else -> {
houseWork.houseWorks
.filter { it.success }
.sortedBy { it.scheduledTime }
.toMutableList()
}
}
houseWorkAdapter?.updateDate(list)
val remainList =
houseWork.houseWorks
.filter { !it.success }
.sortedBy { it.scheduledTime }
.toMutableList()

val doneList =
houseWork.houseWorks
.filter { it.success }
.sortedBy { it.scheduledTime }
.toMutableList()

houseWorkAdapter?.updateDate(remainList,doneList)
}

private fun getCurrentWeek(): MutableList<DayOfWeek> {
val format = SimpleDateFormat("yyyy-MM-dd-EEE", Locale.getDefault())
val calendar: Calendar = Calendar.getInstance().apply {
set(Calendar.MONTH, this.get(Calendar.MONTH))
firstDayOfWeek = Calendar.SUNDAY
set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}

private fun getCurrentWeek(): MutableList<DayOfWeek> {
val format = SimpleDateFormat("yyyy-MM-dd-EEE", Locale.getDefault())
val calendar: Calendar = Calendar.getInstance().apply {
set(Calendar.MONTH, this.get(Calendar.MONTH))
firstDayOfWeek = Calendar.SUNDAY
set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}
val days = mutableListOf<String>()
val days = mutableListOf<String>()
days.add(format.format(calendar.time))
repeat(6) {
calendar.add(Calendar.DATE, 1)
days.add(format.format(calendar.time))
repeat(6) {
calendar.add(Calendar.DATE, 1)
days.add(format.format(calendar.time))
}
return days.map {
DayOfWeek(
date = it,
isSelect = it == format.format(Calendar.getInstance().time)
)
}.toMutableList()
}
return days.map {
DayOfWeek(
date = it,
isSelect = it == format.format(Calendar.getInstance().time)
)
}.toMutableList()
}

private fun rvWeekSwipeListener() {
val itemTouchCallback = object : ItemTouchHelper.SimpleCallback(
0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}

private fun rvWeekSwipeListener(){
val itemTouchCallback = object : ItemTouchHelper.SimpleCallback(
0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}

override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
if (actionState == ACTION_STATE_SWIPE) {
val view = binding.rvWeek
val newX = 0.0 // newX 만큼 이동(고정 시 이동 위치/고정 해제 시 이동 위치 결정)
getDefaultUIUtil().onDraw(
c,
recyclerView,
view,
newX.toFloat(),
dY,
actionState,
isCurrentlyActive
)
}
if (actionState == ACTION_STATE_SWIPE) {
val view = binding.rvWeek
val newX = 0.0 // newX 만큼 이동(고정 시 이동 위치/고정 해제 시 이동 위치 결정)
getDefaultUIUtil().onDraw(
c,
recyclerView,
view,
newX.toFloat(),
dY,
actionState,
isCurrentlyActive
)
}
}

override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
when(direction){
ItemTouchHelper.LEFT -> dayOfAdapter.updateDate(mainViewModel.getNextWeek())
ItemTouchHelper.RIGHT -> dayOfAdapter.updateDate(mainViewModel.getLastWeek())
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
when (direction) {
ItemTouchHelper.LEFT -> dayOfAdapter.updateDate(mainViewModel.getNextWeek())
ItemTouchHelper.RIGHT -> dayOfAdapter.updateDate(mainViewModel.getLastWeek())
}
}
ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.rvWeek)
}
ItemTouchHelper(itemTouchCallback).attachToRecyclerView(binding.rvWeek)
}
}
Loading