Browse Source

Merge pull request #1845 from vector-im/feature/bma/sendingStateA11y

Content description: add for sending state and fix other issues.
pull/1865/head
Benoit Marty 10 months ago committed by GitHub
parent
commit
68c4f1e6bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/RoomPrivacyOption.kt
  2. 2
      features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt
  3. 15
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt
  4. 4
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/LocalMediaView.kt
  5. 4
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/pdf/PdfViewer.kt
  6. 4
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt
  7. 4
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt
  8. 15
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiItem.kt
  9. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt
  10. 4
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt
  11. 12
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt
  12. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineEncryptedHistoryBannerView.kt
  13. 2
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RoundedIconAtom.kt
  14. 4
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt
  15. 2
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/components/PreferenceIcon.kt
  16. 2
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/FloatingActionButton.kt
  17. 2
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Icon.kt
  18. 8
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconButton.kt
  19. 4
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconToggleButton.kt
  20. 7
      libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/previews/MenuPreview.kt
  21. 2
      libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt
  22. 2
      libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt
  23. 2
      libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt
  24. 20
      libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/FormattingOption.kt
  25. 8
      libraries/ui-strings/src/main/res/values/localazy.xml
  26. 4
      tools/check/forbidden_strings_in_code.txt

2
features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/RoomPrivacyOption.kt

@ -58,7 +58,7 @@ fun RoomPrivacyOption(
Icon( Icon(
modifier = Modifier.padding(horizontal = 8.dp), modifier = Modifier.padding(horizontal = 8.dp),
resourceId = roomPrivacyItem.icon, resourceId = roomPrivacyItem.icon,
contentDescription = "", contentDescription = null,
tint = MaterialTheme.colorScheme.secondary, tint = MaterialTheme.colorScheme.secondary,
) )

2
features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockView.kt

@ -300,7 +300,7 @@ private fun PinUnlockHeader(
.size(32.dp), .size(32.dp),
tint = ElementTheme.colors.iconPrimary, tint = ElementTheme.colors.iconPrimary,
imageVector = Icons.Filled.Lock, imageVector = Icons.Filled.Lock,
contentDescription = "", contentDescription = null,
) )
} }
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))

15
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt

