bugfix: fix the malfunctioning monitoring switch

This commit is contained in:
Han Yin 2025-08-29 10:10:12 -07:00
parent ba6528e59e
commit 99d77b618a
4 changed files with 37 additions and 38 deletions

View File

@ -98,6 +98,7 @@ fun AppContent(
val engineState by mainViewModel.engineState.collectAsState() val engineState by mainViewModel.engineState.collectAsState()
// Metric states for scaffolds // Metric states for scaffolds
val isMonitoringEnabled by settingsViewModel.isMonitoringEnabled.collectAsState()
val memoryUsage by settingsViewModel.memoryUsage.collectAsState() val memoryUsage by settingsViewModel.memoryUsage.collectAsState()
val temperatureInfo by settingsViewModel.temperatureMetrics.collectAsState() val temperatureInfo by settingsViewModel.temperatureMetrics.collectAsState()
val useFahrenheit by settingsViewModel.useFahrenheitUnit.collectAsState() val useFahrenheit by settingsViewModel.useFahrenheitUnit.collectAsState()
@ -251,7 +252,7 @@ fun AppContent(
navigationIcon = NavigationIcon.Back { navigationIcon = NavigationIcon.Back {
modelLoadingViewModel.onBackPressed { navigationActions.navigateUp() } modelLoadingViewModel.onBackPressed { navigationActions.navigateUp() }
}, },
memoryMetrics = memoryUsage, memoryMetrics = if (isMonitoringEnabled) memoryUsage else null,
temperatureInfo = null temperatureInfo = null
) )
) )
@ -268,8 +269,8 @@ fun AppContent(
navigationIcon = NavigationIcon.Back { navigationIcon = NavigationIcon.Back {
benchmarkViewModel.onBackPressed { navigationActions.navigateUp() } benchmarkViewModel.onBackPressed { navigationActions.navigateUp() }
}, },
memoryMetrics = memoryUsage, memoryMetrics = if (isMonitoringEnabled) memoryUsage else null,
temperatureInfo = Pair(temperatureInfo, useFahrenheit) temperatureInfo = if (isMonitoringEnabled) Pair(temperatureInfo, useFahrenheit) else null
), ),
bottomBarConfig = BottomBarConfig.Benchmark( bottomBarConfig = BottomBarConfig.Benchmark(
engineIdle = !engineState.isUninterruptible, engineIdle = !engineState.isUninterruptible,
@ -314,8 +315,8 @@ fun AppContent(
navigationIcon = NavigationIcon.Back { navigationIcon = NavigationIcon.Back {
conversationViewModel.onBackPressed { navigationActions.navigateUp() } conversationViewModel.onBackPressed { navigationActions.navigateUp() }
}, },
memoryMetrics = memoryUsage, memoryMetrics = if (isMonitoringEnabled) memoryUsage else null,
temperatureInfo = Pair(temperatureInfo, useFahrenheit) temperatureInfo = if (isMonitoringEnabled) Pair(temperatureInfo, useFahrenheit) else null,
), ),
bottomBarConfig = BottomBarConfig.Conversation( bottomBarConfig = BottomBarConfig.Conversation(
isEnabled = !modelThinkingOrSpeaking, isEnabled = !modelThinkingOrSpeaking,
@ -402,7 +403,7 @@ fun AppContent(
topBarConfig = TopBarConfig.Storage( topBarConfig = TopBarConfig.Storage(
title = "Models Management", title = "Models Management",
navigationIcon = NavigationIcon.Back { navigationActions.navigateUp() }, navigationIcon = NavigationIcon.Back { navigationActions.navigateUp() },
storageMetrics = storageMetrics storageMetrics = if (isMonitoringEnabled) storageMetrics else null,
), ),
bottomBarConfig = bottomBarConfig bottomBarConfig = bottomBarConfig
) )

View File

@ -30,7 +30,7 @@ import java.util.Locale
@Composable @Composable
fun PerformanceTopBar( fun PerformanceTopBar(
title: String, title: String,
memoryMetrics: MemoryMetrics, memoryMetrics: MemoryMetrics?,
temperatureDisplay: Pair<TemperatureMetrics, Boolean>?, temperatureDisplay: Pair<TemperatureMetrics, Boolean>?,
onNavigateBack: (() -> Unit)? = null, onNavigateBack: (() -> Unit)? = null,
onMenuOpen: (() -> Unit)? = null, onMenuOpen: (() -> Unit)? = null,
@ -70,7 +70,9 @@ fun PerformanceTopBar(
} }
// Memory indicator // Memory indicator
MemoryIndicator(memoryUsage = memoryMetrics) memoryMetrics?.let {
MemoryIndicator(memoryUsage = it)
}
}, },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.surface, containerColor = MaterialTheme.colorScheme.surface,

View File

@ -27,7 +27,7 @@ sealed class TopBarConfig {
data class Performance( data class Performance(
override val title: String, override val title: String,
override val navigationIcon: NavigationIcon, override val navigationIcon: NavigationIcon,
val memoryMetrics: MemoryMetrics, val memoryMetrics: MemoryMetrics?,
val temperatureInfo: Pair<TemperatureMetrics, Boolean>?, val temperatureInfo: Pair<TemperatureMetrics, Boolean>?,
) : TopBarConfig() ) : TopBarConfig()

View File

@ -13,6 +13,7 @@ import com.example.llama.monitoring.StorageMetrics
import com.example.llama.monitoring.TemperatureMetrics import com.example.llama.monitoring.TemperatureMetrics
import com.example.llama.monitoring.TemperatureWarningLevel import com.example.llama.monitoring.TemperatureWarningLevel
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
@ -87,30 +88,34 @@ class SettingsViewModel @Inject constructor(
/** /**
* Starts monitoring device performance. * Starts monitoring device performance.
*/ */
private var monitoringJob: Job? = null
private fun startMonitoring() { private fun startMonitoring() {
val interval = _monitoringInterval.value val interval = _monitoringInterval.value
monitoringJob?.cancel()
viewModelScope.launch { viewModelScope.launch {
modelRepository.getStorageMetrics().collect { metrics -> launch {
_storageMetrics.value = metrics modelRepository.getStorageMetrics().collect { metrics ->
_storageMetrics.value = metrics
}
} }
}
viewModelScope.launch { launch {
performanceMonitor.monitorMemoryUsage(interval).collect { metrics -> performanceMonitor.monitorMemoryUsage(interval).collect { metrics ->
_memoryUsage.value = metrics _memoryUsage.value = metrics
}
} }
}
viewModelScope.launch { launch {
performanceMonitor.monitorBattery(interval * 2).collect { metrics -> performanceMonitor.monitorBattery(interval * 2).collect { metrics ->
_batteryInfo.value = metrics _batteryInfo.value = metrics
}
} }
}
viewModelScope.launch { launch {
performanceMonitor.monitorTemperature(interval * 2).collect { metrics -> performanceMonitor.monitorTemperature(interval * 2).collect { metrics ->
_temperatureMetrics.value = metrics _temperatureMetrics.value = metrics
}
} }
} }
} }
@ -120,12 +125,11 @@ class SettingsViewModel @Inject constructor(
*/ */
fun setMonitoringEnabled(enabled: Boolean) { fun setMonitoringEnabled(enabled: Boolean) {
viewModelScope.launch { viewModelScope.launch {
userPreferences.setPerformanceMonitoringEnabled(enabled) if (enabled && !_isMonitoringEnabled.value) {
_isMonitoringEnabled.value = enabled
if (enabled && !isMonitoringActive()) {
startMonitoring() startMonitoring()
} }
_isMonitoringEnabled.value = enabled
userPreferences.setPerformanceMonitoringEnabled(enabled)
} }
} }
@ -144,23 +148,15 @@ class SettingsViewModel @Inject constructor(
*/ */
fun setMonitoringInterval(intervalMs: Long) { fun setMonitoringInterval(intervalMs: Long) {
viewModelScope.launch { viewModelScope.launch {
userPreferences.setMonitoringInterval(intervalMs)
_monitoringInterval.value = intervalMs
// Restart monitoring with new interval if active // Restart monitoring with new interval if active
if (isMonitoringActive()) { if (_isMonitoringEnabled.value) {
startMonitoring() startMonitoring()
} }
userPreferences.setMonitoringInterval(intervalMs)
_monitoringInterval.value = intervalMs
} }
} }
/**
* Checks if monitoring is currently active.
*/
private fun isMonitoringActive(): Boolean {
return _isMonitoringEnabled.value
}
/** /**
* Sets the theme mode. * Sets the theme mode.
*/ */