diff --git a/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt b/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt index dad1d0de58..0547e9bbaf 100644 --- a/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt +++ b/examples/llama.android/app/src/main/java/com/example/llama/MainActivity.kt @@ -98,6 +98,7 @@ fun AppContent( val engineState by mainViewModel.engineState.collectAsState() // Metric states for scaffolds + val isMonitoringEnabled by settingsViewModel.isMonitoringEnabled.collectAsState() val memoryUsage by settingsViewModel.memoryUsage.collectAsState() val temperatureInfo by settingsViewModel.temperatureMetrics.collectAsState() val useFahrenheit by settingsViewModel.useFahrenheitUnit.collectAsState() @@ -251,7 +252,7 @@ fun AppContent( navigationIcon = NavigationIcon.Back { modelLoadingViewModel.onBackPressed { navigationActions.navigateUp() } }, - memoryMetrics = memoryUsage, + memoryMetrics = if (isMonitoringEnabled) memoryUsage else null, temperatureInfo = null ) ) @@ -268,8 +269,8 @@ fun AppContent( navigationIcon = NavigationIcon.Back { benchmarkViewModel.onBackPressed { navigationActions.navigateUp() } }, - memoryMetrics = memoryUsage, - temperatureInfo = Pair(temperatureInfo, useFahrenheit) + memoryMetrics = if (isMonitoringEnabled) memoryUsage else null, + temperatureInfo = if (isMonitoringEnabled) Pair(temperatureInfo, useFahrenheit) else null ), bottomBarConfig = BottomBarConfig.Benchmark( engineIdle = !engineState.isUninterruptible, @@ -314,8 +315,8 @@ fun AppContent( navigationIcon = NavigationIcon.Back { conversationViewModel.onBackPressed { navigationActions.navigateUp() } }, - memoryMetrics = memoryUsage, - temperatureInfo = Pair(temperatureInfo, useFahrenheit) + memoryMetrics = if (isMonitoringEnabled) memoryUsage else null, + temperatureInfo = if (isMonitoringEnabled) Pair(temperatureInfo, useFahrenheit) else null, ), bottomBarConfig = BottomBarConfig.Conversation( isEnabled = !modelThinkingOrSpeaking, @@ -402,7 +403,7 @@ fun AppContent( topBarConfig = TopBarConfig.Storage( title = "Models Management", navigationIcon = NavigationIcon.Back { navigationActions.navigateUp() }, - storageMetrics = storageMetrics + storageMetrics = if (isMonitoringEnabled) storageMetrics else null, ), bottomBarConfig = bottomBarConfig ) diff --git a/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/PerformanceTopBar.kt b/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/PerformanceTopBar.kt index bb074fd68d..da0d733f1b 100644 --- a/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/PerformanceTopBar.kt +++ b/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/PerformanceTopBar.kt @@ -30,7 +30,7 @@ import java.util.Locale @Composable fun PerformanceTopBar( title: String, - memoryMetrics: MemoryMetrics, + memoryMetrics: MemoryMetrics?, temperatureDisplay: Pair?, onNavigateBack: (() -> Unit)? = null, onMenuOpen: (() -> Unit)? = null, @@ -70,7 +70,9 @@ fun PerformanceTopBar( } // Memory indicator - MemoryIndicator(memoryUsage = memoryMetrics) + memoryMetrics?.let { + MemoryIndicator(memoryUsage = it) + } }, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.surface, diff --git a/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/TopBarConfig.kt b/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/TopBarConfig.kt index 9c2b18398e..043d1ae59e 100644 --- a/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/TopBarConfig.kt +++ b/examples/llama.android/app/src/main/java/com/example/llama/ui/scaffold/topbar/TopBarConfig.kt @@ -27,7 +27,7 @@ sealed class TopBarConfig { data class Performance( override val title: String, override val navigationIcon: NavigationIcon, - val memoryMetrics: MemoryMetrics, + val memoryMetrics: MemoryMetrics?, val temperatureInfo: Pair?, ) : TopBarConfig() diff --git a/examples/llama.android/app/src/main/java/com/example/llama/viewmodel/SettingsViewModel.kt b/examples/llama.android/app/src/main/java/com/example/llama/viewmodel/SettingsViewModel.kt index da3af20946..dbf566a4ae 100644 --- a/examples/llama.android/app/src/main/java/com/example/llama/viewmodel/SettingsViewModel.kt +++ b/examples/llama.android/app/src/main/java/com/example/llama/viewmodel/SettingsViewModel.kt @@ -13,6 +13,7 @@ import com.example.llama.monitoring.StorageMetrics import com.example.llama.monitoring.TemperatureMetrics import com.example.llama.monitoring.TemperatureWarningLevel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -87,30 +88,34 @@ class SettingsViewModel @Inject constructor( /** * Starts monitoring device performance. */ + private var monitoringJob: Job? = null private fun startMonitoring() { val interval = _monitoringInterval.value + monitoringJob?.cancel() viewModelScope.launch { - modelRepository.getStorageMetrics().collect { metrics -> - _storageMetrics.value = metrics + launch { + modelRepository.getStorageMetrics().collect { metrics -> + _storageMetrics.value = metrics + } } - } - viewModelScope.launch { - performanceMonitor.monitorMemoryUsage(interval).collect { metrics -> - _memoryUsage.value = metrics + launch { + performanceMonitor.monitorMemoryUsage(interval).collect { metrics -> + _memoryUsage.value = metrics + } } - } - viewModelScope.launch { - performanceMonitor.monitorBattery(interval * 2).collect { metrics -> - _batteryInfo.value = metrics + launch { + performanceMonitor.monitorBattery(interval * 2).collect { metrics -> + _batteryInfo.value = metrics + } } - } - viewModelScope.launch { - performanceMonitor.monitorTemperature(interval * 2).collect { metrics -> - _temperatureMetrics.value = metrics + launch { + performanceMonitor.monitorTemperature(interval * 2).collect { metrics -> + _temperatureMetrics.value = metrics + } } } } @@ -120,12 +125,11 @@ class SettingsViewModel @Inject constructor( */ fun setMonitoringEnabled(enabled: Boolean) { viewModelScope.launch { - userPreferences.setPerformanceMonitoringEnabled(enabled) - _isMonitoringEnabled.value = enabled - - if (enabled && !isMonitoringActive()) { + if (enabled && !_isMonitoringEnabled.value) { startMonitoring() } + _isMonitoringEnabled.value = enabled + userPreferences.setPerformanceMonitoringEnabled(enabled) } } @@ -144,23 +148,15 @@ class SettingsViewModel @Inject constructor( */ fun setMonitoringInterval(intervalMs: Long) { viewModelScope.launch { - userPreferences.setMonitoringInterval(intervalMs) - _monitoringInterval.value = intervalMs - // Restart monitoring with new interval if active - if (isMonitoringActive()) { + if (_isMonitoringEnabled.value) { startMonitoring() } + userPreferences.setMonitoringInterval(intervalMs) + _monitoringInterval.value = intervalMs } } - /** - * Checks if monitoring is currently active. - */ - private fun isMonitoringActive(): Boolean { - return _isMonitoringEnabled.value - } - /** * Sets the theme mode. */