Skip to content

Commit 7f5f44b

Browse files
committed
add ability to select duration on change record screen
1 parent a433128 commit 7f5f44b

File tree

68 files changed

+799
-181
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+799
-181
lines changed

core/src/main/java/com/example/util/simpletimetracker/core/dialog/DurationDialogListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.example.util.simpletimetracker.core.dialog
22

33
interface DurationDialogListener {
44

5-
fun onDurationSet(duration: Long, tag: String? = null) {}
5+
fun onDurationSet(durationSeconds: Long, tag: String? = null) {}
66

77
fun onCountSet(count: Long, tag: String? = null) {}
88

core/src/main/java/com/example/util/simpletimetracker/core/extension/ViewDataExensions.kt

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.example.util.simpletimetracker.core.extension
22

33
import com.example.util.simpletimetracker.core.mapper.TimeMapper
4+
import com.example.util.simpletimetracker.core.viewData.ChangeRecordDateTimeState
45
import com.example.util.simpletimetracker.domain.model.Range
56
import com.example.util.simpletimetracker.domain.model.RecordsFilter
67
import com.example.util.simpletimetracker.feature_base_adapter.runningRecord.GoalTimeViewData
78
import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
8-
import com.example.util.simpletimetracker.navigation.params.screen.ChangeRecordParams
9+
import com.example.util.simpletimetracker.navigation.params.screen.ChangeRecordDateTimeStateParams
910
import com.example.util.simpletimetracker.navigation.params.screen.ChangeRunningRecordParams
1011
import com.example.util.simpletimetracker.navigation.params.screen.RangeParams
1112
import com.example.util.simpletimetracker.navigation.params.screen.RecordTypeIconParams
@@ -53,31 +54,40 @@ fun GoalTimeViewData.toParams(): ChangeRunningRecordParams.Preview.GoalTimeParam
5354
)
5455
}
5556

