Skip to content

Commit

Permalink
Report ComposeAccessibleComponents as invisible if their semantics co…
Browse files Browse the repository at this point in the history
…nfig has SemanticsProperties.HideFromAccessibility (#1798)
  • Loading branch information
m-sasha authored Jan 27, 2025
1 parent 64eace9 commit e75bd46
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

package androidx.compose.ui.platform.a11y

import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.node.Nodes
Expand Down Expand Up @@ -359,10 +358,11 @@ internal class ComposeAccessible(
return semanticsNode.size.toAwtDimension()
}

@OptIn(ExperimentalComposeUiApi::class)
@Suppress("DEPRECATION")
override fun isVisible(): Boolean =
!semanticsConfig.contains(SemanticsProperties.InvisibleToUser) &&
!semanticsNode.outerSemanticsNode.requireCoordinator(Nodes.Semantics).isTransparent()
!semanticsNode.outerSemanticsNode.requireCoordinator(Nodes.Semantics).isTransparent() &&
!semanticsConfig.contains(SemanticsProperties.InvisibleToUser) &&
!semanticsConfig.contains(SemanticsProperties.HideFromAccessibility)

override fun isEnabled(): Boolean =
semanticsConfig.getOrNull(SemanticsProperties.Disabled) == null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import androidx.compose.ui.platform.a11y.ComposeSceneAccessible
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.SemanticsNode
import androidx.compose.ui.semantics.SemanticsOwner
import androidx.compose.ui.semantics.hideFromAccessibility
import androidx.compose.ui.semantics.isContainer
import androidx.compose.ui.semantics.isTraversalGroup
import androidx.compose.ui.semantics.role
Expand All @@ -55,6 +56,7 @@ import javax.accessibility.AccessibleComponent
import javax.accessibility.AccessibleContext
import javax.accessibility.AccessibleRole
import javax.accessibility.AccessibleText
import kotlin.test.assertFalse
import kotlin.test.fail
import kotlinx.coroutines.test.StandardTestDispatcher
import org.junit.Assert.assertEquals
Expand Down Expand Up @@ -173,6 +175,23 @@ class AccessibilityTest {
test.onNodeWithTag("box").assertHasAccessibleRole(AccessibleRole.GROUP_BOX)
}

@Test
fun hideFromA11yMakesComponentInvisible() = runDesktopA11yTest {
test.setContent {
Text(
text = "Hello",
modifier = Modifier.testTag("text")
.semantics {
hideFromAccessibility()
}
)
}

assertFalse("Component should be invisible to accessibility, but isn't") {
test.onNodeWithTag("text").fetchAccessibleComponent().isVisible
}
}

@Test
fun accessibleComponentBoundsAreUpdated() = runDesktopA11yTest {
var size by mutableStateOf(DpSize(100.dp, 110.dp))
Expand Down

0 comments on commit e75bd46

Please sign in to comment.