Preserve replacement session Deck input routing

This commit is contained in:
Delete228 committed 2026-11-06 19:25:41 +03:00
1 parent 63004567fd
commit 7b7722bd25
4 files changed
+48 -1

No files matched your search

@@ -5115,7 +5115,7 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback {
padBridge?.setInputEnabled(false)
physicalInputBindings?.close()
padBridge?.stop()
DeckControls.setRouter(null)
DeckControls.clearRouter(inputRouter)
inputRouter = null
heldKeys.clear()
heldButtons.clear()
@@ -23,6 +23,11 @@ object DeckControls {
publish()
}
@Synchronized
fun clearRouter(owner: InputRouter?) {
if (owner != null && router === owner) setRouter(null)
}
@Synchronized
@JvmOverloads
fun source(role: InputRole, routed: Boolean = false) = Source(role, routed)
@@ -136,6 +136,41 @@ class InputSourceOwnershipTest {
} finally { surface.close() }
}
@Test fun clearingOldDeckOwnerPreservesReplacementBindingsAndHeldKeys() {
val previous = InputRouter(RecordingOutput())
val output = RecordingOutput()
val replacement = InputRouter(output).also {
it.setProfile(InputProfile.defaults(InputProfile.GAME)
.withBinding(InputRole.PHYSICAL, InputControl.L4, InputAction.Keys(listOf(57))))
}
DeckControls.setRouter(previous)
DeckControls.setRouter(replacement)
DeckControls.setGrip(DeckControls.L4, true)
DeckControls.clearRouter(previous)
DeckControls.clearRouter(null)
assertEquals(listOf("key 57 true"), output.events)
DeckControls.setGrip(DeckControls.L4, false)
DeckControls.setGrip(DeckControls.L4, true)
assertEquals(listOf("key 57 true", "key 57 false", "key 57 true"), output.events)
assertEquals(0, JoyConPadTest.RecordingWriter.grips)
}
@Test fun clearingCurrentDeckOwnerReleasesItsKeysAndRemovesBindings() {
val output = RecordingOutput()
val router = InputRouter(output).also {
it.setProfile(InputProfile.defaults(InputProfile.GAME)
.withBinding(InputRole.PHYSICAL, InputControl.L4, InputAction.Keys(listOf(57))))
}
DeckControls.setRouter(router)
DeckControls.setGrip(DeckControls.L4, true)
DeckControls.clearRouter(router)
DeckControls.clearRouter(router)
DeckControls.setGrip(DeckControls.L4, false)
DeckControls.setGrip(DeckControls.L4, true)
assertEquals(listOf("key 57 true", "key 57 false"), output.events)
assertEquals(DeckControls.L4, JoyConPadTest.RecordingWriter.grips)
}
@Test fun releasingAllKeepsPhysicalGripsBlockedUntilNeutral() {
val router = InputRouter(RecordingOutput())
bridge.setInputRouter(router)
@@ -42,6 +42,13 @@ Actual display captures and test reports are retained locally under
`app/build/reports/input-publish/`. Screenshot publication is subject to the
user's review. No new latency measurement was made for this UI revision.
The follow-up router-ownership fix passed **47 tests** in `InputSourceOwnershipTest`,
`InputSurfaceSourceTest`, and `InputRouterTest`, including two new regressions.
An obsolete activity (or one without a router) cannot detach the replacement
activity's Deck routes; the current owner still releases its held keys on cleanup.
This follow-up changes teardown only and was not reinstalled or retested on Thor,
which was no longer available over ADB after the screenshot pass.
## Input settings polish, 2026-11-06
The final input/UI host run passed **941 tests in 124 suites, zero failures**.