a11y: Extract method to avoid code duplication

This commit is contained in:
Benoit Marty 2025-06-16 14:25:45 +02:00
parent ca00f71e74
commit ace1ec9d14
4 changed files with 41 additions and 17 deletions

View file

@ -53,6 +53,7 @@ import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUser
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure.ChangedIdentity import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure.ChangedIdentity
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure.None import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure.None
import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure.UnsignedDevice import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUserSendFailure.UnsignedDevice
import io.element.android.features.messages.impl.timeline.a11y.a11yReactionAction
import io.element.android.features.messages.impl.timeline.components.MessageShieldView import io.element.android.features.messages.impl.timeline.components.MessageShieldView
import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent
@ -438,11 +439,10 @@ private fun EmojiButton(
} else { } else {
Color.Transparent Color.Transparent
} }
val a11yClickLabel = if (isHighlighted) { val a11yClickLabel = a11yReactionAction(
stringResource(id = CommonStrings.a11y_remove_reaction_with, emoji) emoji = emoji,
} else { userAlreadyReacted = isHighlighted,
stringResource(id = CommonStrings.a11y_react_with, emoji) )
}
Box( Box(
modifier = modifier modifier = modifier
.size(48.dp) .size(48.dp)

View file

@ -0,0 +1,26 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.messages.impl.timeline.a11y
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.res.stringResource
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
@ReadOnlyComposable
fun a11yReactionAction(
emoji: String,
userAlreadyReacted: Boolean = false,
): String {
return if (userAlreadyReacted) {
stringResource(id = CommonStrings.a11y_remove_reaction_with, emoji)
} else {
stringResource(id = CommonStrings.a11y_react_with, emoji)
}
}

View file

@ -39,6 +39,7 @@ import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.features.messages.impl.R import io.element.android.features.messages.impl.R
import io.element.android.features.messages.impl.timeline.a11y.a11yReactionAction
import io.element.android.features.messages.impl.timeline.model.AggregatedReaction import io.element.android.features.messages.impl.timeline.model.AggregatedReaction
import io.element.android.features.messages.impl.timeline.model.AggregatedReactionProvider import io.element.android.features.messages.impl.timeline.model.AggregatedReactionProvider
import io.element.android.features.messages.impl.timeline.model.aTimelineItemReactions import io.element.android.features.messages.impl.timeline.model.aTimelineItemReactions
@ -105,11 +106,10 @@ fun MessagesReactionButton(
} }
val a11yClickLabel = if (content is MessagesReactionsButtonContent.Reaction) { val a11yClickLabel = if (content is MessagesReactionsButtonContent.Reaction) {
if (content.isHighlighted) { a11yReactionAction(
stringResource(id = CommonStrings.a11y_remove_reaction_with, content.reaction.key) emoji = content.reaction.key,
} else { userAlreadyReacted = content.isHighlighted
stringResource(id = CommonStrings.a11y_react_with, content.reaction.key) )
}
} else { } else {
"" ""
} }

View file

@ -22,7 +22,6 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
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.res.stringResource
import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnit
@ -30,11 +29,11 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.Emoji
import io.element.android.features.messages.impl.timeline.a11y.a11yReactionAction
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toDp import io.element.android.libraries.designsystem.text.toDp
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun EmojiItem( fun EmojiItem(
@ -49,11 +48,10 @@ fun EmojiItem(
} else { } else {
Color.Transparent Color.Transparent
} }
val description = if (isSelected) { val description = a11yReactionAction(
stringResource(id = CommonStrings.a11y_remove_reaction_with, item.unicode) emoji = item.unicode,
} else { userAlreadyReacted = isSelected,
stringResource(id = CommonStrings.a11y_react_with, item.unicode) )
}
Box( Box(
modifier = modifier modifier = modifier
.sizeIn(minWidth = 40.dp, minHeight = 40.dp) .sizeIn(minWidth = 40.dp, minHeight = 40.dp)