From a5c6dbaa7c88432f22e3155a3076a3c7cc08b8c4 Mon Sep 17 00:00:00 2001 From: CrissZollo Date: Sun, 1 Feb 2026 23:27:55 +0100 Subject: [PATCH] Fix potential memory leak in PluginViewModel flow collectors - Replaced three separate flow collectors with a single combined flow - Prevents potential race conditions and reduces coroutine overhead - Uses combine() to merge pluginsEnabled, repositories, and scrapers flows - Single collector updates UI state atomically for all three values This ensures that flow collection is more efficient and reduces the risk of memory leaks from multiple concurrent collectors. --- .../tv/ui/screens/plugin/PluginViewModel.kt | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/nuvio/tv/ui/screens/plugin/PluginViewModel.kt b/app/src/main/java/com/nuvio/tv/ui/screens/plugin/PluginViewModel.kt index 5d984ed3..61371ae3 100644 --- a/app/src/main/java/com/nuvio/tv/ui/screens/plugin/PluginViewModel.kt +++ b/app/src/main/java/com/nuvio/tv/ui/screens/plugin/PluginViewModel.kt @@ -7,6 +7,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import javax.inject.Inject @@ -25,20 +26,20 @@ class PluginViewModel @Inject constructor( private fun observePluginData() { viewModelScope.launch { - pluginManager.pluginsEnabled.collect { enabled -> - _uiState.update { it.copy(pluginsEnabled = enabled) } - } - } - - viewModelScope.launch { - pluginManager.repositories.collect { repos -> - _uiState.update { it.copy(repositories = repos) } - } - } - - viewModelScope.launch { - pluginManager.scrapers.collect { scraperList -> - _uiState.update { it.copy(scrapers = scraperList) } + combine( + pluginManager.pluginsEnabled, + pluginManager.repositories, + pluginManager.scrapers + ) { enabled, repos, scrapers -> + Triple(enabled, repos, scrapers) + }.collect { (enabled, repos, scrapers) -> + _uiState.update { + it.copy( + pluginsEnabled = enabled, + repositories = repos, + scrapers = scrapers + ) + } } } }