From 3384a6795b3f9365161fbb6c6e0a2a3211420ced Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Thu, 7 May 2026 20:21:44 +0200 Subject: [PATCH] feat: enhance TvNavigationDrawer with focus handling and accessibility improvements --- .../home/components/TvNavigationDrawer.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app-tv/src/main/java/hu/bbara/purefin/ui/screen/home/components/TvNavigationDrawer.kt b/app-tv/src/main/java/hu/bbara/purefin/ui/screen/home/components/TvNavigationDrawer.kt index d1e269af..bb45050d 100644 --- a/app-tv/src/main/java/hu/bbara/purefin/ui/screen/home/components/TvNavigationDrawer.kt +++ b/app-tv/src/main/java/hu/bbara/purefin/ui/screen/home/components/TvNavigationDrawer.kt @@ -11,11 +11,18 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.focusGroup import androidx.compose.foundation.selection.selectableGroup import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.focusProperties +import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.semantics.selected @@ -132,13 +139,18 @@ private fun androidx.tv.material3.NavigationDrawerScope.TvNavigationDrawerRail( ) { val expanded = drawerValue == DrawerValue.Open val scheme = MaterialTheme.colorScheme + var hasDrawerFocus by remember { mutableStateOf(false) } Column( modifier = Modifier .fillMaxHeight() .background(scheme.surface.copy(alpha = 0.96f)) .padding(horizontal = 12.dp, vertical = 24.dp) - .selectableGroup(), + .selectableGroup() + .focusGroup() + .onFocusChanged { state -> + hasDrawerFocus = state.isFocused + }, verticalArrangement = Arrangement.spacedBy(12.dp) ) { TvDrawerHeader( @@ -152,7 +164,8 @@ private fun androidx.tv.material3.NavigationDrawerScope.TvNavigationDrawerRail( onClick = { onDestinationSelected(destination.destination) }, modifier = Modifier .testTag("$TvDrawerItemTagPrefix$index") - .semantics { selected = isSelected }, + .semantics { selected = isSelected } + .focusProperties { canFocus = hasDrawerFocus || isSelected }, leadingContent = { Icon( imageVector = destination.icon,