diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index be6ab571f78..ce574928f6f 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -576,13 +576,13 @@ public final class io/getstream/chat/android/compose/ui/attachments/preview/Comp public static final field INSTANCE Lio/getstream/chat/android/compose/ui/attachments/preview/ComposableSingletons$MediaGalleryPreviewScreenKt; public fun ()V public final fun getLambda$-1186868066$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function7; + public final fun getLambda$-1317756983$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1613254346$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-177774698$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$-1899518912$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-2102393707$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-210669840$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-244397814$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$-49086904$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$-357715190$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-52298206$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-563857596$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-822354111$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; @@ -591,10 +591,10 @@ public final class io/getstream/chat/android/compose/ui/attachments/preview/Comp public final fun getLambda$1327866271$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1331114327$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1375691933$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$1465472073$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1549246429$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1672511429$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1672603643$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$1711218079$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1880503530$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1902056283$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$19148184$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; @@ -763,14 +763,14 @@ public final class io/getstream/chat/android/compose/ui/channel/info/ComposableS public fun ()V public final fun getLambda$-1114359326$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1207226509$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$-1284495299$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1330176946$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$-1754400971$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-2125016004$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$-572168236$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1139087319$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1302953779$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; public final fun getLambda$2046556554$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$217368988$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$756179806$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } public final class io/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$ChannelInfoMemberInfoModalSheetKt { @@ -820,10 +820,10 @@ public final class io/getstream/chat/android/compose/ui/channel/info/ComposableS public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelEditScreenKt; public fun ()V public final fun getLambda$-1290011797$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$-1600862874$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1839460112$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1996460951$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-949819074$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$-952635417$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1273794324$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1411993017$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1947836857$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; @@ -870,9 +870,9 @@ public final class io/getstream/chat/android/compose/ui/channels/header/Composab public final fun getLambda$-1782552518$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-39363265$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-903354658$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$1125356903$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1371852185$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$318691263$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$423422310$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$621281156$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } @@ -1400,7 +1400,7 @@ public final class io/getstream/chat/android/compose/ui/components/messageaction public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/messageactions/ComposableSingletons$MessageActionsHeaderKt; public fun ()V public final fun getLambda$-1164493217$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$1304549080$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$746565017$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } public final class io/getstream/chat/android/compose/ui/components/messageactions/ComposableSingletons$MessageActionsKt { @@ -1614,8 +1614,8 @@ public final class io/getstream/chat/android/compose/ui/components/moderatedmess public final class io/getstream/chat/android/compose/ui/components/poll/ComposableSingletons$PollAnswersKt { public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/poll/ComposableSingletons$PollAnswersKt; public fun ()V - public final fun getLambda$-1411166830$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1780669891$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$-1805570669$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-1980307438$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; public final fun getLambda$-232122758$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-49181804$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; @@ -1877,7 +1877,6 @@ public final class io/getstream/chat/android/compose/ui/messages/attachments/pol public static final field INSTANCE Lio/getstream/chat/android/compose/ui/messages/attachments/poll/ComposableSingletons$PollCreationHeaderKt; public fun ()V public final fun getLambda$1291237378$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$1775632701$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$226546083$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } @@ -1902,7 +1901,7 @@ public final class io/getstream/chat/android/compose/ui/messages/attachments/pol } public final class io/getstream/chat/android/compose/ui/messages/attachments/poll/CreatePollScreenKt { - public static final fun CreatePollScreen (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V + public static final fun CreatePollScreen (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/chat/android/compose/ui/messages/attachments/poll/PollCreationDiscardDialogKt { @@ -1910,7 +1909,7 @@ public final class io/getstream/chat/android/compose/ui/messages/attachments/pol } public final class io/getstream/chat/android/compose/ui/messages/attachments/poll/PollCreationHeaderKt { - public static final fun PollCreationHeader (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V + public static final fun PollCreationHeader (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionDuplicated : io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionError { @@ -2028,11 +2027,11 @@ public final class io/getstream/chat/android/compose/ui/messages/composer/intern public static final field INSTANCE Lio/getstream/chat/android/compose/ui/messages/composer/internal/ComposableSingletons$AudioRecordingContentKt; public fun ()V public final fun getLambda$-129303699$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$-1855012696$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-2139230466$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$-630641788$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$491551885$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$-744252283$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$2045550761$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$545156019$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$549534158$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } public final class io/getstream/chat/android/compose/ui/messages/composer/internal/ComposableSingletons$MessageComposerEditIndicatorKt { @@ -3781,7 +3780,7 @@ public final class io/getstream/chat/android/compose/ui/theme/ComposableSingleto public static final field INSTANCE Lio/getstream/chat/android/compose/ui/theme/ComposableSingletons$ChatComponentFactoryKt; public fun ()V public final fun getLambda$-845861723$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$1812629511$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$1301617352$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$69070923$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt index b54935d70e1..7de6a8e1cb7 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButton.kt @@ -83,6 +83,7 @@ internal fun StreamButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, + onClickLabel: String? = null, style: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, size: StreamButtonSize = StreamButtonSize.Medium, content: @Composable () -> Unit, @@ -95,6 +96,7 @@ internal fun StreamButton( .ifNotNull(style.borderColor(enabled)) { border(1.dp, it, CircleShape) } .clickable( onClick = onClick, + onClickLabel = onClickLabel, enabled = enabled, role = Role.Button, interactionSource = remember(::MutableInteractionSource), diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollOptionInput.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollOptionInput.kt index f67046f43bc..b574c0dcff8 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollOptionInput.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollOptionInput.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.hideFromAccessibility import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.TextStyle @@ -127,6 +128,7 @@ public fun PollOptionInput( if (value.isBlank()) { Text( text = description, + modifier = Modifier.semantics { hideFromAccessibility() }, style = typography.bodyDefault, color = colors.inputTextPlaceholder, ) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/CreatePollScreen.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/CreatePollScreen.kt index ce9c2c26b7e..d020baa7b17 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/CreatePollScreen.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/CreatePollScreen.kt @@ -52,12 +52,14 @@ import io.getstream.chat.android.models.CreatePollParams * @param onBack Called when the user navigates back from the poll creation screen * (via back press or discard). Resets the ViewModel state. * @param onCreatePoll Called when the user submits a new poll configuration. + * @param onCreatePollLabel Semantic / accessibility label for the poll creation button that triggers [onCreatePoll]. */ @Suppress("LongMethod") @Composable public fun CreatePollScreen( onBack: () -> Unit, onCreatePoll: (CreatePollParams) -> Unit, + onCreatePollLabel: String? = null, ) { val viewModel: CreatePollViewModel = viewModel( factory = CreatePollViewModelFactory(ChatTheme.config.polls), @@ -88,6 +90,7 @@ public fun CreatePollScreen( PollCreationHeader( modifier = Modifier.fillMaxWidth(), enabledCreation = state.isCreationEnabled, + onPollCreateClickedLabel = onCreatePollLabel, onPollCreateClicked = { onCreatePoll( createPollParamsFrom( diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollCreationHeader.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollCreationHeader.kt index 2d243c09013..ca5c1aaa540 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollCreationHeader.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollCreationHeader.kt @@ -50,6 +50,7 @@ import io.getstream.chat.android.compose.ui.theme.ChatTheme * @param onBackPressed A lambda that will be executed if users click the back button on the default [leadingContent]. * @param enabledCreation Represents if user can click the creation button or not. * @param onPollCreateClicked A lambda that will be executed if users click the poll creation button. + * @param onPollCreateClickedLabel Semantic / accessibility label for [onPollCreateClicked]. * @param leadingContent Customizable composable function that represents the leading content of a poll creation item, usually * holding a back action button. * @param centerContent Customizable composable function that represents the center content of a poll creation item, usually @@ -63,6 +64,7 @@ public fun PollCreationHeader( onBackPressed: () -> Unit = {}, enabledCreation: Boolean, onPollCreateClicked: () -> Unit, + onPollCreateClickedLabel: String? = null, leadingContent: @Composable (RowScope.() -> Unit)? = null, centerContent: @Composable (RowScope.() -> Unit)? = null, trailingContent: @Composable (RowScope.() -> Unit)? = null, @@ -86,7 +88,8 @@ public fun PollCreationHeader( trailingContent?.invoke(this) ?: DefaultPollOptionsHeaderTrailingContent( enabled = enabledCreation, - onPollCreateClicked = onPollCreateClicked, + onPollCreateClick = onPollCreateClicked, + onPollCreateClickLabel = onPollCreateClickedLabel, ) } } @@ -118,18 +121,21 @@ internal fun DefaultPollOptionsHeaderCenterContent(modifier: Modifier, title: St } @Composable -internal fun DefaultPollOptionsHeaderTrailingContent( +private fun DefaultPollOptionsHeaderTrailingContent( enabled: Boolean, - onPollCreateClicked: () -> Unit, + onPollCreateClick: () -> Unit, + onPollCreateClickLabel: String? = null, ) { + val onClickLabel = onPollCreateClickLabel ?: stringResource(R.string.stream_compose_poll_create_action) StreamButton( - onClick = onPollCreateClicked, + onClick = onPollCreateClick, enabled = enabled, + onClickLabel = onClickLabel, style = StreamButtonStyleDefaults.primarySolid, ) { Icon( painter = painterResource(R.drawable.stream_design_ic_checkmark), - contentDescription = stringResource(R.string.stream_compose_poll_title), + contentDescription = onClickLabel, ) } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionList.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionList.kt index 2da1fd6d774..af94544276d 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionList.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionList.kt @@ -44,6 +44,12 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.CustomAccessibilityAction +import androidx.compose.ui.semantics.LiveRegionMode +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.customActions +import androidx.compose.ui.semantics.liveRegion +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.getstream.chat.android.compose.R @@ -72,6 +78,10 @@ public fun PollOptionList( val context = LocalContext.current val colors = ChatTheme.colors var optionItemList by remember(optionItems) { mutableStateOf(optionItems) } + val move: (Int, Int) -> Unit = { from, to -> + optionItemList = optionItemList.moveItem(from, to) + onQuestionsChanged(optionItemList) + } Column( modifier = modifier @@ -88,17 +98,13 @@ public fun PollOptionList( ReorderableColumn( list = optionItemList, - onSettle = { fromIndex, toIndex -> - optionItemList = optionItemList.toMutableList().apply { - add(toIndex, removeAt(fromIndex)) - } - onQuestionsChanged(optionItemList) - }, + onSettle = move, verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), ) { index, item, _ -> key(item.key) { PollOptionRow( item = item, + index = index, onTitleChange = { newTitle -> optionItemList = optionItemList.updateOnTitleChange(context, index, newTitle) onQuestionsChanged.invoke(optionItemList) @@ -107,6 +113,10 @@ public fun PollOptionList( optionItemList = optionItemList.toMutableList().apply { removeAt(index) } onQuestionsChanged(optionItemList) }, + moves = PollOptionMoves( + up = index.takeIf { it > 0 }?.let { i -> { move(i, i - 1) } }, + down = index.takeIf { it < optionItemList.lastIndex }?.let { i -> { move(i, i + 1) } }, + ), ) } } @@ -127,10 +137,17 @@ public fun PollOptionList( @Composable private fun ReorderableScope.PollOptionRow( item: PollOptionItem, + index: Int, onTitleChange: (String) -> Unit, onRemove: () -> Unit, + moves: PollOptionMoves, ) { val colors = ChatTheme.colors + val displayName = item.title.ifBlank { (index + 1).toString() } + val moveActions = listOfNotNull( + moves.up.toMoveAction(stringResource(R.string.stream_compose_poll_option_move_up)), + moves.down.toMoveAction(stringResource(R.string.stream_compose_poll_option_move_down)), + ) Column( modifier = Modifier .fillMaxWidth() @@ -141,16 +158,20 @@ private fun ReorderableScope.PollOptionRow( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { + val reorderLabel = stringResource(R.string.stream_compose_poll_option_reorder, displayName) Box( modifier = Modifier + .semantics(mergeDescendants = true) { + contentDescription = reorderLabel + customActions = moveActions + } .draggableHandle() .minimumInteractiveComponentSize(), ) { Icon( painter = painterResource(id = R.drawable.stream_design_ic_reorder), - contentDescription = stringResource(R.string.stream_compose_poll_option_reorder), + contentDescription = null, tint = colors.inputTextIcon, - modifier = Modifier.size(20.dp), ) } @@ -164,7 +185,7 @@ private fun ReorderableScope.PollOptionRow( IconButton(onClick = onRemove) { Icon( painter = painterResource(R.drawable.stream_design_ic_minus_circle), - contentDescription = stringResource(R.string.stream_compose_poll_option_remove), + contentDescription = stringResource(R.string.stream_compose_poll_option_remove, displayName), tint = colors.inputTextIcon, modifier = Modifier.size(20.dp), ) @@ -187,7 +208,8 @@ private fun PollOptionErrorRow(pollOptionError: PollOptionError) { start = StreamTokens.spacingMd, end = StreamTokens.spacingMd, bottom = StreamTokens.spacingSm, - ), + ) + .semantics(mergeDescendants = true) { liveRegion = LiveRegionMode.Polite }, horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), verticalAlignment = Alignment.CenterVertically, ) { @@ -236,6 +258,22 @@ private fun AddPollOptionButton(onClick: () -> Unit) { internal val PollInputMinHeight @Composable get() = LocalMinimumInteractiveComponentSize.current internal val PollInputShape = RoundedCornerShape(StreamTokens.radiusLg) +private fun List.moveItem(fromIndex: Int, toIndex: Int): List = + toMutableList().apply { add(toIndex, removeAt(fromIndex)) } + +private fun (() -> Unit)?.toMoveAction(label: String): CustomAccessibilityAction? = + this?.let { invoke -> + CustomAccessibilityAction(label) { + invoke() + true + } + } + +private data class PollOptionMoves( + val up: (() -> Unit)?, + val down: (() -> Unit)?, +) + private fun List.updateOnTitleChange( context: Context, affectedIndex: Int, diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollSwitchList.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollSwitchList.kt index 3c52cc9d025..a4de2809193 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollSwitchList.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollSwitchList.kt @@ -23,16 +23,19 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon +import androidx.compose.material3.LocalMinimumInteractiveComponentSize import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -43,7 +46,9 @@ import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.hideFromAccessibility import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign @@ -167,7 +172,15 @@ private fun PollSwitchHeader( onCheckedChange: (Boolean) -> Unit, ) { Row( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minHeight = LocalMinimumInteractiveComponentSize.current) + .toggleable( + value = enabled, + role = Role.Switch, + onValueChange = onCheckedChange, + ) + .semantics(mergeDescendants = true) {}, verticalAlignment = Alignment.CenterVertically, ) { Column( @@ -189,8 +202,9 @@ private fun PollSwitchHeader( } StreamSwitch( + modifier = Modifier.semantics { hideFromAccessibility() }, checked = enabled, - onCheckedChange = onCheckedChange, + onCheckedChange = null, ) } } @@ -209,7 +223,15 @@ private fun LimitVotesPerPerson( .padding(top = StreamTokens.spacingMd), ) { Row( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minHeight = LocalMinimumInteractiveComponentSize.current) + .toggleable( + value = enabled, + role = Role.Switch, + onValueChange = onCheckedChange, + ) + .semantics(mergeDescendants = true) {}, verticalAlignment = Alignment.CenterVertically, ) { Column( @@ -229,8 +251,9 @@ private fun LimitVotesPerPerson( } StreamSwitch( + modifier = Modifier.semantics { hideFromAccessibility() }, checked = enabled, - onCheckedChange = onCheckedChange, + onCheckedChange = null, ) } diff --git a/stream-chat-android-compose/src/main/res/values-es/strings.xml b/stream-chat-android-compose/src/main/res/values-es/strings.xml index c5d3e361ee7..1886dc45ce4 100644 --- a/stream-chat-android-compose/src/main/res/values-es/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-es/strings.xml @@ -182,8 +182,10 @@ "Elegir entre 2\u201310 opciones" "Aumentar votos por persona" "Votos por persona" - "Eliminar opción de la encuesta" - "Reordenar opción de la encuesta" + "Eliminar opción %s" + "Mover abajo" + "Mover arriba" + "Reordenar opción %s" "Se produjo un error al cargar los resultados de la opción de la encuesta. Inténtalo de nuevo más tarde." "Añadir un comentario" "Permitir que otros añadan comentarios" @@ -200,6 +202,7 @@ "Pregunta" "Resultados de la encuesta" "Sugerir opción" + "crear encuesta" "Crear encuesta" "Ver todo" "Ver resultados" diff --git a/stream-chat-android-compose/src/main/res/values-fr/strings.xml b/stream-chat-android-compose/src/main/res/values-fr/strings.xml index e7f26ca07ab..9d8a4b633c2 100644 --- a/stream-chat-android-compose/src/main/res/values-fr/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-fr/strings.xml @@ -182,8 +182,10 @@ "Choisir entre 2\u201310 options" "Augmenter les votes par personne" "Votes par personne" - "Supprimer l\'option du sondage" - "Réorganiser l\'option du sondage" + "Supprimer l\'option %s" + "Déplacer vers le bas" + "Déplacer vers le haut" + "Réorganiser l\'option %s" "Une erreur est survenue lors du chargement des résultats de l\'option du sondage. Veuillez réessayer plus tard." "Ajouter un commentaire" "Permettre aux autres d\'ajouter des commentaires" @@ -200,6 +202,7 @@ "Question" "Résultats du sondage" "Suggérer une option" + "créer un sondage" "Créer un sondage" "Tout voir" "Voir les résultats" diff --git a/stream-chat-android-compose/src/main/res/values-hi/strings.xml b/stream-chat-android-compose/src/main/res/values-hi/strings.xml index 9e888c81e6e..4dc1ebae246 100644 --- a/stream-chat-android-compose/src/main/res/values-hi/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-hi/strings.xml @@ -240,8 +240,10 @@ "2\u201310 विकल्पों में से चुनें" "प्रति व्यक्ति वोट बढ़ाएँ" "प्रति व्यक्ति वोट" - "पोल विकल्प हटाएँ" - "पोल विकल्प क्रम बदलें" + "विकल्प %s हटाएँ" + "नीचे ले जाएँ" + "ऊपर ले जाएँ" + "विकल्प %s का क्रम बदलें" "टिप्पणी जोड़ें" "दूसरों को टिप्पणी जोड़ने दें" "गुमनाम पोल" @@ -260,6 +262,7 @@ "प्रश्न" "पोल परिणाम" "विकल्प सुझाएँ" + "पोल बनाएँ" "पोल बनाएँ" "सभी देखें" "परिणाम देखें" diff --git a/stream-chat-android-compose/src/main/res/values-in/strings.xml b/stream-chat-android-compose/src/main/res/values-in/strings.xml index 343bb2a008b..f82ba6cdffd 100644 --- a/stream-chat-android-compose/src/main/res/values-in/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-in/strings.xml @@ -182,8 +182,10 @@ "Pilih antara 2\u201310 opsi" "Tambah suara per orang" "Suara per orang" - "Hapus opsi polling" - "Urutkan ulang opsi polling" + "Hapus opsi %s" + "Pindahkan ke bawah" + "Pindahkan ke atas" + "Urutkan ulang opsi %s" "Terjadi kesalahan saat memuat hasil opsi polling. Silakan coba lagi nanti." "Tambahkan komentar" "Izinkan orang lain menambahkan komentar" @@ -200,6 +202,7 @@ "Pertanyaan" "Hasil Polling" "Sarankan Opsi" + "buat polling" "Buat Polling" "Lihat semua" "Lihat Hasil" diff --git a/stream-chat-android-compose/src/main/res/values-it/strings.xml b/stream-chat-android-compose/src/main/res/values-it/strings.xml index 74cca0d7c83..6f8598cd318 100644 --- a/stream-chat-android-compose/src/main/res/values-it/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-it/strings.xml @@ -240,8 +240,10 @@ "Scegli tra 2\u201310 opzioni" "Aumenta voti per persona" "Voti per persona" - "Rimuovi opzione sondaggio" - "Riordina opzione sondaggio" + "Rimuovi opzione %s" + "Sposta giù" + "Sposta su" + "Riordina opzione %s" "Aggiungi un commento" "Permetti ad altri di aggiungere commenti" "Sondaggio anonimo" @@ -260,6 +262,7 @@ "Domanda" "Risultati sondaggio" "Suggerisci opzione" + "crea sondaggio" "Crea sondaggio" "Vedi tutti" "Vedi risultati" diff --git a/stream-chat-android-compose/src/main/res/values-ja/strings.xml b/stream-chat-android-compose/src/main/res/values-ja/strings.xml index 3ff7c7a1cf0..cba2a6b25fb 100644 --- a/stream-chat-android-compose/src/main/res/values-ja/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-ja/strings.xml @@ -203,8 +203,10 @@ "2〜10の選択肢から選択" "1人あたりの投票数を増やす" "1人あたりの投票数" - "投票の選択肢を削除" - "投票の選択肢を並べ替え" + "選択肢%sを削除" + "下に移動" + "上に移動" + "選択肢%sを並べ替え" "投票の選択肢の結果の読み込み中にエラーが発生しました。後でもう一度お試しください。" "コメントを追加" "他のユーザーがコメントを追加できるようにする" @@ -221,6 +223,7 @@ "質問" "投票結果" "選択肢を提案" + "投票を作成" "投票を作成" "合計%d票" diff --git a/stream-chat-android-compose/src/main/res/values-ko/strings.xml b/stream-chat-android-compose/src/main/res/values-ko/strings.xml index 2d349e53878..252792d60f4 100644 --- a/stream-chat-android-compose/src/main/res/values-ko/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-ko/strings.xml @@ -203,8 +203,10 @@ "2\u201310개의 옵션 중 선택" "1인당 투표 수 늘리기" "1인당 투표 수" - "투표 옵션 삭제" - "투표 옵션 재정렬" + "옵션 %s 삭제" + "아래로 이동" + "위로 이동" + "옵션 %s 재정렬" "투표 옵션 결과를 불러오는 중 오류가 발생했습니다. 나중에 다시 시도해 주세요." "댓글 추가" "다른 사용자가 댓글을 추가할 수 있도록 허용" @@ -221,6 +223,7 @@ "질문" "투표 결과" "옵션 제안" + "투표 만들기" "투표 만들기" "총 %d표" diff --git a/stream-chat-android-compose/src/main/res/values/strings.xml b/stream-chat-android-compose/src/main/res/values/strings.xml index fb55bb76e25..5326c8b0005 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -307,6 +307,7 @@ Create Poll + create poll Question Ask a question Options @@ -360,8 +361,10 @@ Poll created: %s Poll closed: %s - Reorder poll option - Remove poll option + Reorder option %s + Move up + Move down + Remove option %s No pinned messages