Skip to content

Commit 23853d4

Browse files
committed
Add paneTitle to compose SDK screens for TalkBack pane announcements
paneTitle is the Compose semantic that drives TalkBack's pane-change announcement (TYPE_WINDOW_STATE_CHANGED) when a screen appears via FullscreenDialog, adaptive-layout pane swap, or Compose Navigation route change inside an existing Activity. Without it, TalkBack only announces the host Activity's android:label on entry and stays silent on subsequent in-Activity pane changes. - AddMembersScreen, GroupChannelEditScreen: announce 'Add Members' / 'Edit' when shown via FullscreenDialog from GroupChannelInfoScreen. - DirectChannelInfoScreen, GroupChannelInfoScreen, ChannelsScreen, ChatsScreen, ThreadsScreen: announce their title when used as a pane in an adaptive layout or routed-to via Compose Navigation. All reuse existing strings or the screen's existing title parameter; no new public API.
1 parent 5841f4e commit 23853d4

7 files changed

Lines changed: 31 additions & 7 deletions

File tree

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/info/AddMembersScreen.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import androidx.compose.ui.Alignment
4040
import androidx.compose.ui.Modifier
4141
import androidx.compose.ui.res.painterResource
4242
import androidx.compose.ui.res.stringResource
43+
import androidx.compose.ui.semantics.paneTitle
44+
import androidx.compose.ui.semantics.semantics
4345
import androidx.compose.ui.text.style.TextAlign
4446
import androidx.compose.ui.text.style.TextOverflow
4547
import androidx.compose.ui.tooling.preview.Preview
@@ -101,11 +103,13 @@ internal fun AddMembersScreen(
101103
onDismiss: () -> Unit,
102104
onConfirm: () -> Unit,
103105
) {
106+
val paneTitleText = stringResource(id = R.string.stream_compose_add_members_title)
104107
Column(
105108
modifier = Modifier
106109
.fillMaxSize()
107110
.background(ChatTheme.colors.backgroundCoreApp)
108-
.systemBarsPadding(),
111+
.systemBarsPadding()
112+
.semantics { paneTitle = paneTitleText },
109113
) {
110114
AddMembersHeader(
111115
hasSelection = state.selectedUserIds.isNotEmpty(),

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/info/DirectChannelInfoScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ import androidx.compose.ui.Alignment
4242
import androidx.compose.ui.Modifier
4343
import androidx.compose.ui.platform.LocalContext
4444
import androidx.compose.ui.res.stringResource
45+
import androidx.compose.ui.semantics.paneTitle
46+
import androidx.compose.ui.semantics.semantics
4547
import androidx.compose.ui.text.style.TextOverflow
4648
import androidx.compose.ui.tooling.preview.Preview
4749
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -113,8 +115,9 @@ private fun DirectChannelInfoScaffold(
113115
onViewAction: (action: ChannelInfoViewAction) -> Unit = {},
114116
) {
115117
val listState = rememberLazyListState()
118+
val paneTitleText = stringResource(id = UiCommonR.string.stream_ui_channel_info_contact_title)
116119
Scaffold(
117-
modifier = modifier,
120+
modifier = modifier.semantics { paneTitle = paneTitleText },
118121
topBar = {
119122
ChatTheme.componentFactory.DirectChannelInfoTopBar(
120123
params = DirectChannelInfoTopBarParams(

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/info/GroupChannelEditScreen.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ import androidx.compose.ui.platform.LocalContext
5454
import androidx.compose.ui.platform.LocalInspectionMode
5555
import androidx.compose.ui.res.painterResource
5656
import androidx.compose.ui.res.stringResource
57+
import androidx.compose.ui.semantics.paneTitle
58+
import androidx.compose.ui.semantics.semantics
5759
import androidx.compose.ui.text.TextRange
5860
import androidx.compose.ui.text.input.TextFieldValue
5961
import androidx.compose.ui.text.style.TextOverflow
@@ -206,7 +208,9 @@ private fun GroupChannelEditContent(
206208
onSaveActionClick: () -> Unit = {},
207209
onUploadPictureClick: () -> Unit = {},
208210
) {
211+
val paneTitleText = stringResource(id = UiCommonR.string.stream_ui_channel_info_edit_title)
209212
Scaffold(
213+
modifier = Modifier.semantics { paneTitle = paneTitleText },
210214
topBar = {
211215
GroupChannelEditTopBar(
212216
isBusy = isBusy,

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/info/GroupChannelInfoScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ import androidx.compose.ui.Modifier
5050
import androidx.compose.ui.platform.LocalContext
5151
import androidx.compose.ui.res.pluralStringResource
5252
import androidx.compose.ui.res.stringResource
53+
import androidx.compose.ui.semantics.paneTitle
54+
import androidx.compose.ui.semantics.semantics
5355
import androidx.compose.ui.text.style.TextOverflow
5456
import androidx.compose.ui.tooling.preview.Preview
5557
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -174,8 +176,9 @@ private fun GroupChannelInfoScaffold(
174176
onViewAction: (action: ChannelInfoViewAction) -> Unit = {},
175177
) {
176178
val listState = rememberLazyListState()
179+
val paneTitleText = stringResource(id = UiCommonR.string.stream_ui_channel_info_group_title)
177180
Scaffold(
178-
modifier = modifier,
181+
modifier = modifier.semantics { paneTitle = paneTitleText },
179182
topBar = {
180183
ChatTheme.componentFactory.GroupChannelInfoTopBar(
181184
params = GroupChannelInfoTopBarParams(

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/ChannelsScreen.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import androidx.compose.runtime.setValue
4141
import androidx.compose.ui.Alignment
4242
import androidx.compose.ui.Modifier
4343
import androidx.compose.ui.platform.testTag
44+
import androidx.compose.ui.semantics.paneTitle
45+
import androidx.compose.ui.semantics.semantics
4446
import androidx.compose.ui.unit.dp
4547
import androidx.lifecycle.viewmodel.compose.viewModel
4648
import io.getstream.chat.android.compose.state.channels.list.SearchQuery
@@ -123,7 +125,9 @@ public fun ChannelsScreen(
123125
.testTag("Stream_ChannelsScreen"),
124126
) {
125127
Scaffold(
126-
modifier = Modifier.fillMaxSize(),
128+
modifier = Modifier
129+
.fillMaxSize()
130+
.semantics { paneTitle = title },
127131
topBar = {
128132
if (isShowingHeader) {
129133
ChatTheme.componentFactory.ChannelListHeader(

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/chats/ChatsScreen.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import androidx.compose.runtime.setValue
4444
import androidx.compose.ui.Modifier
4545
import androidx.compose.ui.layout.onSizeChanged
4646
import androidx.compose.ui.platform.LocalContext
47+
import androidx.compose.ui.semantics.paneTitle
48+
import androidx.compose.ui.semantics.semantics
4749
import androidx.compose.ui.unit.IntOffset
4850
import androidx.compose.ui.unit.IntSize
4951
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -179,10 +181,12 @@ public fun ChatsScreen(
179181
onDispose { navigator.popUpTo(ThreePaneRole.List) }
180182
}
181183

182-
val listPane = remember(listContentMode) {
184+
val listPane = remember(listContentMode, title) {
183185
movableContentOf { modifier: Modifier ->
184186
Scaffold(
185-
modifier = modifier.safeDrawingPadding(),
187+
modifier = modifier
188+
.safeDrawingPadding()
189+
.semantics { paneTitle = title },
186190
containerColor = ChatTheme.colors.backgroundCoreApp,
187191
topBar = { listTopBarContent() },
188192
bottomBar = { listBottomBarContent() },

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/threads/ThreadsScreen.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import androidx.compose.runtime.collectAsState
2323
import androidx.compose.runtime.getValue
2424
import androidx.compose.ui.Modifier
2525
import androidx.compose.ui.res.stringResource
26+
import androidx.compose.ui.semantics.paneTitle
27+
import androidx.compose.ui.semantics.semantics
2628
import androidx.lifecycle.viewmodel.compose.viewModel
2729
import io.getstream.chat.android.client.api.models.QueryThreadsRequest
2830
import io.getstream.chat.android.compose.R
@@ -54,7 +56,7 @@ public fun ThreadsScreen(
5456
val user by listViewModel.user.collectAsState()
5557
val connectionState by listViewModel.connectionState.collectAsState()
5658

57-
Column(modifier = Modifier.fillMaxSize()) {
59+
Column(modifier = Modifier.fillMaxSize().semantics { paneTitle = title }) {
5860
ChatTheme.componentFactory.ThreadListHeader(
5961
params = ThreadListHeaderParams(
6062
title = title,

0 commit comments

Comments
 (0)