Skip to content

Commit f45288b

Browse files
committed
add slider to split record action
1 parent fee6ed3 commit f45288b

File tree

10 files changed

+114
-23
lines changed

10 files changed

+114
-23
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.example.util.simpletimetracker.feature_change_record.adapter
2+
3+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
4+
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
5+
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordActionsBlock
6+
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordSliderViewData as ViewData
7+
import com.example.util.simpletimetracker.feature_change_record.databinding.ChangeRecordSliderItemBinding as Binding
8+
9+
fun createChangeRecordSliderAdapterDelegate(
10+
onValueChanged: (ViewData, Float) -> Unit,
11+
) = createRecyclerBindingAdapterDelegate<ViewData, Binding>(
12+
Binding::inflate,
13+
) { binding, item, _ ->
14+
15+
with(binding) {
16+
item as ViewData
17+
// To avoid illegal state exception.
18+
val actualMax = item.max.coerceAtLeast(item.min + 1)
19+
20+
root.tag = item.block
21+
if (item.min != sliderChangeRecordItem.valueFrom) {
22+
sliderChangeRecordItem.valueFrom = item.min
23+
}
24+
if (item.max != sliderChangeRecordItem.valueTo) {
25+
sliderChangeRecordItem.valueTo = actualMax
26+
}
27+
if (item.value != sliderChangeRecordItem.value) {
28+
sliderChangeRecordItem.value = item.value
29+
}
30+
sliderChangeRecordItem.addOnChangeListener { _, value, fromUser ->
31+
if (fromUser) onValueChanged(item, value)
32+
}
33+
}
34+
}
35+
36+
data class ChangeRecordSliderViewData(
37+
val block: ChangeRecordActionsBlock,
38+
val min: Float,
39+
val max: Float,
40+
val value: Float,
41+
) : ViewHolderType {
42+
43+
override fun getUniqueId(): Long = block.ordinal.toLong()
44+
45+
override fun isValidType(other: ViewHolderType): Boolean =
46+
other is ViewData
47+
}

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/model/ChangeRecordActionsBlock.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.example.util.simpletimetracker.feature_change_record.model
33
enum class ChangeRecordActionsBlock {
44
SplitTimePreview,
55
SplitTimeAdjustment,
6+
SplitSlider,
67
SplitButton,
78

89
AdjustTimePreview,

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/view/ChangeRecordCore.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.example.util.simpletimetracker.feature_change_record.adapter.createCh
3434
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordChangePreviewAdapterDelegate
3535
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordCommentAdapterDelegate
3636
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordCommentFieldAdapterDelegate
37+
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordSliderAdapterDelegate
3738
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordTimeAdjustmentAdapterDelegate
3839
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordTimeDoublePreviewAdapterDelegate
3940
import com.example.util.simpletimetracker.feature_change_record.adapter.createChangeRecordTimePreviewAdapterDelegate
@@ -114,6 +115,7 @@ class ChangeRecordCore(
114115
),
115116
createChangeRecordTimeAdjustmentAdapterDelegate(viewModel::onTimeAdjustmentClick),
116117
createChangeRecordButtonAdapterDelegate(viewModel::onItemButtonClick),
118+
createChangeRecordSliderAdapterDelegate(viewModel::onSliderValueChanged)
117119
)
118120
}
119121

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateImpl.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRe
1010
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordChangePreviewViewData
1111
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeDoublePreviewViewData
1212
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordActionsBlock
13+
import kotlinx.coroutines.Job
1314
import kotlinx.coroutines.launch
1415
import javax.inject.Inject
1516

