Skip to content

Commit 691ea0d

Browse files
committed
refactor wear load and error views
1 parent c8d74ce commit 691ea0d

File tree

12 files changed

+235
-190
lines changed

12 files changed

+235
-190
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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.core
7+
8+
import com.example.util.simpletimetracker.R
9+
import com.example.util.simpletimetracker.presentation.ui.ErrorState
10+
import javax.inject.Inject
11+
12+
class ErrorStateMapper @Inject constructor() {
13+
14+
fun map(): ErrorState {
15+
return ErrorState(R.string.wear_loading_error)
16+
}
17+
}

wear/src/main/java/com/example/util/simpletimetracker/features/activities/mapper/ActivitiesViewDataMapper.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package com.example.util.simpletimetracker.features.activities.mapper
77

88
import androidx.compose.ui.graphics.toArgb
99
import com.example.util.simpletimetracker.R
10+
import com.example.util.simpletimetracker.core.ErrorStateMapper
1011
import com.example.util.simpletimetracker.data.WearIconMapper
1112
import com.example.util.simpletimetracker.data.WearResourceRepo
1213
import com.example.util.simpletimetracker.domain.base.REPEAT_BUTTON_ITEM_ID
@@ -17,20 +18,21 @@ import com.example.util.simpletimetracker.domain.model.WearCurrentActivity
1718
import com.example.util.simpletimetracker.domain.model.WearLastRecord
1819
import com.example.util.simpletimetracker.domain.model.WearSettings
1920
import com.example.util.simpletimetracker.domain.model.WearTag
20-
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
2121
import com.example.util.simpletimetracker.features.activities.screen.ActivitiesListState
2222
import com.example.util.simpletimetracker.features.activities.ui.ActivityChipState
2323
import com.example.util.simpletimetracker.features.activities.ui.ActivityChipType
24+
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
2425
import com.example.util.simpletimetracker.utils.orZero
2526
import javax.inject.Inject
2627