56-
fun ChangeRecordParams.Preview.DateTime.toViewData(): TimeMapper.DateTime {
57-
return TimeMapper.DateTime(
58-
date = date,
59-
time = time,
60-
)
61-
}
62-
63-
fun TimeMapper.DateTime.toRecordParams(): ChangeRecordParams.Preview.DateTime {
64-
return ChangeRecordParams.Preview.DateTime(
65-
date = date,
66-
time = time,
67-
)
68-
}
69-
70-
fun ChangeRunningRecordParams.Preview.DateTime.toViewData(): TimeMapper.DateTime {
71-
return TimeMapper.DateTime(
72-
date = date,
73-
time = time,
57+
fun ChangeRecordDateTimeStateParams.toViewData(): ChangeRecordDateTimeState {
58+
val state = when (val state = this.state) {
59+
is ChangeRecordDateTimeStateParams.State.DateTime -> {
60+
val dateTime = TimeMapper.DateTime(
61+
date = state.date,
62+
time = state.time,
63+
)
64+
ChangeRecordDateTimeState.State.DateTime(dateTime)
65+
}
66+
is ChangeRecordDateTimeStateParams.State.Duration -> {
67+
ChangeRecordDateTimeState.State.Duration(state.data)
68+
}
69+
}
70+
return ChangeRecordDateTimeState(
71+
hint = hint,
72+
state = state,
7473
)
7574
}
7675

77-
fun TimeMapper.DateTime.toRunningRecordParams(): ChangeRunningRecordParams.Preview.DateTime {
78-
return ChangeRunningRecordParams.Preview.DateTime(
79-
date = date,
80-
time = time,
76+
fun ChangeRecordDateTimeState.toRecordParams(): ChangeRecordDateTimeStateParams {
77+
val state = when (val state = this.state) {
78+
is ChangeRecordDateTimeState.State.DateTime -> {
79+
ChangeRecordDateTimeStateParams.State.DateTime(
80+
date = state.data.date,
81+
time = state.data.time,
82+
)
83+
}
84+
is ChangeRecordDateTimeState.State.Duration -> {
85+
ChangeRecordDateTimeStateParams.State.Duration(state.data)
86+
}
87+
}
88+
return ChangeRecordDateTimeStateParams(
89+
hint = hint,
90+
state = state,
8191
)
8292
}
8393

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.example.util.simpletimetracker.core.mapper
2+
3+
import com.example.util.simpletimetracker.core.R
4+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
5+
import com.example.util.simpletimetracker.core.viewData.ChangeRecordDateTimeState
6+
import javax.inject.Inject
7+
8+
class ChangeRecordDateTimeMapper @Inject constructor(
9+
private val timeMapper: TimeMapper,
10+
private val resourceRepo: ResourceRepo,
11+
) {
12+
13+
fun map(
14+
param: Param,
15+
field: Field,
16+
useMilitaryTimeFormat: Boolean,
17+
showSeconds: Boolean,
18+
): ChangeRecordDateTimeState {
19+
return ChangeRecordDateTimeState(
20+
hint = when (param) {
21+
is Param.DateTime -> when (field) {
22+
is Field.Start -> R.string.change_record_date_time_start
23+
is Field.End -> R.string.change_record_date_time_end
24+
}
25+
is Param.Duration -> R.string.change_record_date_time_duration
26+
}.let(resourceRepo::getString),
27+
state = when (param) {
28+
is Param.DateTime -> {
29+
ChangeRecordDateTimeState.State.DateTime(
30+
timeMapper.getFormattedDateTime(
31+
time = param.timestamp,
32+
useMilitaryTime = useMilitaryTimeFormat,
33+
showSeconds = showSeconds,
34+
),
35+
)
36+
}
37+
is Param.Duration -> {
38+
ChangeRecordDateTimeState.State.Duration(
39+
timeMapper.formatInterval(
40+
interval = param.duration,
41+
forceSeconds = showSeconds,
42+
useProportionalMinutes = false,
43+
),
44+
)
45+
}
46+
},
47+
)
48+
}
49+
50+
sealed interface Param {
51+
data class DateTime(val timestamp: Long) : Param
52+
data class Duration(val duration: Long) : Param
53+
}
54+
55+
sealed interface Field {
56+
object Start : Field
57+
object End : Field
58+
}
59+
}

core/src/main/java/com/example/util/simpletimetracker/core/view/timeAdjustment/TimeAdjustmentView.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,23 @@ class TimeAdjustmentView @JvmOverloads constructor(
8787
}
8888
}
8989

90-
sealed class ViewData : ViewHolderType {
91-
abstract val text: String
90+
sealed interface ViewData : ViewHolderType {
91+
val text: String
9292

9393
override fun getUniqueId(): Long = text.hashCode().toLong()
9494
override fun isValidType(other: ViewHolderType): Boolean = false
9595

9696
data class Now(
9797
override val text: String,
98-
) : ViewData()
98+
) : ViewData
99+
100+
data class Zero(
101+
override val text: String,
102+
): ViewData
99103

100104
data class Adjust(
101105
override val text: String,
102106
val value: Long,
103-
) : ViewData()
107+
) : ViewData
104108
}
105109
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.example.util.simpletimetracker.core.viewData
2+
3+
import com.example.util.simpletimetracker.core.mapper.TimeMapper
4+
5+
data class ChangeRecordDateTimeState(
6+
val hint: String,
7+
val state: State,
8+
) {
9+
10+
sealed interface State {
11+
data class DateTime(val data: TimeMapper.DateTime) : State
12+
data class Duration(val data: String) : State
13+
}
14+
}

features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/view/ChangeCategoryFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ class ChangeCategoryFragment :
173173
viewModel.onCustomColorSelected(colorInt)
174174
}
175175

176-
override fun onDurationSet(duration: Long, tag: String?) {
176+
override fun onDurationSet(durationSeconds: Long, tag: String?) {
177177
viewModel.onDurationSet(
178178
tag = tag,
179-
duration = duration,
179+
duration = durationSeconds,
180180
anchor = binding.btnChangeCategorySave,
181181
)
182182
}

features/feature_change_goals/src/main/java/com/example/util/simpletimetracker/feature_change_goals/delegate/GoalsViewModelDelegateImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class GoalsViewModelDelegateImpl @Inject constructor(
117117
router.navigate(
118118
DurationDialogParams(
119119
tag = tag,
120-
value = DurationDialogParams.Value.Duration(
120+
value = DurationDialogParams.Value.DurationSeconds(
121121
duration = goalType.value.orZero(),
122122
),
123123
),

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
1616
import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData
1717
import com.example.util.simpletimetracker.feature_change_record.R
1818
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentFieldViewData
19-
import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordViewDataMapper
2019
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentViewData
20+
import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordViewDataMapper
21+
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordDateTimeFieldsState
2122
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordFavCommentState
2223
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordSearchCommentState
2324
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData
@@ -39,7 +40,9 @@ class ChangeRecordViewDataInteractor @Inject constructor(
3940

4041
suspend fun getPreviewViewData(
4142
record: Record,
43+
dateTimeFieldState: ChangeRecordDateTimeFieldsState,
4244
): ChangeRecordViewData {
45+
// TODO pass cached data?
4346
val type = recordTypeInteractor.get(record.typeId)
4447
val tags = recordTagInteractor.getAll().filter { it.id in record.tagIds }
4548
val isDarkTheme = prefsInteractor.getDarkMode()
@@ -55,6 +58,7 @@ class ChangeRecordViewDataInteractor @Inject constructor(
5558
useMilitaryTime = useMilitaryTime,
5659
useProportionalMinutes = useProportionalMinutes,
5760
showSeconds = showSeconds,
61+
dateTimeFieldState = dateTimeFieldState,
5862
)
5963
}
6064

@@ -140,15 +144,25 @@ class ChangeRecordViewDataInteractor @Inject constructor(
140144
)
141145
}
142146

143-
fun getTimeAdjustmentItems(): List<ViewHolderType> {
147+
fun getTimeAdjustmentItems(
148+
dateTimeFieldState: ChangeRecordDateTimeFieldsState.State,
149+
): List<ViewHolderType> {
150+
val additionalButton = when (dateTimeFieldState) {
151+
is ChangeRecordDateTimeFieldsState.State.DateTime -> {
152+
TimeAdjustmentView.ViewData.Now(text = resourceRepo.getString(R.string.time_now))
153+
}
154+
is ChangeRecordDateTimeFieldsState.State.Duration -> {
155+
TimeAdjustmentView.ViewData.Zero("0")
156+
}
157+
}
144158
return listOf(
145159
TimeAdjustmentView.ViewData.Adjust(text = "-30", value = -30),
146160
TimeAdjustmentView.ViewData.Adjust(text = "-5", value = -5),
147161
TimeAdjustmentView.ViewData.Adjust(text = "-1", value = -1),
148162
TimeAdjustmentView.ViewData.Adjust(text = "+1", value = +1),
149163
TimeAdjustmentView.ViewData.Adjust(text = "+5", value = +5),
150164
TimeAdjustmentView.ViewData.Adjust(text = "+30", value = +30),
151-
TimeAdjustmentView.ViewData.Now(text = resourceRepo.getString(R.string.time_now)),
165+
additionalButton,
152166
)
153167
}
154168

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.util.simpletimetracker.feature_change_record.mapper
22

3+
import com.example.util.simpletimetracker.core.mapper.ChangeRecordDateTimeMapper
34
import com.example.util.simpletimetracker.core.mapper.ColorMapper
45
import com.example.util.simpletimetracker.core.mapper.IconMapper
56
import com.example.util.simpletimetracker.core.mapper.RecordViewDataMapper
@@ -10,6 +11,7 @@ import com.example.util.simpletimetracker.domain.model.Record
1011
import com.example.util.simpletimetracker.domain.model.RecordTag
1112
import com.example.util.simpletimetracker.domain.model.RecordType
1213
import com.example.util.simpletimetracker.feature_change_record.R
14+
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordDateTimeFieldsState
1315
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordSimpleViewData
1416
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData
1517
import javax.inject.Inject
@@ -20,6 +22,7 @@ class ChangeRecordViewDataMapper @Inject constructor(
2022
private val timeMapper: TimeMapper,
2123
private val resourceRepo: ResourceRepo,
2224
private val recordViewDataMapper: RecordViewDataMapper,
25+
private val changeRecordDateTimeMapper: ChangeRecordDateTimeMapper,
2326
) {
2427

2528
fun map(
@@ -30,6 +33,7 @@ class ChangeRecordViewDataMapper @Inject constructor(
3033
useMilitaryTime: Boolean,
3134
useProportionalMinutes: Boolean,
3235
showSeconds: Boolean,
36+
dateTimeFieldState: ChangeRecordDateTimeFieldsState,
3337
): ChangeRecordViewData {
3438
return ChangeRecordViewData(
3539
name = recordType?.name
@@ -46,14 +50,30 @@ class ChangeRecordViewDataMapper @Inject constructor(
4650
useMilitaryTime = useMilitaryTime,
4751
showSeconds = showSeconds,
4852
),
49-
dateTimeStarted = timeMapper.getFormattedDateTime(
50-
time = record.timeStarted,
51-
useMilitaryTime = useMilitaryTime,
53+
dateTimeStarted = changeRecordDateTimeMapper.map(
54+
param = when (dateTimeFieldState.start) {
55+
is ChangeRecordDateTimeFieldsState.State.DateTime -> {
56+
ChangeRecordDateTimeMapper.Param.DateTime(record.timeStarted)
57+
}
58+
is ChangeRecordDateTimeFieldsState.State.Duration -> {
59+
ChangeRecordDateTimeMapper.Param.Duration(record.duration)
60+
}
61+
},
62+
field = ChangeRecordDateTimeMapper.Field.Start,
63+
useMilitaryTimeFormat = useMilitaryTime,
5264
showSeconds = showSeconds,
5365
),
54-
dateTimeFinished = timeMapper.getFormattedDateTime(
55-
time = record.timeEnded,
56-
useMilitaryTime = useMilitaryTime,
66+
dateTimeFinished = changeRecordDateTimeMapper.map(
67+
param = when (dateTimeFieldState.end) {
68+
is ChangeRecordDateTimeFieldsState.State.DateTime -> {
69+
ChangeRecordDateTimeMapper.Param.DateTime(record.timeEnded)
70+
}
71+
is ChangeRecordDateTimeFieldsState.State.Duration -> {
72+
ChangeRecordDateTimeMapper.Param.Duration(record.duration)
73+
}
74+
},
75+
field = ChangeRecordDateTimeMapper.Field.End,
76+
useMilitaryTimeFormat = useMilitaryTime,
5777
showSeconds = showSeconds,
5878
),
5979
duration = timeMapper.formatInterval(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.example.util.simpletimetracker.feature_change_record.model
2+
3+
enum class ChangeRecordDateTimeField {
4+
START,
5+
END
6+
}

0 commit comments

Comments
 (0)