Skip to content

Commit e1744e5

Browse files
committed
[a11y] Ensure external keyboard Esc key closes any bottom sheet.
1 parent a17c845 commit e1744e5

File tree

1 file changed

+16
-1
lines changed
  • libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components

1 file changed

+16
-1
lines changed

libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ModalBottomSheet.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ import androidx.compose.runtime.Composable
2323
import androidx.compose.ui.Modifier
2424
import androidx.compose.ui.graphics.Color
2525
import androidx.compose.ui.graphics.Shape
26+
import androidx.compose.ui.input.key.Key
27+
import androidx.compose.ui.input.key.KeyEventType
28+
import androidx.compose.ui.input.key.key
29+
import androidx.compose.ui.input.key.onKeyEvent
30+
import androidx.compose.ui.input.key.type
2631
import androidx.compose.ui.platform.LocalInspectionMode
2732
import androidx.compose.ui.tooling.preview.Preview
2833
import androidx.compose.ui.unit.Dp
@@ -54,7 +59,17 @@ fun ModalBottomSheet(
5459
val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState
5560
androidx.compose.material3.ModalBottomSheet(
5661
onDismissRequest = onDismissRequest,
57-
modifier = modifier,
62+
modifier = modifier.onKeyEvent { keyEvent ->
63+
// It seems that on some devices, we have to handle the Escape key manually to close the bottom sheet.
64+
// This is not the case using an emulator, but is necessary on some physical devices.
65+
if (keyEvent.type == KeyEventType.KeyUp &&
66+
keyEvent.key == Key.Escape) {
67+
onDismissRequest()
68+
true
69+
} else {
70+
false
71+
}
72+
},
5873
sheetState = safeSheetState,
5974
shape = shape,
6075
containerColor = containerColor,

0 commit comments

Comments
 (0)