[a11y] Ensure external keyboard Esc key closes any bottom sheet.

This commit is contained in:
Benoit Marty 2025-08-04 16:29:50 +02:00
parent a17c84568c
commit e1744e5b4e

View file

@ -23,6 +23,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
@ -54,7 +59,17 @@ fun ModalBottomSheet(
val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState
androidx.compose.material3.ModalBottomSheet( androidx.compose.material3.ModalBottomSheet(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
modifier = modifier, modifier = modifier.onKeyEvent { keyEvent ->
// It seems that on some devices, we have to handle the Escape key manually to close the bottom sheet.
// This is not the case using an emulator, but is necessary on some physical devices.
if (keyEvent.type == KeyEventType.KeyUp &&
keyEvent.key == Key.Escape) {
onDismissRequest()
true
} else {
false
}
},
sheetState = safeSheetState, sheetState = safeSheetState,
shape = shape, shape = shape,
containerColor = containerColor, containerColor = containerColor,