Status Update
Comments
ha...@google.com <ha...@google.com>
ae...@google.com <ae...@google.com> #2
Branch: androidx-master-dev
commit c60f33e229e31ab328ef6b59dab63b264954831c
Author: Alexandre Elias <aelias@google.com>
Date: Fri Jul 10 16:23:09 2020
Semantics no-op cleanups
Partly in response to lmr's broad code review, I did a pass of
superficial API/implementation cleanup. The main changes are:
- I changed each Boolean SemanticsProperty where false is equivalent to
not being present to take "Unit" instead. This is conceptually
clearer: it avoids questions like "can I cancel out a semantics from a
merged child by setting it to false?" Because "property = Unit" looks
weird, I also changed the style of these to "property()".
- I moved the Semantics id generator closer to where it's used, in
SemanticsModifierCore. I made it internal and an AtomicInt.
(Note that integer ids are heavily used in the Android
AccessibilityNodeInfo APIs so I can't simply remove them entirely.)
- I deleted dead code. Some examples include SemanticsHintOverrides,
a public API not connected to anything, and SemanticsPropertyKey
merge() open method which is never called. (In both cases I have
a different plan in mind for accessibility.)
Fixes: 145951226
Fixes: 145955412
Test: existing tests
Relnote: "Single-value semantics properties now use a calling style.
For example, 'semantics { hidden = true }' is now written as:
'semantics { hidden() }'."
Change-Id: Ic1afd12ea22c926babc9662f1804d80b33aa0cfc
M ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/LayoutNodeModifierBenchmark.kt
M ui/ui-core/api/0.1.0-dev15.txt
M ui/ui-core/api/current.txt
M ui/ui-core/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-core/api/public_plus_experimental_current.txt
M ui/ui-core/api/restricted_0.1.0-dev15.txt
M ui/ui-core/api/restricted_current.txt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/graphics/vector/VectorTest.kt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/semantics/SemanticsTests.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidActuals.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeView.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidPopup.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/Expect.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsConfiguration.kt
D ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsHintOverrides.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsModifier.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsOwner.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsWrapper.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
M ui/ui-foundation/api/0.1.0-dev15.txt
M ui/ui-foundation/api/current.txt
M ui/ui-foundation/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-foundation/api/public_plus_experimental_current.txt
M ui/ui-foundation/api/restricted_0.1.0-dev15.txt
M ui/ui-foundation/api/restricted_current.txt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Dialog.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Selectable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/semantics/FoundationSemanticsProperties.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CardTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/RadioButtonScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ripple/RippleIndicationTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
M ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
M ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/AssertsTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/CallSemanticsActionTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/FindersTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ScrollToTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
M ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
M ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
M ui/ui-text/api/0.1.0-dev15.txt
M ui/ui-text/api/current.txt
M ui/ui-text/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-text/api/public_plus_experimental_current.txt
M ui/ui-text/api/restricted_0.1.0-dev15.txt
M ui/ui-text/api/restricted_current.txt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/TextSemanticsProperties.kt
ap...@google.com <ap...@google.com> #3
Branch: androidx-main
commit c143a80f296dec3193417b9f839dfbb63896a753
Author: Alexandre Elias <aelias@google.com>
Date: Thu Nov 23 02:34:19 2023
A11y importance, visibility and pruning improvements
1. Make isTraversalGroup and traversalIndex no longer be marked
AccessibilityKey (that is, no longer be important nor prune nodes
under them, if they are the only semantics on a node).
2. Make hittesting and pruning algorithm consistent with each other: now
they both skip over unimportant and invisible nodes (previously,
hittesting only skipped invisible and pruning only skipped
unimportant).
- Likewise improve consistency by making screenReaderFocusable
take visibility into account (although it still retains a
distinct concept of "speaking" as a substitute for importance).
Also includes the following API additions, which help implement the
above without breaking any behavior:
- New property isOpaque, so that nonclickable Material Surfaces can
continue to prune even if they have no other semantics than
isContainer on them.
- New experimental SemanticsPropertyReceiver.unset to remove individual
properties, which is needed for 'isContainer = false' to avoid the
side effect of pruning, and is an overdue feature that should help
avoid overuse of clearAndSetSemantics.
Bug: 317966058
Bug: 246056649
Test: 7 new tests
Relnote: "New semantics API unset() to remove semantics properties that
are added in the same modifier chain. New semantics property isOpaque."
Change-Id: I8c583e571956d1501f4df7312a4c60edae0a1bc0
M compose/ui/ui/api/current.txt
M compose/ui/ui/api/restricted_current.txt
M compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
M compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/SemanticsUtils.android.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsConfiguration.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
hu...@hotstar.com <hu...@hotstar.com> #4
Hi, I have tried the above two workarounds, the first one can work, but the second one doesn't work. Is there something I didn't set up right?
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
OverlapDemo()
}
}
@Composable
fun OverlapDemo(
modifier: Modifier = Modifier,
) {
Box(
modifier = modifier
.fillMaxWidth()
.height(300.dp)
.background(Color.Red)
) {
BottomUi()
TopUi()
}
}
@Composable
fun BottomUi() {
Button(
onClick = { },
) {
Text(text = "PLAY / PAUSE")
}
}
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun TopUi(
modifier: Modifier = Modifier,
) {
ConstraintLayout(
modifier = modifier.fillMaxSize().semantics { invisibleToUser() },
) {
val (button) = createRefs()
Button(
onClick = { },
modifier = Modifier.constrainAs(button) {
bottom.linkTo(parent.bottom)
end.linkTo(parent.end)
}
) {
Text(text = "GO NEXT")
}
}
}
}
If I don't want to change the UI hierarchy, are there other workaround that solves the ConstraintLayout issue? Thanks!
ae...@google.com <ae...@google.com> #5
This issue should be fixed in Compose 1.7 (scheduled for this summer) thanks to the above patch, so marking this bug Fixed.
Hi, I have tried the above two workarounds, the first one can work, but the second one doesn't work. Is there something I didn't set up right?
It doesn't look like you did anything wrong, that workaround idea was speculation on my part.
If I don't want to change the UI hierarchy, are there other workaround that solves the ConstraintLayout issue? Thanks!
Another potential workaround is to copy-paste the ConstraintLayout
variation you are using from semantics
block. This might require recursively copying a few internal
functions as well, but it hopefully doesn't go that deep.
so...@google.com <so...@google.com>
mn...@google.com <mn...@google.com> #6
This should be fixed (again) with a
Description
Jetpack Compose version: 2023.10.01
Jetpack Compose component(s) used: ConstraintLayout
Android Studio Build: [Specify build version]
Kotlin version: 1.9.20
Steps to Reproduce or Code Sample to Reproduce:
Expected behavior: The "PLAY / PAUSE" button should receive accessibility focus. Actual behavior: The "PLAY / PAUSE" button is not receiving accessibility focus.
This issue is specific to ConstraintLayout, as replacing it with Box resolves the issue.