Skip to content

Commit 9151a62

Browse files
committed
add prev next buttons to wear statistics
1 parent 691ea0d commit 9151a62

File tree

12 files changed

+134
-21
lines changed

12 files changed

+134
-21
lines changed

core/common/src/main/java/com/example/util/simpletimetracker/core/common/mapper/TimeMapper.kt renamed to core/common/src/main/java/com/example/util/simpletimetracker/core/common/mapper/CommonTimeMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import java.util.concurrent.TimeUnit
66
import javax.inject.Inject
77
import kotlin.math.abs
88

9-
class TimeMapper @Inject constructor(
9+
class CommonTimeMapper @Inject constructor(
1010
private val resourceRepo: BaseResourceRepo,
1111
) {
1212

core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.example.util.simpletimetracker.core.mapper
22

33
import com.example.util.simpletimetracker.core.R
4-
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper
4+
import com.example.util.simpletimetracker.core.common.mapper.CommonTimeMapper
55
import com.example.util.simpletimetracker.core.extension.setToStartOfDay
66
import com.example.util.simpletimetracker.core.extension.setWeekToFirstDay
77
import com.example.util.simpletimetracker.core.extension.shift
@@ -22,7 +22,7 @@ class TimeMapper @Inject constructor(
2222
localeProvider: LocaleProvider,
2323
private val resourceRepo: ResourceRepo,
2424
private val currentTimestampProvider: CurrentTimestampProvider,
25-
private val commonTimeMapper: TimeMapper,
25+
private val commonTimeMapper: CommonTimeMapper,
2626
) {
2727

2828
private val locale: Locale by lazy { localeProvider.get() }

core/src/test/java/com/example/util/simpletimetracker/core/mapper/TimeMapperGetRangeStartAndEndTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.util.simpletimetracker.core.mapper
22

3+
import com.example.util.simpletimetracker.core.common.mapper.CommonTimeMapper
34
import com.example.util.simpletimetracker.core.mapper.TimeMapperGetRangeStartAndEndTest.Subject.commonTimeMapper
45
import com.example.util.simpletimetracker.core.mapper.TimeMapperGetRangeStartAndEndTest.Subject.currentTimestampProvider
56
import com.example.util.simpletimetracker.core.mapper.TimeMapperGetRangeStartAndEndTest.Subject.hourInMs
@@ -23,7 +24,6 @@ import org.mockito.Mockito
2324
import org.mockito.Mockito.`when`
2425
import java.util.TimeZone
2526
import java.util.concurrent.TimeUnit
26-
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper as CommonTimeMapper
2727

2828
@RunWith(Enclosed::class)
2929
class TimeMapperGetRangeStartAndEndTest {

core/src/test/java/com/example/util/simpletimetracker/core/mapper/TimeMapperTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.example.util.simpletimetracker.core.mapper
22

33
import com.example.util.simpletimetracker.core.R
4-
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper
4+
import com.example.util.simpletimetracker.core.common.mapper.CommonTimeMapper
55
import com.example.util.simpletimetracker.core.mapper.TimeMapperTest.Subject.hourInMs
66
import com.example.util.simpletimetracker.core.mapper.TimeMapperTest.Subject.localeProvider
77
import com.example.util.simpletimetracker.core.mapper.TimeMapperTest.Subject.minuteInMs
@@ -51,7 +51,7 @@ class TimeMapperTest {
5151
fun formatInterval() {
5252
`when`(localeProvider.get()).thenReturn(Locale.getDefault())
5353

54-
val subject = TimeMapper(
54+
val subject = CommonTimeMapper(
5555
resourceRepo = resourceRepo,
5656
)
5757

@@ -103,7 +103,7 @@ class TimeMapperTest {
103103
fun formatInterval() {
104104
`when`(localeProvider.get()).thenReturn(Locale.getDefault())
105105

106-
val subject = TimeMapper(
106+
val subject = CommonTimeMapper(
107107
resourceRepo = resourceRepo,
108108
)
109109

@@ -169,7 +169,7 @@ class TimeMapperTest {
169169
fun formatInterval() {
170170
`when`(localeProvider.get()).thenReturn(Locale.getDefault())
171171

172-
val subject = TimeMapper(
172+
val subject = CommonTimeMapper(
173173
resourceRepo = resourceRepo,
174174
)
175175

core/src/test/java/com/example/util/simpletimetracker/core/mapper/TimeMapperTitleTest.kt

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

33
import com.example.util.simpletimetracker.core.R
4+
import com.example.util.simpletimetracker.core.common.mapper.CommonTimeMapper
45
import com.example.util.simpletimetracker.core.mapper.TimeMapperTitleTest.Subject.commonTimeMapper
56
import com.example.util.simpletimetracker.core.mapper.TimeMapperTitleTest.Subject.currentTimestampProvider
67
import com.example.util.simpletimetracker.core.mapper.TimeMapperTitleTest.Subject.hourInMs
@@ -23,7 +24,6 @@ import org.mockito.Mockito.`when`
2324
import java.util.Locale
2425
import java.util.TimeZone
2526
import java.util.concurrent.TimeUnit
26-
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper as CommonTimeMapper
2727

2828
@RunWith(Enclosed::class)
2929
class TimeMapperTitleTest {

wear/src/main/java/com/example/util/simpletimetracker/features/statistics/mapper/StatisticsViewDataMapper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import androidx.compose.ui.graphics.toArgb
99
import com.example.util.simpletimetracker.R
1010
import com.example.util.simpletimetracker.core.ErrorStateMapper
1111
import com.example.util.simpletimetracker.core.common.mapper.StatisticsMapper
12-
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper
12+
import com.example.util.simpletimetracker.core.common.mapper.CommonTimeMapper
1313
import com.example.util.simpletimetracker.data.WearIconMapper
1414
import com.example.util.simpletimetracker.data.WearResourceRepo
1515
import com.example.util.simpletimetracker.domain.base.UNCATEGORIZED_ITEM_ID
@@ -25,7 +25,7 @@ import javax.inject.Inject
2525
class StatisticsViewDataMapper @Inject constructor(
2626
private val wearIconMapper: WearIconMapper,
2727
private val resourceRepo: WearResourceRepo,
28-
private val timeMapper: TimeMapper,
28+
private val timeMapper: CommonTimeMapper,
2929
private val statisticsMapper: StatisticsMapper,
3030
private val errorStateMapper: ErrorStateMapper,
3131
) {

wear/src/main/java/com/example/util/simpletimetracker/features/statistics/screen/StatisticsList.kt

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.wear.compose.material.Text
1717
import androidx.wear.tooling.preview.devices.WearDevices
1818
import com.example.util.simpletimetracker.R
1919
import com.example.util.simpletimetracker.domain.model.WearActivityIcon
20+
import com.example.util.simpletimetracker.features.statistics.ui.StatisticsButtons
2021
import com.example.util.simpletimetracker.features.statistics.ui.StatisticsChip
2122
import com.example.util.simpletimetracker.features.statistics.ui.StatisticsChipState
2223
import com.example.util.simpletimetracker.presentation.layout.ScaffoldedScrollingColumn
@@ -53,6 +54,8 @@ sealed interface StatisticsListState {
5354
fun StatisticsList(
5455
state: StatisticsListState,
5556
onRefresh: () -> Unit = {},
57+
onPrevClick: () -> Unit = {},
58+
onNextClick: () -> Unit = {},
5659
) {
5760
ScaffoldedScrollingColumn {
5861
when (state) {
@@ -65,30 +68,56 @@ fun StatisticsList(
6568
onRefresh = onRefresh,
6669
)
6770
}
68-
is StatisticsListState.Empty -> item {
69-
RenderEmptyState(state)
71+
is StatisticsListState.Empty -> {
72+
renderEmptyState(
73+
state = state,
74+
onPrevClick = onPrevClick,
75+
onNextClick = onNextClick,
76+
)
7077
}
7178
is StatisticsListState.Content -> {
72-
renderContent(state)
79+
renderContent(
80+
state = state,
81+
onPrevClick = onPrevClick,
82+
onNextClick = onNextClick,
83+
)
7384
}
7485
}
7586
}
7687
}
7788

78-
@Composable
79-
private fun RenderEmptyState(
89+
private fun ScalingLazyListScope.renderEmptyState(
8090
state: StatisticsListState.Empty,
91+
onPrevClick: () -> Unit,
92+
onNextClick: () -> Unit,
8193
) {
82-
Text(
83-
text = getString(state.messageResId),
84-
modifier = Modifier.padding(8.dp),
85-
)
94+
item { Spacer(Modifier) }
95+
item {
96+
StatisticsButtons(
97+
onPrevClick = onPrevClick,
98+
onNextClick = onNextClick,
99+
)
100+
}
101+
item {
102+
Text(
103+
text = getString(state.messageResId),
104+
modifier = Modifier.padding(8.dp),
105+
)
106+
}
86107
}
87108

88109
private fun ScalingLazyListScope.renderContent(
89110
state: StatisticsListState.Content,
111+
onPrevClick: () -> Unit,
112+
onNextClick: () -> Unit,
90113
) {
91114
item { Spacer(Modifier) }
115+
item {
116+
StatisticsButtons(
117+
onPrevClick = onPrevClick,
118+
onNextClick = onNextClick,
119+
)
120+
}
92121
for (itemState in state.items) {
93122
when (itemState) {
94123
is StatisticsListState.Content.Item.Statistics -> {

wear/src/main/java/com/example/util/simpletimetracker/features/statistics/screen/StatisticsScreen.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,7 @@ fun StatisticsScreen() {
2020
StatisticsList(
2121
state = state,
2222
onRefresh = viewModel::onRefresh,
23+
onPrevClick = viewModel::onPrevClick,
24+
onNextClick = viewModel::onNextClick,
2325
)
2426
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this
4+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
5+
*/
6+
package com.example.util.simpletimetracker.features.statistics.ui
7+
8+
import androidx.annotation.DrawableRes
9+
import androidx.compose.foundation.layout.Row
10+
import androidx.compose.runtime.Composable
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.res.painterResource
13+
import androidx.compose.ui.tooling.preview.Preview
14+
import androidx.wear.compose.material.Button
15+
import androidx.wear.compose.material.ButtonDefaults
16+
import androidx.wear.compose.material.Icon
17+
import androidx.wear.tooling.preview.devices.WearDevices
18+
import com.example.util.simpletimetracker.R
19+
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
20+
21+
@Composable
22+
fun StatisticsButtons(
23+
onPrevClick: () -> Unit = {},
24+
onNextClick: () -> Unit = {},
25+
) {
26+
Row {
27+
StatisticsButton(
28+
modifier = Modifier.weight(1f),
29+
iconResId = R.drawable.wear_arrow_left,
30+
onClick = onPrevClick,
31+
)
32+
StatisticsButton(
33+
modifier = Modifier.weight(1f),
34+
iconResId = R.drawable.wear_arrow_right,
35+
onClick = onNextClick,
36+
)
37+
}
38+
}
39+
40+
@Composable
41+
private fun StatisticsButton(
42+
modifier: Modifier,
43+
@DrawableRes iconResId: Int,
44+
onClick: () -> Unit = {},
45+
) {
46+
Button(
47+
modifier = modifier,
48+
onClick = onClick,
49+
content = {
50+
Icon(
51+
painter = painterResource(iconResId),
52+
contentDescription = null,
53+
)
54+
},
55+
colors = ButtonDefaults.buttonColors(
56+
backgroundColor = ColorInactive,
57+
),
58+
)
59+
}
60+
61+
@Preview(device = WearDevices.LARGE_ROUND)
62+
@Composable
63+
private fun Preview() {
64+
StatisticsButtons()
65+
}
66+
67+
@Preview(device = WearDevices.LARGE_ROUND, fontScale = 2f)
68+
@Composable
69+
private fun PreviewFontScale() {
70+
StatisticsButtons()
71+
}

wear/src/main/java/com/example/util/simpletimetracker/features/statistics/viewModel/StatisticsViewModel.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class StatisticsViewModel @Inject constructor(
2828
private val _state: MutableStateFlow<StatisticsListState> = MutableStateFlow(StatisticsListState.Loading)
2929

3030
private var isInitialized = false
31+
private var shift: Int = 0
3132

3233
fun init() {
3334
if (isInitialized) return
@@ -39,11 +40,21 @@ class StatisticsViewModel @Inject constructor(
3940
loadData()
4041
}
4142

43+
fun onPrevClick() = viewModelScope.launch {
44+
shift -= 1
45+
loadData()
46+
}
47+
48+
fun onNextClick() = viewModelScope.launch {
49+
shift += 1
50+
loadData()
51+
}
52+
4253
private suspend fun loadData() {
4354
val filterType = WearChartFilterType.ACTIVITY
4455
val statistics = wearDataRepo.loadStatistics(
4556
forceReload = true,
46-
shift = 0,
57+
shift = shift,
4758
filterType = filterType,
4859
)
4960

0 commit comments

Comments
 (0)