@@ -22,6 +23,7 @@ class ChangeRecordActionsDelegateImpl @Inject constructor(
2223
val timeChangeAdjustmentState get() = delegateHolder.adjustDelegate.timeChangeAdjustmentState
2324

2425
private var parent: ChangeRecordActionsDelegate.Parent? = null
26+
private var updateJob: Job? = null
2527

2628
fun attach(parent: ChangeRecordActionsDelegate.Parent) {
2729
this.parent = parent
@@ -36,8 +38,11 @@ class ChangeRecordActionsDelegateImpl @Inject constructor(
3638
}
3739

3840
fun updateData() {
39-
delegateHolder.delegatesList.forEach { delegate ->
40-
delegateScope.launch { delegate.updateViewData() }
41+
updateJob?.cancel()
42+
updateJob = delegateScope.launch {
43+
delegateHolder.delegatesList.forEach { delegate ->
44+
launch { delegate.updateViewData() }
45+
}
4146
}
4247
}
4348

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsSplitDelegate.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
88
import com.example.util.simpletimetracker.feature_change_record.R
99
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordButtonViewData
1010
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordChangePreviewViewData
11+
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordSliderViewData
1112
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeAdjustmentViewData
1213
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimePreviewViewData
1314
import com.example.util.simpletimetracker.feature_change_record.interactor.ChangeRecordViewDataInteractor
1415
import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordViewDataMapper
1516
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordActionsBlock
1617
import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordDateTimeFieldsState
1718
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordPreview
19+
import kotlinx.coroutines.coroutineScope
20+
import java.util.concurrent.TimeUnit
1821
import javax.inject.Inject
22+
import kotlinx.coroutines.ensureActive
1923

2024
class ChangeRecordActionsSplitDelegate @Inject constructor(
2125
private val resourceRepo: ResourceRepo,
@@ -36,8 +40,11 @@ class ChangeRecordActionsSplitDelegate @Inject constructor(
3640
}
3741

3842
override suspend fun updateViewData() {
39-
viewData = loadViewData()
40-
parent?.update()
43+
coroutineScope {
44+
viewData = loadViewData()
45+
ensureActive()
46+
parent?.update()
47+
}
4148
}
4249

4350
suspend fun onSplitClickDelegate() {
@@ -76,6 +83,12 @@ class ChangeRecordActionsSplitDelegate @Inject constructor(
7683
block = ChangeRecordActionsBlock.SplitTimeAdjustment,
7784
items = loadTimeSplitAdjustmentItems(),
7885
)
86+
result += ChangeRecordSliderViewData(
87+
block = ChangeRecordActionsBlock.SplitSlider,
88+
min = 0f,
89+
max = TimeUnit.MILLISECONDS.toSeconds(newTimeEnded - newTimeStarted).toFloat(),
90+
value = TimeUnit.MILLISECONDS.toSeconds(newTimeSplit - newTimeStarted).toFloat(),
91+
)
7992
val previewData = loadSplitPreviewViewData(
8093
newTypeId = newTypeId,
8194
newTimeStarted = newTimeStarted,

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.example.util.simpletimetracker.feature_change_record.R
2525
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordButtonViewData
2626
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordChangePreviewViewData
2727
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordCommentViewData
28+
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordSliderViewData
2829
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeAdjustmentViewData
2930
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeDoublePreviewViewData
3031
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimePreviewViewData
@@ -460,6 +461,16 @@ abstract class ChangeRecordBaseViewModel(
460461
}
461462
}
462463

464+
fun onSliderValueChanged(viewData: ChangeRecordSliderViewData, value: Float) {
465+
when (viewData.block) {
466+
ChangeRecordActionsBlock.SplitSlider ->
467+
onSliderSplitValueChanged(value)
468+
else -> {
469+
// Do nothing.
470+
}
471+
}
472+
}
473+
463474
fun onAdjustTimeStartedItemClick(viewData: TimeAdjustmentView.ViewData) {
464475
onAdjustTimeItemClick(TimeAdjustmentState.TIME_STARTED, viewData)
465476
}
@@ -501,23 +512,26 @@ abstract class ChangeRecordBaseViewModel(
501512
}
502513

503514
private fun onAdjustTimeSplitItemClick(viewData: TimeAdjustmentView.ViewData) {
504-
viewModelScope.launch {
505-
when (viewData) {
506-
is TimeAdjustmentView.ViewData.Now -> {
507-
newTimeSplit = System.currentTimeMillis()
508-
onTimeSplitChanged()
509-
}
510-
is TimeAdjustmentView.ViewData.Zero -> {
511-
// Do nothing, shouldn't be there.
512-
}
513-
is TimeAdjustmentView.ViewData.Adjust -> {
514-
newTimeSplit += TimeUnit.MINUTES.toMillis(viewData.value)
515-
onTimeSplitChanged()
516-
}
515+
when (viewData) {
516+
is TimeAdjustmentView.ViewData.Now -> {
517+
newTimeSplit = System.currentTimeMillis()
518+
onTimeSplitChanged()
519+
}
520+
is TimeAdjustmentView.ViewData.Zero -> {
521+
// Do nothing, shouldn't be there.
522+
}
523+
is TimeAdjustmentView.ViewData.Adjust -> {
524+
newTimeSplit += TimeUnit.MINUTES.toMillis(viewData.value)
525+
onTimeSplitChanged()
517526
}
518527
}
519528
}
520529

530+
private fun onSliderSplitValueChanged(value: Float) {
531+
newTimeSplit = newTimeStarted + TimeUnit.SECONDS.toMillis(value.toLong())
532+
onTimeSplitChanged()
533+
}
534+
521535
private fun onRecordChangeButtonClick(
522536
onProceed: suspend () -> Unit,
523537
checkTypeSelected: Boolean = true,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<com.google.android.material.slider.Slider xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:id="@+id/sliderChangeRecordItem"
6+
android:layout_width="match_parent"
7+
android:layout_height="wrap_content"
8+
app:labelBehavior="gone"
9+
tools:value="33"
10+
tools:valueFrom="0"
11+
tools:valueTo="100" />
12+

features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/colorSelection/view/ColorSelectionDialogFragment.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ class ColorSelectionDialogFragment : BaseBottomSheetFragment<Binding>() {
6868

6969
override fun initUx() = with(binding) {
7070
sliderColorSelectionHue.addOnChangeListener { _, value, fromUser ->
71-
if (fromUser) {
72-
viewModel.onHueChanged(value)
73-
}
71+
if (fromUser) viewModel.onHueChanged(value)
7472
}
7573
viewColorSelectionView.setListener(
7674
object : ColorSelectionView.ColorSelectedListener {

features/feature_dialogs/src/main/res/layout/color_selection_dialog_fragment.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
android:layout_width="match_parent"
3333
android:layout_height="wrap_content"
3434
android:layout_marginHorizontal="8dp"
35-
android:layout_marginEnd="8dp"
3635
android:valueFrom="0"
3736
android:valueTo="360"
3837
app:labelBehavior="gone"

features/feature_pomodoro/src/main/res/layout/pomodoro_fragment.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
android:paddingHorizontal="2dp"
123123
android:text=":"
124124
android:textColor="?appTextPrimaryColor"
125-
android:textSize="32sp"
125+
android:textSize="36sp"
126126
app:layout_constraintBottom_toBottomOf="parent"
127127
app:layout_constraintEnd_toStartOf="@id/tvPomodoroTimerSeconds"
128128
app:layout_constraintStart_toEndOf="@id/tvPomodoroTimerMinutes"
@@ -149,7 +149,7 @@
149149
android:fontFamily="sans-serif-condensed"
150150
android:includeFontPadding="false"
151151
android:textColor="?appTextPrimaryColor"
152-
android:textSize="32sp"
152+
android:textSize="36sp"
153153
app:layout_constraintBottom_toBottomOf="parent"
154154
app:layout_constraintEnd_toEndOf="parent"
155155
app:layout_constraintStart_toEndOf="@id/tvPomodoroTimerMinutesDelimiter"

0 commit comments

Comments
 (0)