From 11ee40acc0b8afeee41baa9c2ff8e1fd6990fa36 Mon Sep 17 00:00:00 2001 From: eerenyuan Date: Sat, 16 May 2026 01:13:56 +0800 Subject: [PATCH] fix: replace testConnection 30s cooldown with cancel-and-restart --- .../java/com/yage/opencode_client/ui/MainViewModel.kt | 8 +++----- .../opencode_client/ui/MainViewModelConnectionActions.kt | 5 +++-- .../java/com/yage/opencode_client/MainViewModelTest.kt | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt index 2e6785d..e1dcc0e 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt @@ -259,7 +259,7 @@ class MainViewModel @Inject constructor( private var sseJob: Job? = null private var pollJob: Job? = null - private var lastHealthCheckTime = 0L + private var connectionTestJob: Job? = null init { loadSettings() @@ -368,10 +368,8 @@ class MainViewModel @Inject constructor( } fun testConnection() { - val now = System.currentTimeMillis() - if (now - lastHealthCheckTime < 30_000) return - lastHealthCheckTime = now - launchConnectionTest(viewModelScope, repository, _state) { + connectionTestJob?.cancel() + connectionTestJob = launchConnectionTest(viewModelScope, repository, _state) { loadInitialData() startSSE() startBusyPolling() diff --git a/app/src/main/java/com/yage/opencode_client/ui/MainViewModelConnectionActions.kt b/app/src/main/java/com/yage/opencode_client/ui/MainViewModelConnectionActions.kt index bbd752c..a5c37d6 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/MainViewModelConnectionActions.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/MainViewModelConnectionActions.kt @@ -4,6 +4,7 @@ import com.yage.opencode_client.data.audio.AIBuildersAudioClient import com.yage.opencode_client.data.repository.OpenCodeRepository import com.yage.opencode_client.util.SettingsManager import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -49,8 +50,8 @@ internal fun launchConnectionTest( repository: OpenCodeRepository, state: MutableStateFlow, onHealthyConnection: () -> Unit -) { - scope.launch { +): Job { + return scope.launch { state.update { it.copy(isConnecting = true, error = null) } repository.checkHealth() .onSuccess { health -> diff --git a/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt b/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt index 8915021..f8f32d8 100644 --- a/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt +++ b/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt @@ -991,7 +991,7 @@ class MainViewModelTest { } @Test - fun `testConnection skips second health check within cooldown`() = runTest { + fun `testConnection cancels previous test and starts a new one`() = runTest { coEvery { repository.checkHealth() } returns Result.success(HealthResponse(healthy = false, version = "1.0")) val viewModel = createViewModel()