Skip to content

Commit 05e55c7

Browse files
committed
Fix drawer input routing desync after returning from emulator
Changed InputDispatcher to use a provider lambda instead of mutable boolean for drawer state. The provider is set synchronously in the remember block, ensuring input always routes to the correct handler.
1 parent 5f6ebd8 commit 05e55c7

3 files changed

Lines changed: 10 additions & 10 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ android {
2222
applicationId = "com.nendo.argosy"
2323
minSdk = 26
2424
targetSdk = 34
25-
versionCode = 18
26-
versionName = "0.5.11"
25+
versionCode = 19
26+
versionName = "0.5.12"
2727

2828
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2929
vectorDrawables {

app/src/main/kotlin/com/nendo/argosy/ui/ArgosyApp.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ fun ArgosyApp(
5353
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
5454
val scope = rememberCoroutineScope()
5555

56-
val inputDispatcher = remember {
56+
val inputDispatcher = remember(drawerState) {
5757
InputDispatcher(
5858
hapticManager = viewModel.hapticManager,
5959
soundManager = viewModel.soundManager
60-
)
60+
).also { it.setDrawerOpenProvider { drawerState.isOpen } }
6161
}
6262

6363
val startDestination = if (uiState.isFirstRun) {
@@ -74,12 +74,9 @@ fun ArgosyApp(
7474

7575
var isFirstDrawerEffect by remember { mutableStateOf(true) }
7676
LaunchedEffect(drawerState) {
77-
inputDispatcher.setDrawerOpen(drawerState.isOpen)
78-
7977
snapshotFlow { drawerState.isOpen }
8078
.collect { isOpen ->
8179
inputDispatcher.blockInputFor(Motion.transitionDebounceMs)
82-
inputDispatcher.setDrawerOpen(isOpen)
8380
if (isOpen) {
8481
val parentRoute = navController.previousBackStackEntry?.destination?.route
8582
viewModel.initDrawerFocus(currentRoute, parentRoute)

app/src/main/kotlin/com/nendo/argosy/ui/input/InputDispatcher.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ class InputDispatcher(
1010
) {
1111
private var activeHandler: InputHandler? = null
1212
private var drawerHandler: InputHandler? = null
13-
private var isDrawerOpen: Boolean = false
13+
private var drawerOpenProvider: (() -> Boolean)? = null
1414
private var pendingEvent: GamepadEvent? = null
1515
private var inputBlockedUntil: Long = 0L
1616

17+
private val isDrawerOpen: Boolean
18+
get() = drawerOpenProvider?.invoke() ?: false
19+
1720
fun setActiveScreen(handler: InputHandler?) {
1821
activeHandler = handler
1922
if (handler != null && !isDrawerOpen) {
@@ -34,8 +37,8 @@ class InputDispatcher(
3437
}
3538
}
3639

37-
fun setDrawerOpen(open: Boolean) {
38-
isDrawerOpen = open
40+
fun setDrawerOpenProvider(provider: () -> Boolean) {
41+
drawerOpenProvider = provider
3942
}
4043

4144
fun blockInputFor(durationMs: Long) {

0 commit comments

Comments
 (0)