summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-02-10 12:09:35 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-02-10 12:09:35 -0800
commit914bb4854f8838ec2aab0340ca1c9d8c1eaf252e (patch)
tree4c6525683766219d88df9f100d39d1b5e04752ee /java
parent5e90a052a4341270a7647d75def46e73d3d64047 (diff)
parent3900e0f4e690a507a6cc04a68dcc5c5ce05a9154 (diff)
Merge "Shareousel: add item position to item content description." into main
Diffstat (limited to 'java')
-rw-r--r--java/res/values/strings.xml3
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt34
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt1
-rw-r--r--java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt2
4 files changed, 34 insertions, 6 deletions
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 6504462f..52b27304 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -329,6 +329,9 @@
front of the list by the user. [CHAR LIMIT=NONE] -->
<string name="pinned">Pinned</string>
+ <!-- Accessibility content description, item position label e.g. "Item 1" or "Item 345".
+ [CHAR LIMIT=NONE] -->
+ <string name="item_position_label">Item <xliff:g id="item_position" example="123">%1$d</xliff:g></string>
<!-- Accessibility content description for an image that the user may select for sharing.
[CHAR LIMIT=NONE] -->
<string name="selectable_image">Selectable image</string>
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt
index 9bc8d3e2..a19398fc 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt
@@ -70,6 +70,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.intentresolver.Flags.announceShareouselItemListPosition
import com.android.intentresolver.Flags.shareouselScrollOffscreenSelections
import com.android.intentresolver.Flags.shareouselSelectionShrink
import com.android.intentresolver.Flags.unselectFinalItem
@@ -233,6 +234,7 @@ private fun PreviewCarousel(previews: PreviewsModel, viewModel: ShareouselViewMo
ShareouselCard(
viewModel = previewModel,
aspectRatio = measurements.coerceAspectRatio(previewModel.aspectRatio),
+ annotateWithPosition = previews.previewModels.size > 1,
)
}
}
@@ -240,17 +242,37 @@ private fun PreviewCarousel(previews: PreviewsModel, viewModel: ShareouselViewMo
}
@Composable
-private fun ShareouselCard(viewModel: ShareouselPreviewViewModel, aspectRatio: Float) {
+private fun ShareouselCard(
+ viewModel: ShareouselPreviewViewModel,
+ aspectRatio: Float,
+ annotateWithPosition: Boolean,
+) {
val bitmapLoadState by viewModel.bitmapLoadState.collectAsStateWithLifecycle()
val selected by viewModel.isSelected.collectAsStateWithLifecycle(initialValue = false)
val borderColor = MaterialTheme.colorScheme.primary
val scope = rememberCoroutineScope()
- val contentDescription =
- when (viewModel.contentType) {
- ContentType.Image -> stringResource(R.string.selectable_image)
- ContentType.Video -> stringResource(R.string.selectable_video)
- else -> stringResource(R.string.selectable_item)
+ val contentDescription = buildString {
+ if (
+ announceShareouselItemListPosition() &&
+ annotateWithPosition &&
+ viewModel.cursorPosition >= 0
+ ) {
+ // If item cursor position is not known, do not announce item position.
+ // We can have items with an unknown cursor position only when:
+ // * when we haven't got the cursor and showing the initially shared items;
+ // * when we've got an inconsistent data from the app (some initially shared items
+ // are missing in the cursor);
+ append(stringResource(R.string.item_position_label, viewModel.cursorPosition + 1))
+ append(", ")
}
+ append(
+ when (viewModel.contentType) {
+ ContentType.Image -> stringResource(R.string.selectable_image)
+ ContentType.Video -> stringResource(R.string.selectable_video)
+ else -> stringResource(R.string.selectable_item)
+ }
+ )
+ }
Box(
modifier = Modifier.fillMaxHeight().aspectRatio(aspectRatio),
contentAlignment = Alignment.Center,
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt
index de435290..b56aa365 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselPreviewViewModel.kt
@@ -33,4 +33,5 @@ data class ShareouselPreviewViewModel(
/** Sets whether this preview has been selected by the user. */
val setSelected: suspend (Boolean) -> Unit,
val aspectRatio: Float,
+ val cursorPosition: Int,
)
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt
index 6baf5935..99053e0f 100644
--- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt
+++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt
@@ -152,6 +152,8 @@ object ShareouselViewModelModule {
isSelected = previewInteractor.isSelected,
setSelected = previewInteractor::setSelected,
aspectRatio = key.aspectRatio,
+ // only items with a final key has a known cursor position
+ cursorPosition = if (key.key.isFinal) key.order else -1,
)
},
)