Skip to content

Commit 9c6ab6d

Browse files
committed
Better handle webdav io errors in advanced settings window
1 parent 570db08 commit 9c6ab6d

File tree

3 files changed

+53
-12
lines changed

3 files changed

+53
-12
lines changed

app/src/main/java/com/phpbg/easysync/ui/AdvancedSyncSettingsActivity.kt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,20 @@ import androidx.compose.foundation.layout.height
3636
import androidx.compose.foundation.layout.padding
3737
import androidx.compose.foundation.rememberScrollState
3838
import androidx.compose.foundation.verticalScroll
39+
import androidx.compose.material.icons.Icons
40+
import androidx.compose.material.icons.filled.Warning
3941
import androidx.compose.material3.CircularProgressIndicator
4042
import androidx.compose.material3.MaterialTheme
4143
import androidx.compose.material3.Surface
4244
import androidx.compose.runtime.Composable
4345
import androidx.compose.runtime.livedata.observeAsState
4446
import androidx.compose.ui.Modifier
47+
import androidx.compose.ui.graphics.Color
4548
import androidx.compose.ui.res.stringResource
4649
import androidx.compose.ui.tooling.preview.Preview
4750
import androidx.compose.ui.unit.dp
4851
import com.phpbg.easysync.R
52+
import com.phpbg.easysync.ui.components.StatusTitle
4953
import com.phpbg.easysync.ui.components.StdText
5054
import com.phpbg.easysync.ui.components.SwitchSetting
5155
import com.phpbg.easysync.ui.components.Title
@@ -70,7 +74,7 @@ class AdvancedSyncSettingsActivity : ComponentActivity() {
7074
) {
7175
val uiState = viewModel.advancedSyncSettingsUiState.observeAsState()
7276
Main(
73-
uiState = uiState.value ?: AdvancedSyncSettingsUiState(paths = listOf()),
77+
uiState = uiState.value ?: AdvancedSyncSettingsUiState(paths = listOf(), errorMsg = null),
7478
toggleExclusionHandler = viewModel::toggleExclusion
7579
)
7680
}
@@ -95,6 +99,14 @@ private fun Main(
9599
StdText(text = stringResource(R.string.advanced_sync_settings_activity_help))
96100
Spacer(modifier = Modifier.height(16.dp))
97101

102+
if (!uiState.errorMsg.isNullOrEmpty()) {
103+
StatusTitle(
104+
title = uiState.errorMsg,
105+
statusColor = Color.Red,
106+
statusIcon = Icons.Default.Warning
107+
)
108+
}
109+
98110
if (uiState.paths.isEmpty()) {
99111
CircularProgressIndicator(color = MaterialTheme.colorScheme.outline)
100112
} else {
@@ -125,6 +137,28 @@ private fun MainPreview() {
125137
SyncPath(relativePath = "/bar/baz", enabled = false),
126138
SyncPath(relativePath = "/quuux", enabled = true)
127139
),
140+
errorMsg = null
141+
),
142+
toggleExclusionHandler = { _, _ -> }
143+
)
144+
}
145+
}
146+
147+
@Preview(name = "Light Mode", showBackground = true)
148+
@Composable
149+
private fun MainPreviewError() {
150+
EasySyncTheme {
151+
Main(
152+
uiState = AdvancedSyncSettingsUiState(
153+
paths = listOf(
154+
SyncPath(
155+
relativePath = "/foo",
156+
enabled = true
157+
),
158+
SyncPath(relativePath = "/bar/baz", enabled = false),
159+
SyncPath(relativePath = "/quuux", enabled = true)
160+
),
161+
errorMsg = "WebDav error: unable to resolve host"
128162
),
129163
toggleExclusionHandler = { _, _ -> }
130164
)

app/src/main/java/com/phpbg/easysync/ui/AdvancedSyncSettingsUiState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ package com.phpbg.easysync.ui
2626

2727
data class SyncPath(val relativePath: String, val enabled: Boolean)
2828

29-
data class AdvancedSyncSettingsUiState(val paths: List<SyncPath>)
29+
data class AdvancedSyncSettingsUiState(val paths: List<SyncPath>, val errorMsg: String?)

app/src/main/java/com/phpbg/easysync/ui/AdvancedSyncSettingsViewModel.kt

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import androidx.lifecycle.viewModelScope
3232
import com.phpbg.easysync.dav.CollectionPath
3333
import com.phpbg.easysync.dav.WebDavService
3434
import com.phpbg.easysync.mediastore.MediaStoreService
35-
import com.phpbg.easysync.settings.Settings
3635
import com.phpbg.easysync.settings.SettingsDataStore
3736
import kotlinx.coroutines.async
3837
import kotlinx.coroutines.awaitAll
@@ -47,24 +46,32 @@ class AdvancedSyncSettingsViewModel(application: Application) : AndroidViewModel
4746

4847
fun load() {
4948
viewModelScope.launch {
50-
val (_paths, _settings, _davPaths) = awaitAll(
49+
var error: String? = null
50+
val settings = settingsDataStore.getSettings()
51+
val (paths, davPaths) = awaitAll(
5152
async { mediaStoreService.getAllPaths() },
52-
async { settingsDataStore.getSettings() },
5353
async {
54-
val webDavService = WebDavService.create(settingsDataStore.getSettings())
55-
webDavService.getAllCollections(CollectionPath("/"))
54+
try {
55+
val webDavService = WebDavService.create(settingsDataStore.getSettings())
56+
webDavService.getAllCollections(CollectionPath("/"))
57+
} catch (e: Exception) {
58+
error = "WebDav error: ${e.message ?: "unknown webdav error"}"
59+
setOf()
60+
}
5661
}
5762
)
58-
val paths = _paths as Set<String>
59-
val davPaths = _davPaths as Set<String>
60-
val settings = _settings as Settings
6163
val syncPaths = (paths + davPaths).toSortedSet().map {
6264
SyncPath(
6365
relativePath = it,
6466
enabled = !settings.pathExclusions.contains(it)
6567
)
6668
}
67-
_advancedSyncSettingsUiState.postValue(AdvancedSyncSettingsUiState(paths = syncPaths))
69+
_advancedSyncSettingsUiState.postValue(
70+
AdvancedSyncSettingsUiState(
71+
paths = syncPaths,
72+
errorMsg = error
73+
)
74+
)
6875
}
6976
}
7077

@@ -75,7 +82,7 @@ class AdvancedSyncSettingsViewModel(application: Application) : AndroidViewModel
7582
it.takeIf { it.relativePath != relativePath }
7683
?: SyncPath(relativePath = it.relativePath, enabled = activated)
7784
}
78-
_advancedSyncSettingsUiState.postValue(AdvancedSyncSettingsUiState(paths = updatedList))
85+
_advancedSyncSettingsUiState.postValue(uiState.copy(paths = updatedList))
7986
settingsDataStore.updateExclusionPath(relativePath, !activated)
8087
}
8188
}

0 commit comments

Comments
 (0)