From 1788e0e42b49f5de3fb1183d3e5413fbdb8477c8 Mon Sep 17 00:00:00 2001 From: Joshua Tam <297250+joshuatam@users.noreply.github.com> Date: Thu, 21 May 2026 11:18:02 +0800 Subject: [PATCH 1/2] fix: Pause and resume PerformanceHudView with lifecycle Integrates the PerformanceHudView with the screen's lifecycle to automatically pause its updates when the screen is in the background (ON_PAUSE) and resume them when it returns to the foreground (ON_RESUME). This change conserves resources and prevents unnecessary activity when the application is not actively displayed. --- .../ui/screen/xserver/XServerScreen.kt | 25 +++++++++++++++++++ .../ui/widget/PerformanceHudView.kt | 21 +++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt b/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt index d21f5d4240..cb5004434b 100644 --- a/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt +++ b/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt @@ -1468,6 +1468,31 @@ fun XServerScreen( } } + DisposableEffect(lifecycleOwner, performanceHudView) { + val hud = performanceHudView + if (hud != null) { + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_PAUSE -> { + Timber.d("Pausing PerformanceHudView for lifecycle event: $event") + hud.pause() + } + Lifecycle.Event.ON_RESUME -> { + Timber.d("Resuming PerformanceHudView for lifecycle event: $event") + hud.resume() + } + else -> Unit + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + } + } else { + onDispose { } + } + } + val isPortrait = container.isPortraitMode // var launchedView by rememberSaveable { mutableStateOf(false) } Box(modifier = Modifier.fillMaxSize()) { diff --git a/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt b/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt index 6ece60af99..3ef2f42c00 100644 --- a/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt +++ b/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt @@ -61,6 +61,7 @@ class PerformanceHudView( private var attachedMetricSignature: List = emptyList() private var appearance = appearanceFor(initialConfig.size) private var smoothedBatteryRuntimeHours: Double? = null + private var isPaused = false private val backgroundDrawable = GradientDrawable().apply { shape = GradientDrawable.RECTANGLE @@ -166,9 +167,23 @@ class PerformanceHudView( refreshVisibleMetrics() } + fun pause() { + isPaused = true + stopUpdates() + } + + fun resume() { + isPaused = false + if (isAttachedToWindow) { + startUpdates() + } + } + override fun onAttachedToWindow() { super.onAttachedToWindow() - startUpdates() + if (!isPaused) { + startUpdates() + } } override fun onDetachedFromWindow() { @@ -678,7 +693,7 @@ class PerformanceHudView( discoverPrioritizedCpuTempPaths(), ) if (reading != null) { - Timber.v("[HUD] CPU temp: %d°C from %s", reading.celsius, reading.source) + Timber.d("[HUD] CPU temp: %d°C from %s", reading.celsius, reading.source) } return reading?.celsius } @@ -690,7 +705,7 @@ class PerformanceHudView( ) + discoverPrioritizedGpuTempPaths() val reading = readTemperatureCWithSource(paths) if (reading != null) { - Timber.v("[HUD] GPU temp: %d°C from %s", reading.celsius, reading.source) + Timber.d("[HUD] GPU temp: %d°C from %s", reading.celsius, reading.source) } return reading?.celsius } From a54c8cd22b17c48045f48048b0cc7529090fe7ea Mon Sep 17 00:00:00 2001 From: Joshua Tam <297250+joshuatam@users.noreply.github.com> Date: Thu, 21 May 2026 11:34:07 +0800 Subject: [PATCH 2/2] ai comments --- .../gamenative/ui/screen/xserver/XServerScreen.kt | 6 ++++++ .../app/gamenative/ui/widget/PerformanceHudView.kt | 14 +++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt b/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt index cb5004434b..eac67e74ec 100644 --- a/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt +++ b/app/src/main/java/app/gamenative/ui/screen/xserver/XServerScreen.kt @@ -1471,6 +1471,12 @@ fun XServerScreen( DisposableEffect(lifecycleOwner, performanceHudView) { val hud = performanceHudView if (hud != null) { + if (lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { + hud.resume() + } else { + hud.pause() + } + val observer = LifecycleEventObserver { _, event -> when (event) { Lifecycle.Event.ON_PAUSE -> { diff --git a/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt b/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt index 3ef2f42c00..6570b0804d 100644 --- a/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt +++ b/app/src/main/java/app/gamenative/ui/widget/PerformanceHudView.kt @@ -168,14 +168,18 @@ class PerformanceHudView( } fun pause() { - isPaused = true - stopUpdates() + if (!isPaused) { + isPaused = true + stopUpdates() + } } fun resume() { - isPaused = false - if (isAttachedToWindow) { - startUpdates() + if (isPaused) { + isPaused = false + if (isAttachedToWindow) { + startUpdates() + } } }