@ -48,6 +48,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
@ -382,7 +384,7 @@ private fun EmojiReactionsRow(
) { ) {
Icon( Icon(
resourceId = CommonDrawables.ic_add_reaction, resourceId = CommonDrawables.ic_add_reaction,
contentDescription = "Emojis", contentDescription = stringResource(id = CommonStrings.a11y_react_with_other_emojis),
tint = MaterialTheme.colorScheme.secondary, tint = MaterialTheme.colorScheme.secondary,
modifier = Modifier modifier = Modifier
.size(24.dp) .size(24.dp)
@ -409,11 +411,18 @@ private fun EmojiButton(
} else { } else {
Color.Transparent Color.Transparent
} }
val description = if (isHighlighted) {
stringResource(id = CommonStrings.a11y_remove_reaction_with, emoji)
} else {
stringResource(id = CommonStrings.a11y_react_with, emoji)
}
Box( Box(
modifier = modifier modifier = modifier
.size(48.dp) .size(48.dp)
.background(backgroundColor, CircleShape), .background(backgroundColor, CircleShape)
.clearAndSetSemantics {
contentDescription = description
},
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Text( Text(

4
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/LocalMediaView.kt

@ -44,6 +44,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -69,6 +70,7 @@ import io.element.android.libraries.designsystem.utils.CommonDrawables
import io.element.android.libraries.designsystem.utils.KeepScreenOn import io.element.android.libraries.designsystem.utils.KeepScreenOn
import io.element.android.libraries.designsystem.utils.OnLifecycleEvent import io.element.android.libraries.designsystem.utils.OnLifecycleEvent
import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.ui.strings.CommonStrings
import me.saket.telephoto.zoomable.ZoomSpec import me.saket.telephoto.zoomable.ZoomSpec
import me.saket.telephoto.zoomable.ZoomableState import me.saket.telephoto.zoomable.ZoomableState
import me.saket.telephoto.zoomable.coil.ZoomableAsyncImage import me.saket.telephoto.zoomable.coil.ZoomableAsyncImage
@ -135,7 +137,7 @@ private fun MediaImageView(
modifier = modifier.fillMaxSize(), modifier = modifier.fillMaxSize(),
state = zoomableImageState, state = zoomableImageState,
model = localMedia?.uri, model = localMedia?.uri,
contentDescription = "Image", contentDescription = stringResource(id = CommonStrings.common_image),
contentScale = ContentScale.Fit, contentScale = ContentScale.Fit,
) )
} }

4
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/pdf/PdfViewer.kt

@ -35,9 +35,11 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.text.roundToPx import io.element.android.libraries.designsystem.text.roundToPx
import io.element.android.libraries.designsystem.text.toDp import io.element.android.libraries.designsystem.text.toDp
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import me.saket.telephoto.zoomable.zoomable import me.saket.telephoto.zoomable.zoomable
@ -98,7 +100,7 @@ private fun PdfPageView(
is PdfPage.State.Loaded -> { is PdfPage.State.Loaded -> {
Image( Image(
bitmap = state.bitmap.asImageBitmap(), bitmap = state.bitmap.asImageBitmap(),
contentDescription = "Page ${pdfPage.pageIndex}", contentDescription = stringResource(id = CommonStrings.a11y_page_n, pdfPage.pageIndex),
contentScale = ContentScale.FillWidth, contentScale = ContentScale.FillWidth,
modifier = modifier.fillMaxWidth() modifier = modifier.fillMaxWidth()
) )

4
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt

@ -52,6 +52,7 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.rotate
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.features.messages.impl.R import io.element.android.features.messages.impl.R
@ -78,6 +79,7 @@ import io.element.android.libraries.designsystem.utils.CommonDrawables
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
@ -350,7 +352,7 @@ private fun JumpToBottomButton(
.size(24.dp) .size(24.dp)
.rotate(90f), .rotate(90f),
resourceId = CommonDrawables.ic_compound_arrow_right, resourceId = CommonDrawables.ic_compound_arrow_right,
contentDescription = "", contentDescription = stringResource(id = CommonStrings.a11y_jump_to_bottom)
) )
} }
} }

4
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt

@ -36,8 +36,8 @@ import androidx.compose.ui.unit.dp
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.TimelineItemTextBasedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent
import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.core.bool.orFalse
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
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.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.utils.CommonDrawables import io.element.android.libraries.designsystem.utils.CommonDrawables
@ -91,7 +91,7 @@ fun TimelineEventTimestampView(
Spacer(modifier = Modifier.width(2.dp)) Spacer(modifier = Modifier.width(2.dp))
Icon( Icon(
resourceId = CommonDrawables.ic_compound_error, resourceId = CommonDrawables.ic_compound_error,
contentDescription = "Error sending message", contentDescription = stringResource(id = CommonStrings.common_sending_failed),
tint = tint, tint = tint,
modifier = Modifier.size(15.dp, 18.dp), modifier = Modifier.size(15.dp, 18.dp),
) )

15
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiItem.kt

@ -30,12 +30,16 @@ 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.contentDescription
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.Emoji
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.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun EmojiItem( fun EmojiItem(
@ -49,7 +53,11 @@ fun EmojiItem(
} else { } else {
Color.Transparent Color.Transparent
} }
val description = if (isSelected) {
stringResource(id = CommonStrings.a11y_remove_reaction_with, item.unicode)
} else {
stringResource(id = CommonStrings.a11y_react_with, item.unicode)
}
Box( Box(
modifier = modifier modifier = modifier
.size(40.dp) .size(40.dp)
@ -59,7 +67,10 @@ fun EmojiItem(
onClick = { onEmojiSelected(item) }, onClick = { onEmojiSelected(item) },
indication = rememberRipple(bounded = false, radius = 20.dp), indication = rememberRipple(bounded = false, radius = 20.dp),
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() }
), )
.clearAndSetSemantics {
contentDescription = description
},
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Text( Text(

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt

@ -60,7 +60,7 @@ fun TimelineItemFileView(
) { ) {
Icon( Icon(
resourceId = CommonDrawables.ic_attachment, resourceId = CommonDrawables.ic_attachment,
contentDescription = "OpenFile", contentDescription = null,
tint = ElementTheme.materialColors.primary, tint = ElementTheme.materialColors.primary,
modifier = Modifier modifier = Modifier
.size(16.dp) .size(16.dp)

4
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemVideoView.kt

@ -26,6 +26,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContentProvider import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContentProvider
@ -34,6 +35,7 @@ import io.element.android.libraries.designsystem.modifiers.roundedBackground
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
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
fun TimelineItemVideoView( fun TimelineItemVideoView(
@ -56,7 +58,7 @@ fun TimelineItemVideoView(
) { ) {
Image( Image(
Icons.Default.PlayArrow, Icons.Default.PlayArrow,
contentDescription = "Play", contentDescription = stringResource(id = CommonStrings.a11y_play),
colorFilter = ColorFilter.tint(Color.White), colorFilter = ColorFilter.tint(Color.White),
) )
} }

12
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt

@ -35,7 +35,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.pluralStringResource 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.stateDescription import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex import androidx.compose.ui.zIndex
@ -69,7 +69,9 @@ fun TimelineItemReadReceiptView(
receipts = state.receipts, receipts = state.receipts,
modifier = Modifier modifier = Modifier
.clip(RoundedCornerShape(4.dp)) .clip(RoundedCornerShape(4.dp))
.clickable { onReadReceiptsClicked() } .clickable {
onReadReceiptsClicked()
}
.padding(2.dp) .padding(2.dp)
) )
} }
@ -80,7 +82,7 @@ fun TimelineItemReadReceiptView(
Icon( Icon(
modifier = Modifier.padding(2.dp), modifier = Modifier.padding(2.dp),
resourceId = CommonDrawables.ic_sending, resourceId = CommonDrawables.ic_sending,
contentDescription = null, contentDescription = stringResource(id = CommonStrings.common_sending),
tint = ElementTheme.colors.iconSecondary tint = ElementTheme.colors.iconSecondary
) )
} }
@ -96,7 +98,7 @@ fun TimelineItemReadReceiptView(
Icon( Icon(
modifier = Modifier.padding(2.dp), modifier = Modifier.padding(2.dp),
resourceId = CommonDrawables.ic_sent, resourceId = CommonDrawables.ic_sent,
contentDescription = null, contentDescription = stringResource(id = CommonStrings.common_sent),
tint = ElementTheme.colors.iconSecondary tint = ElementTheme.colors.iconSecondary
) )
} }
@ -139,7 +141,7 @@ private fun ReadReceiptsAvatars(
Row( Row(
modifier = modifier modifier = modifier
.clearAndSetSemantics { .clearAndSetSemantics {
stateDescription = receiptDescription contentDescription = receiptDescription
}, },
horizontalArrangement = Arrangement.spacedBy(4.dp - avatarStrokeSize), horizontalArrangement = Arrangement.spacedBy(4.dp - avatarStrokeSize),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineEncryptedHistoryBannerView.kt

@ -57,7 +57,7 @@ fun TimelineEncryptedHistoryBannerView(
Icon( Icon(
modifier = Modifier.size(20.dp), modifier = Modifier.size(20.dp),
resourceId = CommonDrawables.ic_compound_info_solid, resourceId = CommonDrawables.ic_compound_info_solid,
contentDescription = "Info", contentDescription = null,
tint = ElementTheme.colors.iconInfoPrimary tint = ElementTheme.colors.iconInfoPrimary
) )
Text( Text(

2
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/RoundedIconAtom.kt

@ -70,7 +70,7 @@ fun RoundedIconAtom(
tint = tint, tint = tint,
resourceId = resourceId, resourceId = resourceId,
imageVector = imageVector, imageVector = imageVector,
contentDescription = "", contentDescription = null,
) )
} }
} }

4
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt

@ -51,7 +51,7 @@ fun BackButton(
@Composable @Composable
internal fun BackButtonPreview() = ElementThemedPreview { internal fun BackButtonPreview() = ElementThemedPreview {
Column { Column {
BackButton(onClick = { }, enabled = true, contentDescription = "Back") BackButton(onClick = { }, enabled = true)
BackButton(onClick = { }, enabled = false, contentDescription = "Back") BackButton(onClick = { }, enabled = false)
} }
} }

2
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/components/PreferenceIcon.kt

@ -51,7 +51,7 @@ fun PreferenceIcon(
Icon( Icon(
imageVector = icon, imageVector = icon,
resourceId = iconResourceId, resourceId = iconResourceId,
contentDescription = "", contentDescription = null,
tint = tintColor ?: enabled.toSecondaryEnabledColor(), tint = tintColor ?: enabled.toSecondaryEnabledColor(),
modifier = Modifier modifier = Modifier
.padding(end = 16.dp) .padding(end = 16.dp)

2
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/FloatingActionButton.kt

@ -66,7 +66,7 @@ internal fun FloatingActionButtonPreview() =
private fun ContentToPreview() { private fun ContentToPreview() {
Box(modifier = Modifier.padding(8.dp)) { Box(modifier = Modifier.padding(8.dp)) {
FloatingActionButton(onClick = {}) { FloatingActionButton(onClick = {}) {
Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = "") Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = null)
} }
} }
} }

2
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/Icon.kt

@ -145,5 +145,5 @@ internal fun IconImageVectorPreview() =
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = "") Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = null)
} }

8
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconButton.kt

@ -67,20 +67,20 @@ private fun ContentToPreview() {
CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.iconPrimary) { CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.iconPrimary) {
Row { Row {
IconButton(onClick = {}) { IconButton(onClick = {}) {
Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = "") Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = null)
} }
IconButton(enabled = false, onClick = {}) { IconButton(enabled = false, onClick = {}) {
Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = "") Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = null)
} }
} }
} }
CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.iconSecondary) { CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.iconSecondary) {
Row { Row {
IconButton(onClick = {}) { IconButton(onClick = {}) {
Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = "") Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = null)
} }
IconButton(enabled = false, onClick = {}) { IconButton(enabled = false, onClick = {}) {
Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = "") Icon(resourceId = CommonDrawables.ic_compound_close, contentDescription = null)
} }
} }
} }

