From 692fb2117e29b107073a1008eb6cbbdab94e3ac0 Mon Sep 17 00:00:00 2001 From: OneWay Date: Wed, 21 Oct 2026 03:49:09 +0800 Subject: [PATCH] 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. --- .../research/feature/download/DownloadManager.kt | 11 +++++++++++ .../java/com/example/research/ui/main/MainScreen.kt | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/research/feature/download/DownloadManager.kt b/app/src/main/java/com/example/research/feature/download/DownloadManager.kt index fcde452..83729b5 100644 --- a/app/src/main/java/com/example/research/feature/download/DownloadManager.kt +++ b/app/src/main/java/com/example/research/feature/download/DownloadManager.kt @@ -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 diff --git a/app/src/main/java/com/example/research/ui/main/MainScreen.kt b/app/src/main/java/com/example/research/ui/main/MainScreen.kt index 75441bc..c95714b 100644 --- a/app/src/main/java/com/example/research/ui/main/MainScreen.kt +++ b/app/src/main/java/com/example/research/ui/main/MainScreen.kt @@ -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 &&