A11Y: Improve talkback for video and image / preview not preview.

This commit is contained in:
Benoit Marty
2026-07-02 11:10:14 +02:00
parent 01c8064a16
commit c1dfd6d6ae
5 changed files with 22 additions and 2 deletions
@@ -40,6 +40,7 @@ class DefaultLocalMediaRenderer(
localMediaViewState = localMediaViewState,
textFileViewer = textFileViewer,
audioFocus = audioFocus,
forPreview = true,
onClick = {},
onOpenWith = null,
)
@@ -33,6 +33,7 @@ fun LocalMediaView(
onClick: () -> Unit,
onOpenWith: (() -> Unit)?,
textFileViewer: TextFileViewer,
forPreview: Boolean,
modifier: Modifier = Modifier,
isDisplayed: Boolean = true,
isUserSelected: Boolean = false,
@@ -45,6 +46,7 @@ fun LocalMediaView(
localMediaViewState = localMediaViewState,
localMedia = localMedia,
modifier = modifier,
forPreview = forPreview,
onClick = onClick,
)
mimeType.isMimeTypeVideo() -> MediaVideoView(
@@ -54,6 +56,7 @@ fun LocalMediaView(
localMedia = localMedia,
autoplay = isUserSelected,
audioFocus = audioFocus,
forPreview = forPreview,
modifier = modifier,
)
mimeType == MimeTypes.PlainText -> TextFileView(
@@ -30,6 +30,7 @@ import me.saket.telephoto.zoomable.rememberZoomableImageState
fun MediaImageView(
localMediaViewState: LocalMediaViewState,
localMedia: LocalMedia?,
forPreview: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
@@ -42,11 +43,16 @@ fun MediaImageView(
} else {
val zoomableImageState = rememberZoomableImageState(localMediaViewState.zoomableState)
localMediaViewState.isReady = zoomableImageState.isImageDisplayed
val imageDescription = if (forPreview) {
stringResource(CommonStrings.a11y_photo_preview)
} else {
stringResource(CommonStrings.common_image)
}
ZoomableAsyncImage(
modifier = modifier,
state = zoomableImageState,
model = localMedia?.uri,
contentDescription = stringResource(id = CommonStrings.common_image),
contentDescription = imageDescription,
contentScale = ContentScale.Fit,
onClick = { onClick() }
)
@@ -60,6 +66,7 @@ internal fun MediaImageViewPreview() = ElementPreview {
modifier = Modifier.fillMaxSize(),
localMediaViewState = rememberLocalMediaViewState(),
localMedia = null,
forPreview = false,
onClick = {},
)
}
@@ -77,6 +77,7 @@ fun MediaVideoView(
localMedia: LocalMedia?,
autoplay: Boolean,
audioFocus: AudioFocus?,
forPreview: Boolean,
modifier: Modifier = Modifier,
) {
val exoPlayer = rememberExoPlayer(forAudioOnly = false)
@@ -88,6 +89,7 @@ fun MediaVideoView(
localMedia = localMedia,
autoplay = autoplay,
audioFocus = audioFocus,
forPreview = forPreview,
modifier = modifier,
)
}
@@ -102,6 +104,7 @@ private fun ExoPlayerMediaVideoView(
localMedia: LocalMedia?,
autoplay: Boolean,
audioFocus: AudioFocus?,
forPreview: Boolean,
modifier: Modifier = Modifier,
) {
var mediaPlayerControllerState: MediaPlayerControllerState by remember {
@@ -220,7 +223,11 @@ private fun ExoPlayerMediaVideoView(
text = "A Video Player will render here",
)
} else {
val videoDescription = stringResource(CommonStrings.a11y_video_preview)
val videoDescription = if (forPreview) {
stringResource(CommonStrings.a11y_video_preview)
} else {
stringResource(CommonStrings.common_video)
}
AndroidView(
modifier = Modifier
.fillMaxSize()
@@ -359,5 +366,6 @@ internal fun MediaVideoViewPreview() = ElementPreview {
localMedia = null,
audioFocus = null,
autoplay = false,
forPreview = false,
)
}
@@ -396,6 +396,7 @@ private fun MediaViewerPage(
onOpenWith = onOpenWith,
isUserSelected = isUserSelected,
audioFocus = audioFocus,
forPreview = false,
)
if (showThumbnail) {
ThumbnailView(