diff --git a/app/src/main/java/com/droiddeck/launcher/session/GpuStatsComponent.kt b/app/src/main/java/com/droiddeck/launcher/session/GpuStatsComponent.kt index a5ddcb95d..b0c0b45b2 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/GpuStatsComponent.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/GpuStatsComponent.kt @@ -54,6 +54,7 @@ class GpuStatsComponent(val dir: File, private val root: File) : SessionPart() { } pick("temp", tempSources(), "%6d\n") { milliCelsius(it) }?.let { feeds.add(it) } refresh() + createMissing(feeds.map { it.file }) describeSources() Log.i(TAG, "hud: kgsl stats from the session's own: $sources") true @@ -354,6 +355,10 @@ class GpuStatsComponent(val dir: File, private val root: File) : SessionPart() { fun guestLoadDir(root: File) = File(root, GUEST_LOAD_DIR.removePrefix("/")) + // A feed with no value yet (the HUD hidden at start) still needs its file, or binds() leaves its node out for + // the whole session. + internal fun createMissing(files: List) = files.forEach { runCatching { it.createNewFile() } } + /** True when this app can see kgsl but none of its GPU load nodes (SELinux-blocked, e.g. the Retroid Pocket Duo). */ fun loadBlocked(): Boolean = File(KGSL).exists() && !File(GPUBUSY).canRead() && LOAD_SOURCES.none { File(it).canRead() } diff --git a/app/src/main/java/com/droiddeck/launcher/session/OverlayShown.kt b/app/src/main/java/com/droiddeck/launcher/session/OverlayShown.kt index 22f067d54..a84a35667 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/OverlayShown.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/OverlayShown.kt @@ -4,7 +4,7 @@ import java.io.File object OverlayShown { fun check(root: File): Boolean { - val config = File(root, "tmp").listFiles { f -> f.name.startsWith("mangohud.") } + val config = File(root, "tmp").listFiles { f -> f.name.startsWith("mangohud.") || f.name == "droiddeck-mangohud.conf" } ?.maxByOrNull { it.lastModified() } ?: return false return runCatching { !config.readText().contains("no_display") }.getOrDefault(false) } diff --git a/app/src/test/java/com/droiddeck/launcher/session/GpuStatsBindsTest.kt b/app/src/test/java/com/droiddeck/launcher/session/GpuStatsBindsTest.kt new file mode 100644 index 000000000..4343683f3 --- /dev/null +++ b/app/src/test/java/com/droiddeck/launcher/session/GpuStatsBindsTest.kt @@ -0,0 +1,27 @@ +package com.droiddeck.launcher.session + +import java.io.File +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class GpuStatsBindsTest { + @get:Rule val tmp = TemporaryFolder() + + @Test fun feedsWithNoValueYetAreStillBound() { + val dir = tmp.newFolder("kgsl-3d0") + GpuStatsComponent.createMissing(listOf(File(dir, "perf_now"), File(dir, "cur_freq"))) + val binds = GpuStatsComponent(dir, tmp.root).binds() + assertTrue(binds.contains(File(dir, "perf_now").path + ":" + GpuStatsComponent.MSM_LOAD)) + assertTrue(binds.contains(File(dir, "cur_freq").path + ":" + GpuStatsComponent.MSM_CLOCK)) + } + + @Test fun aWrittenValueIsKept() { + val dir = tmp.newFolder("kgsl-3d0") + File(dir, "cur_freq").writeText("586000000 \n") + GpuStatsComponent.createMissing(listOf(File(dir, "cur_freq"))) + assertEquals("586000000 \n", File(dir, "cur_freq").readText()) + } +} diff --git a/app/src/test/java/com/droiddeck/launcher/session/OverlayShownTest.kt b/app/src/test/java/com/droiddeck/launcher/session/OverlayShownTest.kt new file mode 100644 index 000000000..75675376e --- /dev/null +++ b/app/src/test/java/com/droiddeck/launcher/session/OverlayShownTest.kt @@ -0,0 +1,41 @@ +package com.droiddeck.launcher.session + +import java.io.File +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class OverlayShownTest { + @get:Rule val tmp = TemporaryFolder() + + private fun config(name: String, text: String, modified: Long) = + File(tmp.root, "tmp").apply { mkdirs() }.resolve(name).apply { writeText(text); setLastModified(modified) } + + @Test fun noConfigIsHidden() { + assertFalse(OverlayShown.check(tmp.root)) + } + + @Test fun mangohudConfigFollowsNoDisplay() { + val f = config("mangohud.abcdefgh", "no_display\n", 1_000_000L) + assertFalse(OverlayShown.check(tmp.root)) + f.writeText("preset=3\n") + assertTrue(OverlayShown.check(tmp.root)) + } + + @Test fun steamSessionConfigFollowsNoDisplay() { + val f = config("droiddeck-mangohud.conf", "no_display\n", 1_000_000L) + assertFalse(OverlayShown.check(tmp.root)) + f.writeText("preset=3\n") + assertTrue(OverlayShown.check(tmp.root)) + } + + @Test fun newestConfigWins() { + config("mangohud.abcdefgh", "no_display\n", 1_000_000L) + config("droiddeck-mangohud.conf", "preset=3\n", 2_000_000L) + assertTrue(OverlayShown.check(tmp.root)) + config("mangohud.abcdefgh", "no_display\n", 3_000_000L) + assertFalse(OverlayShown.check(tmp.root)) + } +}