4
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/IconToggleButton.kt

@ -69,7 +69,7 @@ private fun ContentToPreview() {
val icon: @Composable () -> Unit = { val icon: @Composable () -> Unit = {
Icon( Icon(
imageVector = if (checked) Icons.Default.CheckCircle else Icons.Default.RadioButtonUnchecked, imageVector = if (checked) Icons.Default.CheckCircle else Icons.Default.RadioButtonUnchecked,
contentDescription = "IconToggleButton" contentDescription = null
) )
} }
IconToggleButton(checked = checked, enabled = true, onCheckedChange = { checked = !checked }, content = icon) IconToggleButton(checked = checked, enabled = true, onCheckedChange = { checked = !checked }, content = icon)
@ -79,7 +79,7 @@ private fun ContentToPreview() {
val icon: @Composable () -> Unit = { val icon: @Composable () -> Unit = {
Icon( Icon(
imageVector = if (!checked) Icons.Default.CheckCircle else Icons.Default.RadioButtonUnchecked, imageVector = if (!checked) Icons.Default.CheckCircle else Icons.Default.RadioButtonUnchecked,
contentDescription = "IconToggleButton" contentDescription = null
) )
} }
IconToggleButton(checked = !checked, enabled = true, onCheckedChange = { checked = !checked }, content = icon) IconToggleButton(checked = !checked, enabled = true, onCheckedChange = { checked = !checked }, content = icon)

7
libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/previews/MenuPreview.kt

@ -43,7 +43,10 @@ internal fun MenuPreview() {
for (i in 0..5) { for (i in 0..5) {
val leadingIcon: @Composable (() -> Unit)? = if (i in 2..3) { val leadingIcon: @Composable (() -> Unit)? = if (i in 2..3) {
@Composable { @Composable {
Icon(Icons.Filled.Favorite, contentDescription = "Favorite") Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = null
)
} }
} else { } else {
null null
@ -53,7 +56,7 @@ internal fun MenuPreview() {
@Composable { @Composable {
Icon( Icon(
resourceId = CommonDrawables.ic_compound_chevron_right, resourceId = CommonDrawables.ic_compound_chevron_right,
contentDescription = "Favorite", contentDescription = null,
) )
} }
} else { } else {

2
libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt

@ -87,7 +87,7 @@ fun EditableAvatarView(
Icon( Icon(
modifier = Modifier.size(16.dp), modifier = Modifier.size(16.dp),
resourceId = CommonDrawables.ic_edit, resourceId = CommonDrawables.ic_edit,
contentDescription = "", contentDescription = null,
tint = MaterialTheme.colorScheme.onPrimary, tint = MaterialTheme.colorScheme.onPrimary,
) )
} }

2
libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt

@ -79,7 +79,7 @@ fun UnresolvedUserRow(
) { ) {
Icon( Icon(
resourceId = CommonDrawables.ic_compound_error, resourceId = CommonDrawables.ic_compound_error,
contentDescription = "", contentDescription = null,
modifier = Modifier modifier = Modifier
.size(18.dp) .size(18.dp)
.align(Alignment.Top) .align(Alignment.Top)

2
libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt

@ -72,7 +72,7 @@ fun UnsavedAvatar(
Box(modifier = commonModifier.background(ElementTheme.colors.temporaryColorBgSpecial)) { Box(modifier = commonModifier.background(ElementTheme.colors.temporaryColorBgSpecial)) {
Icon( Icon(
imageVector = Icons.Outlined.AddAPhoto, imageVector = Icons.Outlined.AddAPhoto,
contentDescription = "", contentDescription = null,
modifier = Modifier modifier = Modifier
.align(Alignment.Center) .align(Alignment.Center)
.size(40.dp), .size(40.dp),

20
libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/FormattingOption.kt

@ -32,33 +32,31 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
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.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.iconSuccessPrimaryBackground import io.element.android.libraries.designsystem.theme.iconSuccessPrimaryBackground
import io.element.android.libraries.designsystem.utils.CommonDrawables import io.element.android.libraries.designsystem.utils.CommonDrawables
import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.theme.compound.generated.SemanticColors
@Composable @Composable
internal fun FormattingOption( internal fun FormattingOption(
state: FormattingOptionState, state: FormattingOptionState,
onClick: () -> Unit, onClick: () -> Unit,
imageVector: ImageVector, imageVector: ImageVector,
contentDescription: String, contentDescription: String?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
colors: SemanticColors = ElementTheme.colors,
) { ) {
val backgroundColor = when (state) { val backgroundColor = when (state) {
FormattingOptionState.Selected -> colors.iconSuccessPrimaryBackground FormattingOptionState.Selected -> ElementTheme.colors.iconSuccessPrimaryBackground
FormattingOptionState.Default, FormattingOptionState.Default,
FormattingOptionState.Disabled -> Color.Transparent FormattingOptionState.Disabled -> Color.Transparent
} }
val foregroundColor = when (state) { val foregroundColor = when (state) {
FormattingOptionState.Selected -> colors.iconSuccessPrimary FormattingOptionState.Selected -> ElementTheme.colors.iconSuccessPrimary
FormattingOptionState.Default -> colors.iconSecondary FormattingOptionState.Default -> ElementTheme.colors.iconSecondary
FormattingOptionState.Disabled -> colors.iconDisabled FormattingOptionState.Disabled -> ElementTheme.colors.iconDisabled
} }
Box( Box(
modifier = modifier modifier = modifier
@ -98,19 +96,19 @@ internal fun FormattingButtonPreview() = ElementPreview {
state = FormattingOptionState.Default, state = FormattingOptionState.Default,
onClick = { }, onClick = { },
imageVector = ImageVector.vectorResource(CommonDrawables.ic_bold), imageVector = ImageVector.vectorResource(CommonDrawables.ic_bold),
contentDescription = "", contentDescription = null,
) )
FormattingOption( FormattingOption(
state = FormattingOptionState.Selected, state = FormattingOptionState.Selected,
onClick = { }, onClick = { },
imageVector = ImageVector.vectorResource(CommonDrawables.ic_italic), imageVector = ImageVector.vectorResource(CommonDrawables.ic_italic),
contentDescription = "", contentDescription = null,
) )
FormattingOption( FormattingOption(
state = FormattingOptionState.Disabled, state = FormattingOptionState.Disabled,
onClick = { }, onClick = { },
imageVector = ImageVector.vectorResource(CommonDrawables.ic_underline), imageVector = ImageVector.vectorResource(CommonDrawables.ic_underline),
contentDescription = "", contentDescription = null,
) )
} }
} }

8
libraries/ui-strings/src/main/res/values/localazy.xml

@ -2,21 +2,27 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_delete">"Delete"</string> <string name="a11y_delete">"Delete"</string>
<string name="a11y_hide_password">"Hide password"</string> <string name="a11y_hide_password">"Hide password"</string>
<string name="a11y_jump_to_bottom">"Jump to bottom"</string>
<string name="a11y_notifications_mentions_only">"Mentions only"</string> <string name="a11y_notifications_mentions_only">"Mentions only"</string>
<string name="a11y_notifications_muted">"Muted"</string> <string name="a11y_notifications_muted">"Muted"</string>
<string name="a11y_page_n">"Page %1$d"</string>
<string name="a11y_pause">"Pause"</string> <string name="a11y_pause">"Pause"</string>
<string name="a11y_pin_field">"PIN field"</string> <string name="a11y_pin_field">"PIN field"</string>
<string name="a11y_play">"Play"</string> <string name="a11y_play">"Play"</string>
<string name="a11y_poll">"Poll"</string> <string name="a11y_poll">"Poll"</string>
<string name="a11y_poll_end">"Ended poll"</string> <string name="a11y_poll_end">"Ended poll"</string>
<string name="a11y_react_with">"React with %1$s"</string>
<string name="a11y_react_with_other_emojis">"React with other emojis"</string>
<string name="a11y_read_receipts_multiple">"Read by %1$s and %2$s"</string>
<string name="a11y_read_receipts_single">"Read by %1$s"</string> <string name="a11y_read_receipts_single">"Read by %1$s"</string>
<string name="a11y_read_receipts_tap_to_show_all">"Tap to show all"</string>
<string name="a11y_remove_reaction_with">"Remove reaction with %1$s"</string>
<string name="a11y_send_files">"Send files"</string> <string name="a11y_send_files">"Send files"</string>
<string name="a11y_show_password">"Show password"</string> <string name="a11y_show_password">"Show password"</string>
<string name="a11y_start_call">"Start a call"</string> <string name="a11y_start_call">"Start a call"</string>
<string name="a11y_user_menu">"User menu"</string> <string name="a11y_user_menu">"User menu"</string>
<string name="a11y_voice_message_record">"Record voice message."</string> <string name="a11y_voice_message_record">"Record voice message."</string>
<string name="a11y_voice_message_stop_recording">"Stop recording"</string> <string name="a11y_voice_message_stop_recording">"Stop recording"</string>
<string name="a11y_read_receipts_multiple">"Read by %1$s and %2$s"</string>
<string name="action_accept">"Accept"</string> <string name="action_accept">"Accept"</string>
<string name="action_add_to_timeline">"Add to timeline"</string> <string name="action_add_to_timeline">"Add to timeline"</string>
<string name="action_back">"Back"</string> <string name="action_back">"Back"</string>

4
tools/check/forbidden_strings_in_code.txt

@ -132,3 +132,7 @@ System\.currentTimeMillis\(\)===1
### Use `import io.element.android.libraries.ui.strings.CommonStrings` then `CommonStrings.<stringKey>` instead ### Use `import io.element.android.libraries.ui.strings.CommonStrings` then `CommonStrings.<stringKey>` instead
import io\.element\.android\.libraries\.ui\.strings\.R import io\.element\.android\.libraries\.ui\.strings\.R
# Accessibility
### Use string resource for `contentDescription`, or null instead of empty string
contentDescription = "

Loading…
Cancel
Save