Status Update
Comments
si...@google.com <si...@google.com>
al...@lyft.com <al...@lyft.com> #2
Are you sure this is obsolete? I don't see a maxLength
argument on BasicTextField
or anything similar.
si...@google.com <si...@google.com> #3
oh, i actually missed why I created the issue. maxLength is something that can be done via the TextField callback. however the issue was with providing a default text limit to TextField for mainly performance.
Thanks for the ping, I agree with you now.
al...@gmail.com <al...@gmail.com> #4
Thanks! Yes, I agree that workaround works mostly fine (and it is what we are doing now in our own design system library). However, I think the workaround has one issue (aside from performance)... once the user reaches the max length, the workaround ensures that the display won't render any new characters. However, I believe those keystrokes are still being reported to the InputMethodService because I see the keyboard auto-suggestions briefly updating for a split second. Not completely sure the implications of this on keyboards but worth noting.
an...@gmail.com <an...@gmail.com> #5
al...@gmail.com <al...@gmail.com> #6
This issue is also important for accessibility. When the maximum length is reached, Talkback should automatically announce "Maximum length reached" like it does with views.
al...@gmail.com <al...@gmail.com> #7
ha...@google.com <ha...@google.com> #8
BasicTextField2 introduces InputTransformation
API that has a prefab maxLengthInChars
and maxLengthInCodepoints
factory functions. These will correctly update the IME whenever the max length is reached. Current BasicTextField holds 3 states including the hoisted one that does the filtering. Before filtering is committed in the next composition, IME for a brief period of time thinks that every key stroke is accepted by the editor. InputTransformation
prevents this by executing the callback at the right time.
Also, thanks for pointing out the maxLength a11y node info property. We will take this into account.
ap...@google.com <ap...@google.com> #9
Branch: androidx-main
commit fc0d3637cd2030cde12f4eb00c687d6f46dd97e7
Author: Halil Ozercan <halilibo@google.com>
Date: Fri Feb 09 14:53:31 2024
Add MaxTextLength to semantics for a11y
MaxTextLength is used by talkback to announce that the text field has reached its maximum length. Current TextField APIs fully hoist the filtering mechanism, so it's not possible to infer whether a max length filter is applied. Devs will need to explicitly add this info to their semantics.
A follow-up CL will address this requirement for the new BasicTextField(state).
Bug: 170648072
Test: gradle :compose:ui:ui:cAT
Relnote: "Add `maxTextLength` semantics property that should be set on text fields that filter the maximum allowed number of characters."
Change-Id: I24d9f6b2aa6f1e94b67847464314480dd80e8245
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/AndroidComposeViewAccessibilityDelegateCompatTest.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
M compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
ap...@google.com <ap...@google.com> #10
Branch: androidx-main
commit 17ed60946fd0000d84dd81f318577b2d389951a9
Author: Halil Ozercan <halilibo@google.com>
Date: Fri Feb 09 15:27:14 2024
Semantics override for InputTransformation
With the addition of MaxTextLength semantics property, MaxLengthFilter should also be able to change the semantics of the `BasicTextField2` that it's attached to. Moreover, any custom `InputTransformation` may have different semantics implications. Rather than adding extra semantics modifiers to TextFields, `InputTransformation` should be able to influence the semantics organically.
Bug: 170648072
Test: gradle :compose:foundation:foundation:cAT
Relnote: "Add an optional `applySemantics` function to `InputTransformation` to influence the semantics of the `BasicTextField2` that it's applied to."
Change-Id: I74a2f4db178fe2660862749f10367bac57761ae9
M compose/foundation/foundation/api/current.txt
M compose/foundation/foundation/api/restricted_current.txt
M compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/input/BasicTextFieldSemanticsTest.kt
M compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/input/InputTransformationTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/InputTransformation.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/input/internal/TextFieldDecoratorModifier.kt
ha...@google.com <ha...@google.com> #11
I'm closing this issue since we now ship a prefab InputTransformation.maxLength
that also applies MaxTextLength semantics.
Description
We should put a maxLength into TextField and set a default value.