From dc1d5f2c7c178a562721bdbe07ccc4b684364774 Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Fri, 17 Jul 2026 16:59:05 +0300 Subject: [PATCH] fix(#614): implement ToastHost on Achievements/Sessions/Processes ViewModels (#615) Add ToastHost interface + override keyword to the 3 ViewModels that declared clearToast() without implementing the interface. This aligns them with the other 17 ViewModels and enables polymorphic substitution where ToastHost is expected. Fixes #614 Co-authored-by: M57 --- .../hermescontrol/ui/achievements/AchievementsViewModel.kt | 5 +++-- .../com/m57/hermescontrol/ui/process/ProcessesViewModel.kt | 5 +++-- .../com/m57/hermescontrol/ui/sessions/SessionsViewModel.kt | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsViewModel.kt index 2ce961f8..0cd9b472 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsViewModel.kt @@ -5,6 +5,7 @@ import com.m57.hermescontrol.data.model.Achievement import com.m57.hermescontrol.data.model.RecentUnlock import com.m57.hermescontrol.data.remote.ApiClient import com.m57.hermescontrol.data.remote.safeApiCall +import com.m57.hermescontrol.ui.common.ToastHost import com.m57.hermescontrol.ui.common.safeLaunchLoad import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -38,7 +39,7 @@ data class AchievementsUiState( val toastMessage: String? = null, ) -class AchievementsViewModel : ViewModel() { +class AchievementsViewModel : ViewModel(), ToastHost { private val _uiState = MutableStateFlow(AchievementsUiState()) val uiState: StateFlow = _uiState.asStateFlow() @@ -191,7 +192,7 @@ class AchievementsViewModel : ViewModel() { _uiState.update { it.copy(activeState = state) } } - fun clearToast() { + override fun clearToast() { _uiState.update { it.copy(toastMessage = null) } } } diff --git a/app/src/main/java/com/m57/hermescontrol/ui/process/ProcessesViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/process/ProcessesViewModel.kt index 28c786f2..e0ce22b6 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/process/ProcessesViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/process/ProcessesViewModel.kt @@ -6,6 +6,7 @@ import com.m57.hermescontrol.data.model.ProcessInfo import com.m57.hermescontrol.data.session.ActiveSessionHolder import com.m57.hermescontrol.data.ws.HermesWsClient import com.m57.hermescontrol.data.ws.WsMethods +import com.m57.hermescontrol.ui.common.ToastHost import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -23,7 +24,7 @@ data class ProcessesUiState( val sessionId: String? = null, ) -class ProcessesViewModel : ViewModel() { +class ProcessesViewModel : ViewModel(), ToastHost { private val _uiState = MutableStateFlow(ProcessesUiState()) val uiState: StateFlow = _uiState.asStateFlow() @@ -123,7 +124,7 @@ class ProcessesViewModel : ViewModel() { } } - fun clearToast() { + override fun clearToast() { _uiState.update { it.copy(toastMessage = null) } } diff --git a/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsViewModel.kt index 25316a56..f85b87d8 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/sessions/SessionsViewModel.kt @@ -10,6 +10,7 @@ import com.m57.hermescontrol.data.model.SessionSearchResult import com.m57.hermescontrol.data.remote.ApiClient import com.m57.hermescontrol.data.remote.NetworkResult import com.m57.hermescontrol.data.remote.safeApiCall +import com.m57.hermescontrol.ui.common.ToastHost import com.m57.hermescontrol.ui.common.safeLaunchLoad import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -52,7 +53,7 @@ data class SessionsUiState( val isSearchMode: Boolean get() = searchQuery.isNotBlank() } -class SessionsViewModel : ViewModel() { +class SessionsViewModel : ViewModel(), ToastHost { private val _uiState = MutableStateFlow(SessionsUiState()) val uiState: StateFlow = _uiState.asStateFlow() @@ -471,7 +472,7 @@ class SessionsViewModel : ViewModel() { // ── Toast ──────────────────────────────────────────────────────────── - fun clearToast() { + override fun clearToast() { _uiState.update { it.copy(toastMessage = null) } } }