1 Commits
Author SHA1 Message Date
OneWay 692fb2117e fix(download): unblock search after a failed update
A failed update left DownloadState.Error in the state flow forever:
settings replayed it as a snackbar on every recomposition and search
stayed locked until the next app start.
2026-10-21 04:00:00 +08:00
2 changed files with 16 additions and 1 deletions

No files matched your search

@@ -52,6 +52,13 @@ class DownloadManager(
var onDownloadSuccess: (() -> Unit)? = null
var onTerminal: ((DownloadState) -> Unit)? = null
private suspend fun expireErrorStateToIdle() {
delay(TERMINAL_STATE_DURATION)
if (downloadState.value is DownloadState.Error) {
updateDownloadProgressState(DownloadState.Idle, 0f)
}
}
fun startDownload() {
if (downloadState.value is DownloadState.Loading) return
if (!downloadScope.isActive) return
@@ -79,6 +86,7 @@ class DownloadManager(
updateDownloadProgressState(
DownloadState.Error(sourceUnavailableMessage), 0f
)
expireErrorStateToIdle()
return@withLock
}
@@ -135,6 +143,7 @@ class DownloadManager(
}
}
expireErrorStateToIdle()
}
} finally {
downloadJob = null
@@ -174,6 +183,7 @@ class DownloadManager(
updateDownloadProgressState(
DownloadState.Error(sourceUnavailableMessage), 0f
)
expireErrorStateToIdle()
return@withLock
}
@@ -230,6 +240,7 @@ class DownloadManager(
}
}
expireErrorStateToIdle()
}
} finally {
downloadJob = null
@@ -64,7 +64,11 @@ fun MainRoute(
dictionary.isActive && dictionary.articleCount > 0
}
settingsState.downloadState is DownloadState.Idle &&
val downloadSettled = settingsState.downloadState.let { state ->
state is DownloadState.Idle || state is DownloadState.Error
}
downloadSettled &&
!settingsState.indexingProgress.isIndexing &&
settingsState.importState !is ImportState.Importing &&
settingsState.importState !is ImportState.Extracting &&