a11y: Extract method a11yReactionDetails to use it at other places

This commit is contained in:
Benoit Marty 2025-06-16 14:29:00 +02:00
parent ace1ec9d14
commit 2dd31d1b3a
2 changed files with 42 additions and 27 deletions

View file

@ -9,14 +9,16 @@ package io.element.android.features.messages.impl.timeline.a11y
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import io.element.android.features.messages.impl.R
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
@ReadOnlyComposable @ReadOnlyComposable
fun a11yReactionAction( fun a11yReactionAction(
emoji: String, emoji: String,
userAlreadyReacted: Boolean = false, userAlreadyReacted: Boolean,
): String { ): String {
return if (userAlreadyReacted) { return if (userAlreadyReacted) {
stringResource(id = CommonStrings.a11y_remove_reaction_with, emoji) stringResource(id = CommonStrings.a11y_remove_reaction_with, emoji)
@ -24,3 +26,36 @@ fun a11yReactionAction(
stringResource(id = CommonStrings.a11y_react_with, emoji) stringResource(id = CommonStrings.a11y_react_with, emoji)
} }
} }
@Composable
@ReadOnlyComposable
fun a11yReactionDetails(
emoji: String,
userAlreadyReacted: Boolean,
reactionCount: Int,
): String {
val reaction = if (emoji.startsWith("mxc://")) {
stringResource(CommonStrings.common_an_image)
} else {
emoji
}
return if (userAlreadyReacted) {
if (reactionCount == 1) {
stringResource(R.string.screen_room_timeline_reaction_you_a11y, reaction)
} else {
pluralStringResource(
R.plurals.screen_room_timeline_reaction_including_you_a11y,
reactionCount - 1,
reactionCount - 1,
reaction,
)
}
} else {
pluralStringResource(
R.plurals.screen_room_timeline_reaction_a11y,
reactionCount,
reactionCount,
reaction,
)
}
}

View file

@ -28,7 +28,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource 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
@ -40,6 +39,7 @@ 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.a11y.a11yReactionAction
import io.element.android.features.messages.impl.timeline.a11y.a11yReactionDetails
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
@ -52,7 +52,6 @@ import io.element.android.libraries.designsystem.theme.components.Surface
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.ui.media.MediaRequestData import io.element.android.libraries.matrix.ui.media.MediaRequestData
import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
@Suppress("ModifierClickableOrder") // This is needed to display the right ripple shape @Suppress("ModifierClickableOrder") // This is needed to display the right ripple shape
@ -78,30 +77,11 @@ fun MessagesReactionButton(
is MessagesReactionsButtonContent.Icon -> stringResource(id = R.string.screen_room_timeline_add_reaction) is MessagesReactionsButtonContent.Icon -> stringResource(id = R.string.screen_room_timeline_add_reaction)
is MessagesReactionsButtonContent.Text -> content.text is MessagesReactionsButtonContent.Text -> content.text
is MessagesReactionsButtonContent.Reaction -> { is MessagesReactionsButtonContent.Reaction -> {
val reaction = if (content.reaction.key.startsWith("mxc://")) { a11yReactionDetails(
stringResource(CommonStrings.common_an_image) emoji = content.reaction.key,
} else { userAlreadyReacted = content.isHighlighted,
content.reaction.key reactionCount = content.reaction.count,
} )
if (content.isHighlighted) {
if (content.reaction.count == 1) {
stringResource(R.string.screen_room_timeline_reaction_you_a11y, reaction)
} else {
pluralStringResource(
R.plurals.screen_room_timeline_reaction_including_you_a11y,
content.reaction.count - 1,
content.reaction.count - 1,
reaction,
)
}
} else {
pluralStringResource(
R.plurals.screen_room_timeline_reaction_a11y,
content.reaction.count,
content.reaction.count,
reaction,
)
}
} }
} }