diff --git a/changelog.md b/changelog.md index 43904b92d..2442f41a3 100644 --- a/changelog.md +++ b/changelog.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - \[App\] Screen displayed on filter chip variant click was not the good one ([#580](https://github.com/Orange-OpenSource/ods-android/issues/580)) - \[App\] Fix a bug where `OdsListItem` text color did not update when switching between light and dark modes in text field demo ([#578](https://github.com/Orange-OpenSource/ods-android/issues/578)) - \[App\] The number of search results is now vocalized ([#506](https://github.com/Orange-OpenSource/ods-android/issues/506)) +- \[Lib\] Vocalize exposed dropdown menu content as a group ([#560](https://github.com/Orange-OpenSource/ods-android/issues/560)) ## [0.14.0](https://github.com/Orange-OpenSource/ods-android/compare/0.13.0...0.14.0) - 2023-07-12 diff --git a/lib/src/main/java/com/orange/ods/compose/component/menu/OdsExposedDropdownMenu.kt b/lib/src/main/java/com/orange/ods/compose/component/menu/OdsExposedDropdownMenu.kt index dd2072686..08708229c 100644 --- a/lib/src/main/java/com/orange/ods/compose/component/menu/OdsExposedDropdownMenu.kt +++ b/lib/src/main/java/com/orange/ods/compose/component/menu/OdsExposedDropdownMenu.kt @@ -18,6 +18,10 @@ import androidx.compose.material.ExposedDropdownMenuBox import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.stateDescription import androidx.compose.ui.tooling.preview.PreviewParameter import com.orange.ods.compose.component.OdsComposable import com.orange.ods.compose.component.textfield.OdsExposedDropdownMenuTrailing @@ -25,6 +29,7 @@ import com.orange.ods.compose.component.textfield.OdsTextField import com.orange.ods.compose.component.utilities.BasicPreviewParameterProvider import com.orange.ods.compose.component.utilities.Preview import com.orange.ods.compose.component.utilities.UiModePreviews +import com.orange.ods.compose.component.utilities.enabledStateDescription import kotlinx.parcelize.Parcelize /** @@ -50,9 +55,14 @@ fun OdsExposedDropdownMenu( enabled: Boolean = true ) { var expanded by remember { mutableStateOf(false) } + val menuBoxStateDescription = enabledStateDescription(enabled = enabled) + val menuBoxAction = if (enabled) stringResource(id = com.orange.ods.R.string.dropdown_menu_action) else "" ExposedDropdownMenuBox( - modifier = modifier, + modifier = modifier.clearAndSetSemantics { + contentDescription = "$label, ${selectedItem.value.label}, $menuBoxAction" + stateDescription = menuBoxStateDescription + }, expanded = expanded, onExpandedChange = { expanded = !expanded diff --git a/lib/src/main/java/com/orange/ods/compose/component/utilities/Accessibility.kt b/lib/src/main/java/com/orange/ods/compose/component/utilities/Accessibility.kt index 42d0baf2f..a7bfcdafb 100644 --- a/lib/src/main/java/com/orange/ods/compose/component/utilities/Accessibility.kt +++ b/lib/src/main/java/com/orange/ods/compose/component/utilities/Accessibility.kt @@ -21,4 +21,13 @@ import com.orange.ods.R */ @Composable internal fun selectionStateDescription(selected: Boolean) = - if (selected) stringResource(id = R.string.state_selected) else stringResource(id = R.string.state_not_selected) \ No newline at end of file + if (selected) stringResource(id = R.string.state_selected) else stringResource(id = R.string.state_not_selected) + +/** + * Returns the enabled/disabled state ready for vocalization according to the [enabled] provided value. + * + * @param enabled Set it to true if the element is enabled, false otherwise. + */ +@Composable +internal fun enabledStateDescription(enabled: Boolean) = + if (!enabled) stringResource(id = R.string.state_disabled) else "" \ No newline at end of file diff --git a/lib/src/main/res/values/strings.xml b/lib/src/main/res/values/strings.xml index 05bf689a1..4c252f403 100644 --- a/lib/src/main/res/values/strings.xml +++ b/lib/src/main/res/values/strings.xml @@ -9,9 +9,12 @@ --> + Disabled Selected Not selected + Double click to change selection + Show password Hide password