2728
class ActivitiesViewDataMapper @Inject constructor(
2829
private val wearIconMapper: WearIconMapper,
2930
private val resourceRepo: WearResourceRepo,
31+
private val errorStateMapper: ErrorStateMapper,
3032
) {
3133

3234
fun mapErrorState(): ActivitiesListState.Error {
33-
return ActivitiesListState.Error(R.string.wear_loading_error)
35+
return ActivitiesListState.Error(errorStateMapper.map())
3436
}
3537

3638
fun mapEmptyState(): ActivitiesListState.Empty {

wear/src/main/java/com/example/util/simpletimetracker/features/activities/screen/ActivitiesList.kt

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@ import androidx.compose.foundation.layout.Spacer
1414
import androidx.compose.foundation.layout.aspectRatio
1515
import androidx.compose.foundation.layout.fillMaxSize
1616
import androidx.compose.foundation.layout.padding
17-
import androidx.compose.foundation.layout.width
1817
import androidx.compose.runtime.Composable
1918
import androidx.compose.runtime.remember
2019
import androidx.compose.ui.Modifier
2120
import androidx.compose.ui.graphics.toArgb
22-
import androidx.compose.ui.res.painterResource
2321
import androidx.compose.ui.text.style.TextAlign
2422
import androidx.compose.ui.tooling.preview.Preview
2523
import androidx.compose.ui.unit.dp
2624
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
27-
import androidx.wear.compose.material.CircularProgressIndicator
28-
import androidx.wear.compose.material.Icon
2925
import androidx.wear.compose.material.Text
3026
import androidx.wear.tooling.preview.devices.WearDevices
3127
import com.example.util.simpletimetracker.R
@@ -35,25 +31,29 @@ import com.example.util.simpletimetracker.features.activities.ui.ActivityChipCom
3531
import com.example.util.simpletimetracker.features.activities.ui.ActivityChipCompatState
3632
import com.example.util.simpletimetracker.features.activities.ui.ActivityChipState
3733
import com.example.util.simpletimetracker.features.activities.ui.ActivityChipType
38-
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
34+
import com.example.util.simpletimetracker.features.activities.ui.NavigationButton
35+
import com.example.util.simpletimetracker.features.activities.ui.OpenOnPhoneButton
3936
import com.example.util.simpletimetracker.presentation.layout.ScaffoldedScrollingColumn
37+
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
4038
import com.example.util.simpletimetracker.presentation.ui.ACTIVITY_LIST_COMPACT_CHIP_COUNT
4139
import com.example.util.simpletimetracker.presentation.ui.Divider
40+
import com.example.util.simpletimetracker.presentation.ui.ErrorState
4241
import com.example.util.simpletimetracker.presentation.ui.Hint
4342
import com.example.util.simpletimetracker.presentation.ui.HintState
44-
import com.example.util.simpletimetracker.features.activities.ui.NavigationButton
45-
import com.example.util.simpletimetracker.features.activities.ui.OpenOnPhoneButton
4643
import com.example.util.simpletimetracker.presentation.ui.RefreshButton
44+
import com.example.util.simpletimetracker.presentation.ui.RenderLoading
45+
import com.example.util.simpletimetracker.presentation.ui.renderError
4746
import com.example.util.simpletimetracker.utils.getString
4847
import com.example.util.simpletimetracker.utils.orZero
4948
import java.time.Instant
5049
import java.util.UUID
5150

5251
sealed interface ActivitiesListState {
53-
object Loading : ActivitiesListState
52+
53+
data object Loading : ActivitiesListState
5454

5555
data class Error(
56-
@StringRes val messageResId: Int,
56+
val error: ErrorState,
5757
) : ActivitiesListState
5858

5959
data class Empty(
@@ -82,18 +82,22 @@ fun ActivitiesList(
8282
onStatisticsClick: () -> Unit = {},
8383
onSettingsClick: () -> Unit = {},
8484
) {
85-
ScaffoldedScrollingColumn(
86-
startItemIndex = 1,
87-
) {
85+
ScaffoldedScrollingColumn {
8886
when (state) {
8987
is ActivitiesListState.Loading -> item {
9088
RenderLoading()
9189
}
9290
is ActivitiesListState.Error -> {
93-
renderError(state, onRefresh)
91+
renderError(
92+
state = state.error,
93+
onRefresh = onRefresh,
94+
)
9495
}
9596
is ActivitiesListState.Empty -> {
96-
renderEmpty(state, onOpenOnPhone)
97+
renderEmpty(
98+
state = state,
99+
onOpenOnPhone = onOpenOnPhone,
100+
)
97101
}
98102
is ActivitiesListState.Content -> {
99103
renderContent(
@@ -108,35 +112,6 @@ fun ActivitiesList(
108112
}
109113
}
110114

111-
@Composable
112-
private fun RenderLoading() {
113-
CircularProgressIndicator(
114-
modifier = Modifier.width(64.dp),
115-
)
116-
}
117-
118-
private fun ScalingLazyListScope.renderError(
119-
state: ActivitiesListState.Error,
120-
onRefresh: () -> Unit,
121-
) {
122-
item {
123-
Icon(
124-
painter = painterResource(R.drawable.wear_connection_error),
125-
contentDescription = null,
126-
)
127-
}
128-
item {
129-
Text(
130-
text = getString(stringResId = state.messageResId),
131-
modifier = Modifier.padding(horizontal = 8.dp),
132-
textAlign = TextAlign.Center,
133-
)
134-
}
135-
item {
136-
RefreshButton(onRefresh)
137-
}
138-
}
139-
140115
private fun ScalingLazyListScope.renderEmpty(
141116
state: ActivitiesListState.Empty,
142117
onOpenOnPhone: () -> Unit,
@@ -312,7 +287,9 @@ private fun Loading() {
312287
@Composable
313288
private fun Error() {
314289
ActivitiesList(
315-
state = ActivitiesListState.Error(R.string.wear_loading_error),
290+
state = ActivitiesListState.Error(
291+
ErrorState(R.string.wear_loading_error),
292+
),
316293
)
317294
}
318295

wear/src/main/java/com/example/util/simpletimetracker/features/settings/mapper/SettingsViewDataMapper.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,21 @@ package com.example.util.simpletimetracker.features.settings.mapper
77

88
import com.example.util.simpletimetracker.BuildConfig
99
import com.example.util.simpletimetracker.R
10+
import com.example.util.simpletimetracker.core.ErrorStateMapper
1011
import com.example.util.simpletimetracker.data.WearResourceRepo
1112
import com.example.util.simpletimetracker.domain.model.WearSettings
12-
import com.example.util.simpletimetracker.features.settings.ui.SettingsItemType
13-
import com.example.util.simpletimetracker.features.settings.ui.SettingsItem
1413
import com.example.util.simpletimetracker.features.settings.screen.SettingsListState
14+
import com.example.util.simpletimetracker.features.settings.ui.SettingsItem
15+
import com.example.util.simpletimetracker.features.settings.ui.SettingsItemType
1516
import javax.inject.Inject
1617

1718
class SettingsViewDataMapper @Inject constructor(
1819
private val resourceRepo: WearResourceRepo,
20+
private val errorStateMapper: ErrorStateMapper,
1921
) {
2022

2123
fun mapErrorState(): SettingsListState.Error {
22-
return SettingsListState.Error(R.string.wear_loading_error)
24+
return SettingsListState.Error(errorStateMapper.map())
2325
}
2426

2527
fun mapContentState(

wear/src/main/java/com/example/util/simpletimetracker/features/settings/screen/SettingsList.kt

Lines changed: 26 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,31 @@
55
*/
66
package com.example.util.simpletimetracker.features.settings.screen
77

8-
import androidx.annotation.StringRes
9-
import androidx.compose.foundation.layout.Column
10-
import androidx.compose.foundation.layout.padding
11-
import androidx.compose.foundation.layout.width
8+
import androidx.compose.foundation.layout.Spacer
129
import androidx.compose.runtime.Composable
1310
import androidx.compose.runtime.remember
14-
import androidx.compose.ui.Alignment
1511
import androidx.compose.ui.Modifier
16-
import androidx.compose.ui.res.painterResource
17-
import androidx.compose.ui.text.style.TextAlign
1812
import androidx.compose.ui.tooling.preview.Preview
1913
import androidx.compose.ui.unit.dp
2014
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
21-
import androidx.wear.compose.material.CircularProgressIndicator
22-
import androidx.wear.compose.material.Icon
23-
import androidx.wear.compose.material.Text
2415
import androidx.wear.tooling.preview.devices.WearDevices
2516
import com.example.util.simpletimetracker.R
26-
import com.example.util.simpletimetracker.presentation.layout.ScaffoldedScrollingColumn
27-
import com.example.util.simpletimetracker.features.settings.ui.SettingsItemType
28-
import com.example.util.simpletimetracker.presentation.ui.RefreshButton
2917
import com.example.util.simpletimetracker.features.settings.ui.SettingsCheckbox
3018
import com.example.util.simpletimetracker.features.settings.ui.SettingsHint
3119
import com.example.util.simpletimetracker.features.settings.ui.SettingsItem
20+
import com.example.util.simpletimetracker.features.settings.ui.SettingsItemType
3221
import com.example.util.simpletimetracker.features.settings.ui.SettingsVersion
33-
import com.example.util.simpletimetracker.utils.getString
22+
import com.example.util.simpletimetracker.presentation.layout.ScaffoldedScrollingColumn
23+
import com.example.util.simpletimetracker.presentation.ui.ErrorState
24+
import com.example.util.simpletimetracker.presentation.ui.RenderLoading
25+
import com.example.util.simpletimetracker.presentation.ui.renderError
3426

3527
sealed interface SettingsListState {
36-
object Loading : SettingsListState
28+
29+
data object Loading : SettingsListState
3730

3831
data class Error(
39-
@StringRes val messageResId: Int,
32+
val error: ErrorState,
4033
) : SettingsListState
4134

4235
data class Content(
@@ -51,15 +44,18 @@ fun SettingsList(
5144
onSettingClick: (SettingsItemType) -> Unit = {},
5245
) {
5346
ScaffoldedScrollingColumn(
54-
startItemIndex = 0,
5547
spacedBy = 0.dp,
5648
) {
5749
when (state) {
5850
is SettingsListState.Loading -> item {
5951
RenderLoading()
6052
}
61-
is SettingsListState.Error -> item {
62-
RenderError(state, onRefresh)
53+
is SettingsListState.Error -> {
54+
renderError(
55+
state = state.error,
56+
spacedBy = 10.dp,
57+
onRefresh = onRefresh,
58+
)
6359
}
6460
is SettingsListState.Content -> {
6561
renderContent(
@@ -71,40 +67,11 @@ fun SettingsList(
7167
}
7268
}
7369

74-
// TODO move to outer element, replace in other screens.
75-
// TODO same for error.
76-
@Composable
77-
private fun RenderLoading() {
78-
CircularProgressIndicator(
79-
modifier = Modifier.width(64.dp),
80-
)
81-
}
82-
83-
@Composable
84-
private fun RenderError(
85-
state: SettingsListState.Error,
86-
onRefresh: () -> Unit,
87-
) {
88-
Column(
89-
horizontalAlignment = Alignment.CenterHorizontally,
90-
) {
91-
Icon(
92-
painter = painterResource(R.drawable.wear_connection_error),
93-
contentDescription = null,
94-
)
95-
Text(
96-
text = getString(stringResId = state.messageResId),
97-
modifier = Modifier.padding(8.dp),
98-
textAlign = TextAlign.Center,
99-
)
100-
RefreshButton(onRefresh)
101-
}
102-
}
103-
10470
private fun ScalingLazyListScope.renderContent(
10571
state: SettingsListState.Content,
10672
onSettingClick: (SettingsItemType) -> Unit,
10773
) {
74+
item { Spacer(Modifier) }
10875
for (item in state.items) {
10976
item {
11077
val onClick = remember(item) {
@@ -136,6 +103,16 @@ private fun Loading() {
136103
)
137104
}
138105

106+
@Preview(device = WearDevices.LARGE_ROUND)
107+
@Composable
108+
private fun Error() {
109+
SettingsList(
110+
state = SettingsListState.Error(
111+
ErrorState(R.string.wear_loading_error),
112+
),
113+
)
114+
}
115+
139116
@Preview(device = WearDevices.LARGE_ROUND)
140117
@Composable
141118
private fun Content() {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package com.example.util.simpletimetracker.features.statistics.mapper
77

88
import androidx.compose.ui.graphics.toArgb
99
import com.example.util.simpletimetracker.R
10+
import com.example.util.simpletimetracker.core.ErrorStateMapper
1011
import com.example.util.simpletimetracker.core.common.mapper.StatisticsMapper
1112
import com.example.util.simpletimetracker.core.common.mapper.TimeMapper
1213
import com.example.util.simpletimetracker.data.WearIconMapper
@@ -16,22 +17,21 @@ import com.example.util.simpletimetracker.domain.base.UNTRACKED_ITEM_ID
1617
import com.example.util.simpletimetracker.domain.model.WearActivityIcon
1718
import com.example.util.simpletimetracker.domain.model.WearChartFilterType
1819
import com.example.util.simpletimetracker.domain.model.WearStatistics
19-
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
20-
import com.example.util.simpletimetracker.features.statistics.ui.StatisticsChipState
2120
import com.example.util.simpletimetracker.features.statistics.screen.StatisticsListState
21+
import com.example.util.simpletimetracker.features.statistics.ui.StatisticsChipState
22+
import com.example.util.simpletimetracker.presentation.theme.ColorInactive
2223
import javax.inject.Inject
2324

2425
class StatisticsViewDataMapper @Inject constructor(
2526
private val wearIconMapper: WearIconMapper,
2627
private val resourceRepo: WearResourceRepo,
2728
private val timeMapper: TimeMapper,
2829
private val statisticsMapper: StatisticsMapper,
30+
private val errorStateMapper: ErrorStateMapper,
2931
) {
3032

31-
// TODO remove
32-
// TODO move StatisticsList to separate package, split other classes to packages
3333
fun mapErrorState(): StatisticsListState.Error {
34-
return StatisticsListState.Error(R.string.wear_loading_error)
34+
return StatisticsListState.Error(errorStateMapper.map())
3535
}
3636

3737
fun mapEmptyState(): StatisticsListState.Empty {

0 commit comments

Comments
 (0)