From c25d54acedcd0db899ce569751a9adfc76156e6a Mon Sep 17 00:00:00 2001 From: maxjivi05 Date: Mon, 26 Oct 2026 23:51:58 -0400 Subject: [PATCH] fix: leave published component choices alone when state.json cannot be read --- .../droiddeck/launcher/session/ComponentsManager.kt | 3 +++ .../launcher/session/ComponentsRepublishTest.kt | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/src/main/java/com/droiddeck/launcher/session/ComponentsManager.kt b/app/src/main/java/com/droiddeck/launcher/session/ComponentsManager.kt index ed271021d..8b7ad50f0 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/ComponentsManager.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/ComponentsManager.kt @@ -175,6 +175,9 @@ object ComponentsManager { } fun republish(context: Context): Boolean = synchronized(lock) { + recoverState(context) + val saved = stateFile(context) + if (saved.exists() && runCatching { JSONObject(saved.readText()) }.isFailure) return false val state = loadState(context) val prepared = prepareLaunchState(context, state) if ((FileUtils.readString(File(launchDir(context), "desired.tsv")) ?: "") == prepared.text) return false diff --git a/app/src/test/java/com/droiddeck/launcher/session/ComponentsRepublishTest.kt b/app/src/test/java/com/droiddeck/launcher/session/ComponentsRepublishTest.kt index 5d0ba33c6..74978ee30 100644 --- a/app/src/test/java/com/droiddeck/launcher/session/ComponentsRepublishTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/session/ComponentsRepublishTest.kt @@ -60,6 +60,19 @@ class ComponentsRepublishTest { assertEquals(modified, launchState().lastModified()) } + @Test fun anUnreadableStateLeavesThePublishedSelectionsAlone() { + proton("DroidDeck-Proton 11-11.7", "DroidDeck-Proton-11-11.7") + packageFile() + ComponentsManager.setGameComponent(context, scope, "fex", fex) + val published = launchState().readText() + val state = File(context.filesDir, "components/state.json").apply { writeText("{\"active\": ") } + proton("DroidDeck-Proton 11-11.8", "DroidDeck-Proton-11-11.8") + + assertFalse(ComponentsManager.republish(context)) + assertEquals(published, launchState().readText()) + assertEquals("{\"active\": ", state.readText()) + } + @Test fun withNoSelectionsNothingIsPublished() { proton("DroidDeck-Proton 11-11.8", "DroidDeck-Proton-11-11.8")