Skip to content

Commit 237b1fb

Browse files
committed
✨ 운동했던 기록을 통해 달력에 해당 운동 날짜 콩찍기 구현
1 parent da00929 commit 237b1fb

File tree

5 files changed

+55
-20
lines changed

5 files changed

+55
-20
lines changed

presentation/src/main/java/com/whyranoid/presentation/myrun/CalendarDayBinder.kt

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import com.whyranoid.presentation.databinding.ItemCalendarDayBinding
1212
import java.time.LocalDate
1313

1414
class CalendarDayBinder(
15-
private val calendarView: CalendarView
15+
private val calendarView: CalendarView,
16+
private val runningDays: List<List<String>>
1617
) : DayBinder<CalendarDayBinder.DayContainer> {
1718
private var calendar: CalendarRange = CalendarRange(null, null)
1819

@@ -36,12 +37,6 @@ class CalendarDayBinder(
3637
)
3738
)
3839
// day.day와 day.date.monthValue를 지정해서 특정 월, 일에 달렸다는 콩 표시 가능
39-
} else if (day.day == 10 && day.date.monthValue == 11) {
40-
container.binding.root.background =
41-
ContextCompat.getDrawable(
42-
calendarView.context,
43-
R.drawable.calendar_kong
44-
)
4540
} else {
4641
container.binding.tvCalendarDay.setTextColor(
4742
ContextCompat.getColor(
@@ -74,6 +69,20 @@ class CalendarDayBinder(
7469
R.drawable.thumbnail_src_small
7570
)
7671
}
72+
73+
runningDays.forEach { runningDay ->
74+
val runningDayYear = runningDay[0].toInt()
75+
val runningDayMonth = runningDay[1].toInt()
76+
val runningDayDay = runningDay[2].toInt()
77+
78+
if (runningDayYear == day.date.year && runningDayMonth == day.date.monthValue && runningDayDay == day.day) {
79+
container.binding.root.background =
80+
ContextCompat.getDrawable(
81+
calendarView.context,
82+
R.drawable.calendar_kong
83+
)
84+
}
85+
}
7786
}
7887

7988
private fun isInRange(date: LocalDate): Boolean {

presentation/src/main/java/com/whyranoid/presentation/myrun/MyRunFragment.kt

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,6 @@ internal class MyRunFragment : BaseFragment<FragmentMyRunBinding>(R.layout.fragm
5757
}
5858
true
5959
}
60-
61-
calendarView.apply {
62-
itemAnimator = null
63-
dayBinder = CalendarDayBinder(this)
64-
monthScrollListener = { calendarMonth ->
65-
onMonthScrolled(calendarMonth.yearMonth)
66-
}
67-
// 모든 달력 범위 설정
68-
setup(firstMonth, lastMonth, firstDayOfWeek)
69-
// 첫 화면에서 보일 달 설정
70-
scrollToMonth(currentMonth)
71-
}
7260
}
7361

7462
private fun observeState() {
@@ -100,6 +88,22 @@ internal class MyRunFragment : BaseFragment<FragmentMyRunBinding>(R.layout.fragm
10088
}
10189
}
10290
}
91+
92+
viewLifecycleOwner.repeatWhenUiStarted {
93+
viewModel.runningDays.collect { runningDays ->
94+
binding.calendarView.apply {
95+
itemAnimator = null
96+
dayBinder = CalendarDayBinder(this, runningDays)
97+
monthScrollListener = { calendarMonth ->
98+
onMonthScrolled(calendarMonth.yearMonth)
99+
}
100+
// 모든 달력 범위 설정
101+
setup(firstMonth, lastMonth, firstDayOfWeek)
102+
// 첫 화면에서 보일 달 설정
103+
scrollToMonth(currentMonth)
104+
}
105+
}
106+
}
103107
}
104108

105109
private fun handleRunningHistorySuccessState(runningHistoryList: List<RunningHistoryUiModel>) {

presentation/src/main/java/com/whyranoid/presentation/myrun/MyRunViewModel.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.whyranoid.presentation.myrun
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5+
import com.whyranoid.domain.model.RunningHistory
56
import com.whyranoid.domain.usecase.GetNicknameUseCase
67
import com.whyranoid.domain.usecase.GetProfileUriUseCase
78
import com.whyranoid.domain.usecase.GetRunningHistoryUseCase
@@ -10,6 +11,7 @@ import com.whyranoid.domain.usecase.UpdateNicknameUseCase
1011
import com.whyranoid.presentation.model.RunningHistoryUiModel
1112
import com.whyranoid.presentation.model.UiState
1213
import com.whyranoid.presentation.model.toRunningHistoryUiModel
14+
import com.whyranoid.presentation.util.toRunningDateString
1315
import dagger.hilt.android.lifecycle.HiltViewModel
1416
import kotlinx.coroutines.flow.MutableStateFlow
1517
import kotlinx.coroutines.flow.StateFlow
@@ -50,6 +52,11 @@ class MyRunViewModel @Inject constructor(
5052
val runningHistoryListState: StateFlow<UiState<List<RunningHistoryUiModel>>>
5153
get() = _runningHistoryListState.asStateFlow()
5254

55+
private val _runningDays =
56+
MutableStateFlow<List<List<String>>>(emptyList())
57+
val runningDays: StateFlow<List<List<String>>>
58+
get() = _runningDays.asStateFlow()
59+
5360
private fun getUid() {
5461
viewModelScope.launch {
5562
_uid.value = getUidUseCase()
@@ -90,14 +97,24 @@ class MyRunViewModel @Inject constructor(
9097
runningHistoryListResult.onSuccess { runningHistoryList ->
9198
_runningHistoryListState.value =
9299
UiState.Success(runningHistoryList.map { runningHistory -> runningHistory.toRunningHistoryUiModel() })
100+
getRunningDays(runningHistoryList)
93101
}.onFailure { throwable ->
94102
_runningHistoryListState.value = UiState.Failure(throwable)
95103
}
96104
}
97105
}
98106
}
99107

108+
private fun getRunningDays(runningHistoryList: List<RunningHistory>) {
109+
runningHistoryList.map { runningHistory ->
110+
_runningDays.value += listOf(
111+
runningHistory.startedAt.toRunningDateString().split(RUNNING_DATE_SEPARATOR)
112+
)
113+
}
114+
}
115+
100116
companion object {
101117
private const val EMPTY_STRING = ""
118+
private const val RUNNING_DATE_SEPARATOR = "."
102119
}
103120
}

presentation/src/main/java/com/whyranoid/presentation/util/Extensions.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ fun Date.dateToString(format: String): String {
2626
return formatter.format(this)
2727
}
2828

29+
fun Long.toRunningDateString(): String {
30+
val formatter = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault())
31+
return formatter.format(this)
32+
}
33+
2934
inline fun <reified T : Serializable> Intent.getSerializableData(key: String): T? = when {
3035
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getSerializableExtra(
3136
key,

presentation/src/main/res/layout/fragment_my_run.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<data>
77

88
<variable
9-
name="viewModel"
9+
name="vm"
1010
type="com.whyranoid.presentation.myrun.MyRunViewModel" />
1111
</data>
1212

0 commit comments

Comments
 (0)