[a11y] Add click action to the message bottom sheet handle (#5228)
This commit is contained in:
parent
c4555bc76a
commit
f5b5bb39ba
3 changed files with 38 additions and 4 deletions
|
|
@ -39,7 +39,10 @@ import androidx.compose.ui.draw.shadow
|
||||||
import androidx.compose.ui.graphics.RectangleShape
|
import androidx.compose.ui.graphics.RectangleShape
|
||||||
import androidx.compose.ui.platform.LocalView
|
import androidx.compose.ui.platform.LocalView
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.semantics.Role
|
||||||
import androidx.compose.ui.semantics.heading
|
import androidx.compose.ui.semantics.heading
|
||||||
|
import androidx.compose.ui.semantics.onClick
|
||||||
|
import androidx.compose.ui.semantics.role
|
||||||
import androidx.compose.ui.semantics.semantics
|
import androidx.compose.ui.semantics.semantics
|
||||||
import androidx.compose.ui.text.font.FontStyle
|
import androidx.compose.ui.text.font.FontStyle
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
|
@ -81,6 +84,7 @@ import io.element.android.features.roomcall.api.RoomCallState
|
||||||
import io.element.android.libraries.androidutils.ui.hideKeyboard
|
import io.element.android.libraries.androidutils.ui.hideKeyboard
|
||||||
import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule
|
import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule
|
||||||
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayout
|
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayout
|
||||||
|
import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayoutState
|
||||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarType
|
import io.element.android.libraries.designsystem.components.avatar.AvatarType
|
||||||
|
|
@ -288,7 +292,25 @@ fun MessagesView(
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
sheetDragHandle = if (state.composerState.showTextFormatting) {
|
sheetDragHandle = if (state.composerState.showTextFormatting) {
|
||||||
@Composable { BottomSheetDragHandle() }
|
@Composable { toggleAction ->
|
||||||
|
val expandA11yLabel = stringResource(CommonStrings.a11y_expand_message_text_field)
|
||||||
|
val collapseA11yLabel = stringResource(CommonStrings.a11y_collapse_message_text_field)
|
||||||
|
BottomSheetDragHandle(
|
||||||
|
modifier = Modifier.semantics {
|
||||||
|
role = Role.Button
|
||||||
|
|
||||||
|
// Accessibility action to toggle the bottom sheet state
|
||||||
|
val label = when (expandableState.position) {
|
||||||
|
ExpandableBottomSheetLayoutState.Position.COLLAPSED, ExpandableBottomSheetLayoutState.Position.DRAGGING -> expandA11yLabel
|
||||||
|
ExpandableBottomSheetLayoutState.Position.EXPANDED -> collapseA11yLabel
|
||||||
|
}
|
||||||
|
onClick(label) {
|
||||||
|
toggleAction()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
@Composable {}
|
@Composable {}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ import kotlin.math.roundToInt
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ExpandableBottomSheetLayout(
|
fun ExpandableBottomSheetLayout(
|
||||||
sheetDragHandle: @Composable BoxScope.() -> Unit,
|
sheetDragHandle: @Composable BoxScope.(toggleAction: () -> Unit) -> Unit,
|
||||||
bottomSheetContent: @Composable ColumnScope.() -> Unit,
|
bottomSheetContent: @Composable ColumnScope.() -> Unit,
|
||||||
state: ExpandableBottomSheetLayoutState,
|
state: ExpandableBottomSheetLayoutState,
|
||||||
maxBottomSheetContentHeight: Dp,
|
maxBottomSheetContentHeight: Dp,
|
||||||
|
|
@ -152,7 +152,19 @@ fun ExpandableBottomSheetLayout(
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
Box(Modifier.fillMaxWidth()) {
|
Box(Modifier.fillMaxWidth()) {
|
||||||
sheetDragHandle()
|
sheetDragHandle {
|
||||||
|
coroutineScope.launch {
|
||||||
|
val destination = if (state.position == ExpandableBottomSheetLayoutState.Position.EXPANDED) {
|
||||||
|
state.internalPosition = ExpandableBottomSheetLayoutState.Position.COLLAPSED
|
||||||
|
minBottomContentHeightPx.toFloat()
|
||||||
|
} else {
|
||||||
|
state.internalPosition = ExpandableBottomSheetLayoutState.Position.EXPANDED
|
||||||
|
calculatedMaxBottomContentHeightPx.toFloat()
|
||||||
|
}
|
||||||
|
animatable.snapTo(currentBottomContentHeightPx.toFloat())
|
||||||
|
animatable.animateTo(destination)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bottomSheetContent()
|
bottomSheetContent()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ class ExpandableBottomSheetLayoutState {
|
||||||
/**
|
/**
|
||||||
* The current position of the bottom sheet layout.
|
* The current position of the bottom sheet layout.
|
||||||
*/
|
*/
|
||||||
val position = internalPosition
|
val position get() = internalPosition
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The percentage of the bottom sheet layout that is currently being dragged.
|
* The percentage of the bottom sheet layout that is currently being dragged.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue