Surface failed refreshes instead of swallowing them
All checks were successful
Build TV app / build (push) Successful in 2m54s
All checks were successful
Build TV app / build (push) Successful in 2m54s
Favourites and stream profiles were refreshed inside a bare runCatching, so when they failed nothing was logged and the app just showed a stale cached list. An expired login now always raises the re-login screen, even when cached channels could still be displayed, and the settings gained a "Senderliste neu laden" row for a manual retry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -200,8 +200,14 @@ class AppState(
|
||||
result.fold(
|
||||
onSuccess = { appError = AppError.NONE },
|
||||
onFailure = { throwable ->
|
||||
// Cached channels keep the app usable; only surface a
|
||||
// fullscreen state when there is nothing to show.
|
||||
// An expired login must always surface: cached channels
|
||||
// would otherwise sit there without EPG or favourites and
|
||||
// nothing would say why.
|
||||
if (throwable.message == "not logged in") {
|
||||
appError = AppError.RELOGIN
|
||||
return
|
||||
}
|
||||
// Otherwise cached channels keep the app usable.
|
||||
if (activeChannels().isNotEmpty()) return
|
||||
appError = when {
|
||||
throwable.message == "not logged in" -> AppError.RELOGIN
|
||||
|
||||
@@ -49,13 +49,20 @@ class DispatcharrRepository(context: Context, private val auth: DeviceAuth) {
|
||||
scope.launch {
|
||||
val result = runCatching {
|
||||
status.value = "loading_channels"
|
||||
Log.i(TAG, "refresh start (loggedIn=${auth.isLoggedIn})")
|
||||
val token = auth.accessToken() ?: error("not logged in")
|
||||
val groups = fetchGroups(token)
|
||||
val list = fetchChannels(token, groups)
|
||||
channels.value = list
|
||||
prefs.edit().putString("channels_cache", Channel.listToJson(list).toString()).apply()
|
||||
launch { runCatching { refreshFavorites(token) } }
|
||||
launch { runCatching { refreshProfiles(token) } }
|
||||
launch {
|
||||
runCatching { refreshFavorites(token) }
|
||||
.onFailure { Log.w(TAG, "favorites failed: ${it.javaClass.simpleName}: ${it.message?.take(120)}") }
|
||||
}
|
||||
launch {
|
||||
runCatching { refreshProfiles(token) }
|
||||
.onFailure { Log.w(TAG, "profiles failed: ${it.javaClass.simpleName}: ${it.message?.take(120)}") }
|
||||
}
|
||||
launch {
|
||||
runCatching { refreshEpg(token) }
|
||||
.onFailure { Log.w(TAG, "epg failed: ${it.javaClass.simpleName}: ${it.message?.take(160)}") }
|
||||
|
||||
@@ -251,6 +251,10 @@ fun SettingsScreen(state: AppState) {
|
||||
}
|
||||
}
|
||||
}
|
||||
SettingRow(
|
||||
"Senderliste neu laden",
|
||||
subtitle = "Holt Sender, Programm und Favoriten erneut",
|
||||
) { state.refreshActive() }
|
||||
SettingRow(
|
||||
"Erweitert",
|
||||
subtitle = "M3U/EPG-Adressen von Hand eintragen",
|
||||
|
||||
Reference in New Issue
Block a user