Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Reland fixes Android text field to use hint text for accessibility #37093

Merged
merged 2 commits into from
Oct 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 42 additions & 10 deletions shell/platform/android/io/flutter/view/AccessibilityBridge.java
Original file line number Diff line number Diff line change
Expand Up @@ -885,7 +885,10 @@ && shouldSetCollectionInfo(semanticsNode)) {
// Scopes routes are not focusable, only need to set the content
// for non-scopes-routes semantics nodes.
if (semanticsNode.hasFlag(Flag.IS_TEXT_FIELD)) {
result.setText(semanticsNode.getValueLabelHint());
result.setText(semanticsNode.getValue());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
result.setHintText(semanticsNode.getTextFieldHint());
}
} else if (!semanticsNode.hasFlag(Flag.SCOPES_ROUTE)) {
CharSequence content = semanticsNode.getValueLabelHint();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
Expand Down Expand Up @@ -2773,18 +2776,47 @@ private float max(float a, float b, float c, float d) {
return Math.max(a, Math.max(b, Math.max(c, d)));
}

private CharSequence getValueLabelHint() {
CharSequence[] array;
private CharSequence getValue() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return value;
} else {
return createSpannableString(value, valueAttributes);
}
}

private CharSequence getLabel() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
array = new CharSequence[] {value, label, hint};
return label;
} else {
array =
new CharSequence[] {
createSpannableString(value, valueAttributes),
createSpannableString(label, labelAttributes),
createSpannableString(hint, hintAttributes),
};
return createSpannableString(label, labelAttributes);
}
}

private CharSequence getHint() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return hint;
} else {
return createSpannableString(hint, hintAttributes);
}
}

private CharSequence getValueLabelHint() {
CharSequence[] array = new CharSequence[] {getValue(), getLabel(), getHint()};
CharSequence result = null;
for (CharSequence word : array) {
if (word != null && word.length() > 0) {
if (result == null || result.length() == 0) {
result = word;
} else {
result = TextUtils.concat(result, ", ", word);
}
}
}
return result;
}

private CharSequence getTextFieldHint() {
CharSequence[] array = new CharSequence[] {getLabel(), getHint()};
CharSequence result = null;
for (CharSequence word : array) {
if (word != null && word.length() > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,19 +76,23 @@ public void itDescribesNonTextFieldsWithAContentDescription() {
assertEquals(nodeInfo.getText(), null);
}

@TargetApi(26)
@Test
public void itDescribesTextFieldsWithText() {
public void itDescribesTextFieldsWithTextAndHint() {
AccessibilityBridge accessibilityBridge = setUpBridge();

TestSemanticsNode testSemanticsNode = new TestSemanticsNode();
testSemanticsNode.label = "Hello, World";
testSemanticsNode.value = "Hello, World";
testSemanticsNode.label = "some label";
testSemanticsNode.hint = "some hint";
testSemanticsNode.addFlag(AccessibilityBridge.Flag.IS_TEXT_FIELD);
TestSemanticsUpdate testSemanticsUpdate = testSemanticsNode.toUpdate();
testSemanticsUpdate.sendUpdateToBridge(accessibilityBridge);
AccessibilityNodeInfo nodeInfo = accessibilityBridge.createAccessibilityNodeInfo(0);

assertEquals(nodeInfo.getContentDescription(), null);
assertEquals(nodeInfo.getText().toString(), "Hello, World");
assertEquals(nodeInfo.getHintText().toString(), "some label, some hint");
}

@Test
Expand Down