Skip to content

Commit 25d3cbc

Browse files
authored
[CLX-3694][Horizon] Accessibility fixes (#3454)
refs: CLX-3694 affects: Student release note: none
1 parent a38cc35 commit 25d3cbc

File tree

17 files changed

+201
-65
lines changed

17 files changed

+201
-65
lines changed

libs/horizon/src/main/java/com/instructure/horizon/features/dashboard/DashboardScreen.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,11 @@ fun DashboardScreen(uiState: DashboardUiState, mainNavController: NavHostControl
199199
refreshStateFlow
200200
)
201201
HorizonSpace(SpaceSize.SPACE_16)
202-
NumericWidgetRow(shouldRefresh, refreshStateFlow, homeNavController)
202+
NumericWidgetRow(
203+
shouldRefresh,
204+
refreshStateFlow,
205+
homeNavController
206+
)
203207
DashboardSkillHighlightsWidget(
204208
homeNavController,
205209
shouldRefresh,
@@ -280,9 +284,12 @@ private fun HomeScreenTopBar(uiState: DashboardUiState, mainNavController: NavCo
280284
private fun NumericWidgetRow(
281285
shouldRefresh: Boolean,
282286
refreshStateFlow: MutableStateFlow<List<Boolean>>,
283-
homeNavController: NavHostController
287+
homeNavController: NavHostController,
288+
modifier: Modifier = Modifier
284289
) {
285-
BoxWithConstraints {
290+
BoxWithConstraints(
291+
modifier = modifier
292+
) {
286293
val pageCount = 3
287294
val pagerState = rememberPagerState{ pageCount }
288295
if (this.isWideLayout) {

libs/horizon/src/main/java/com/instructure/horizon/features/dashboard/widget/DashboardWidgetCard.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import androidx.compose.foundation.layout.Column
2323
import androidx.compose.foundation.layout.ColumnScope
2424
import androidx.compose.foundation.layout.IntrinsicSize
2525
import androidx.compose.foundation.layout.Row
26-
import androidx.compose.foundation.layout.Spacer
2726
import androidx.compose.foundation.layout.fillMaxWidth
2827
import androidx.compose.foundation.layout.padding
2928
import androidx.compose.foundation.layout.size
@@ -41,6 +40,7 @@ import androidx.compose.ui.res.painterResource
4140
import androidx.compose.ui.res.stringResource
4241
import androidx.compose.ui.semantics.clearAndSetSemantics
4342
import androidx.compose.ui.semantics.contentDescription
43+
import androidx.compose.ui.semantics.semantics
4444
import androidx.compose.ui.text.style.TextOverflow
4545
import androidx.compose.ui.tooling.preview.Preview
4646
import androidx.compose.ui.unit.dp
@@ -82,6 +82,10 @@ fun DashboardWidgetCard(
8282
contentDescription =
8383
context.getString(R.string.a11y_dashboardWidgetLoadingContentDescription, title)
8484
}
85+
}.conditional(!isLoading) {
86+
semantics {
87+
contentDescription = ""
88+
}
8589
},
8690
onClick
8791
) {

libs/horizon/src/main/java/com/instructure/horizon/features/dashboard/widget/announcement/DashboardAnnouncementBannerWidget.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.compose.runtime.Composable
2020
import androidx.compose.runtime.LaunchedEffect
2121
import androidx.compose.runtime.collectAsState
2222
import androidx.compose.runtime.getValue
23+
import androidx.compose.ui.Modifier
2324
import androidx.compose.ui.res.stringResource
2425
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
2526
import androidx.navigation.NavHostController
@@ -38,7 +39,8 @@ fun DashboardAnnouncementBannerWidget(
3839
mainNavController: NavHostController,
3940
homeNavController: NavHostController,
4041
shouldRefresh: Boolean,
41-
refreshState: MutableStateFlow<List<Boolean>>
42+
refreshState: MutableStateFlow<List<Boolean>>,
43+
modifier: Modifier = Modifier,
4244
) {
4345
val viewModel = hiltViewModel<DashboardAnnouncementBannerViewModel>()
4446
val state by viewModel.uiState.collectAsState()
@@ -53,7 +55,7 @@ fun DashboardAnnouncementBannerWidget(
5355
}
5456

5557
if (state.state != DashboardItemState.SUCCESS || state.cardState.items.isNotEmpty()) {
56-
DashboardAnnouncementBannerSection(state, mainNavController, homeNavController)
58+
DashboardAnnouncementBannerSection(state, mainNavController, homeNavController, modifier)
5759
}
5860
}
5961

@@ -62,13 +64,15 @@ fun DashboardAnnouncementBannerSection(
6264
state: DashboardAnnouncementBannerUiState,
6365
mainNavController: NavHostController,
6466
homeNavController: NavHostController,
67+
modifier: Modifier = Modifier,
6568
) {
6669
when (state.state) {
6770
DashboardItemState.LOADING -> {
6871
DashboardPaginatedWidgetCard(
6972
DashboardPaginatedWidgetCardState.Loading,
7073
mainNavController,
7174
homeNavController,
75+
modifier
7276
)
7377
}
7478
DashboardItemState.ERROR -> {
@@ -79,13 +83,15 @@ fun DashboardAnnouncementBannerSection(
7983
false,
8084
DashboardWidgetPageState.Empty,
8185
{ state.onRefresh {} },
86+
modifier
8287
)
8388
}
8489
DashboardItemState.SUCCESS -> {
8590
DashboardPaginatedWidgetCard(
8691
state.cardState,
8792
mainNavController,
8893
homeNavController,
94+
modifier
8995
)
9096
}
9197
}

libs/horizon/src/main/java/com/instructure/horizon/features/dashboard/widget/course/DashboardCourseSection.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import androidx.compose.ui.Alignment
3535
import androidx.compose.ui.Modifier
3636
import androidx.compose.ui.layout.onGloballyPositioned
3737
import androidx.compose.ui.res.stringResource
38+
import androidx.compose.ui.semantics.contentDescription
39+
import androidx.compose.ui.semantics.semantics
3840
import androidx.compose.ui.unit.dp
3941
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
4042
import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -70,7 +72,8 @@ fun DashboardCourseSection(
7072
mainNavController: NavHostController,
7173
homeNavController: NavHostController,
7274
shouldRefresh: Boolean,
73-
refreshState: MutableStateFlow<List<Boolean>>
75+
refreshState: MutableStateFlow<List<Boolean>>,
76+
modifier: Modifier = Modifier,
7477
) {
7578
val viewModel = hiltViewModel<DashboardCourseViewModel>()
7679
val state by viewModel.uiState.collectAsState()
@@ -84,29 +87,30 @@ fun DashboardCourseSection(
8487
}
8588
}
8689

87-
DashboardCourseSection(state, mainNavController, homeNavController)
90+
DashboardCourseSection(state, mainNavController, homeNavController, modifier)
8891
}
8992

9093
@Composable
9194
fun DashboardCourseSection(
9295
state: DashboardCourseUiState,
9396
mainNavController: NavHostController,
94-
homeNavController: NavHostController
97+
homeNavController: NavHostController,
98+
modifier: Modifier = Modifier,
9599
) {
96100
when(state.state) {
97101
DashboardItemState.LOADING -> {
98102
DashboardCourseCardContent(
99103
DashboardCourseCardState.Loading,
100104
{ handleClickAction(it, mainNavController, homeNavController) },
101105
true,
102-
modifier = Modifier.padding(horizontal = 24.dp)
106+
modifier = modifier.padding(horizontal = 24.dp)
103107
)
104108
}
105109
DashboardItemState.ERROR -> {
106-
DashboardCourseCardError({state.onRefresh {} }, Modifier.padding(horizontal = 24.dp))
110+
DashboardCourseCardError({state.onRefresh {} }, modifier.padding(horizontal = 24.dp))
107111
}
108112
DashboardItemState.SUCCESS -> {
109-
DashboardCourseSectionContent(state, mainNavController, homeNavController)
113+
DashboardCourseSectionContent(state, mainNavController, homeNavController, modifier)
110114
}
111115
}
112116
}
@@ -115,13 +119,15 @@ fun DashboardCourseSection(
115119
private fun DashboardCourseSectionContent(
116120
state: DashboardCourseUiState,
117121
mainNavController: NavHostController,
118-
homeNavController: NavHostController
122+
homeNavController: NavHostController,
123+
modifier: Modifier = Modifier,
119124
) {
120125
// Display 4 cards at most
121126
val pagerState = rememberPagerState { min(4, state.courses.size) }
122127

123128
Column(
124129
horizontalAlignment = Alignment.CenterHorizontally,
130+
modifier = modifier
125131
) {
126132
if (state.programs.items.isNotEmpty()) {
127133
DashboardPaginatedWidgetCard(
@@ -151,6 +157,9 @@ private fun DashboardCourseSectionContent(
151157
val cardHeight = coordinates.size.height
152158
if (cardHeight > maxCardHeight) { maxCardHeight = cardHeight }
153159
}
160+
.semantics {
161+
contentDescription = ""
162+
}
154163
)
155164
}
156165
else -> {
@@ -164,7 +173,6 @@ private fun DashboardCourseSectionContent(
164173
}
165174
}
166175
}
167-
168176
}
169177

170178
Button(

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/ModuleItemSequenceScreen.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ import androidx.compose.ui.layout.onGloballyPositioned
6868
import androidx.compose.ui.platform.LocalContext
6969
import androidx.compose.ui.platform.LocalDensity
7070
import androidx.compose.ui.res.stringResource
71+
import androidx.compose.ui.semantics.hideFromAccessibility
72+
import androidx.compose.ui.semantics.semantics
7173
import androidx.compose.ui.text.style.TextAlign
7274
import androidx.compose.ui.text.style.TextOverflow
7375
import androidx.compose.ui.tooling.preview.Preview
@@ -326,7 +328,12 @@ private fun ModuleHeaderContainer(
326328
) {
327329
Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) {
328330
Row {
329-
IconButton(iconRes = R.drawable.arrow_back, color = IconButtonColor.Institution, onClick = onBackPressed)
331+
IconButton(
332+
iconRes = R.drawable.arrow_back,
333+
contentDescription = stringResource(R.string.a11yNavigateBack),
334+
color = IconButtonColor.Institution,
335+
onClick = onBackPressed
336+
)
330337
Column(
331338
modifier = Modifier
332339
.weight(1f)
@@ -350,6 +357,7 @@ private fun ModuleHeaderContainer(
350357
}
351358
IconButton(
352359
iconRes = R.drawable.list_alt,
360+
contentDescription = stringResource(R.string.myProgress),
353361
color = IconButtonColor.Institution,
354362
onClick = uiState.onProgressClick
355363
)
@@ -365,7 +373,16 @@ private fun ModuleHeaderContainer(
365373
if (index < uiState.currentItem?.detailTags?.lastIndex.orDefault()) listOf(item, "|") else listOf(item)
366374
}
367375
separatedFlowRowItems.forEach {
368-
Text(text = it, style = HorizonTypography.p2, color = HorizonColors.Text.surfaceColored())
376+
Text(
377+
text = it,
378+
style = HorizonTypography.p2,
379+
color = HorizonColors.Text.surfaceColored(),
380+
modifier = Modifier.semantics {
381+
if (it == "|") {
382+
hideFromAccessibility()
383+
}
384+
}
385+
)
369386
}
370387
}
371388
}

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/content/assignment/attempts/AttemptSelectorBottomSheet.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ fun AttemptSelectorBottomSheet(
7474
Box(modifier = Modifier.padding(start = 24.dp, end = 24.dp, top = 24.dp)) {
7575
IconButton(
7676
iconRes = R.drawable.close,
77+
contentDescription = stringResource(R.string.a11y_close),
7778
color = IconButtonColor.Inverse,
7879
modifier = Modifier
7980
.align(Alignment.CenterEnd)

libs/horizon/src/main/java/com/instructure/horizon/features/moduleitemsequence/content/assignment/comments/CommentsDialog.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ fun CommentsDialog(
103103
Box(modifier = Modifier.padding(start = 24.dp, end = 24.dp, top = 24.dp)) {
104104
IconButton(
105105
iconRes = R.drawable.close,
106+
contentDescription = stringResource(R.string.a11y_close),
106107
color = IconButtonColor.Inverse,
107108
modifier = Modifier
108109
.align(Alignment.CenterEnd)

0 commit comments

Comments
 (0)