mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Set selection to end of text input on accessibility click
Summary: When we render a text input that already has a text value (<TextInput value="123" />), its selection (cursor) is automatically set to the end of the text. However, when you swipe to focus the text input with TalkBack, Android decides it needs to clear the selection, which moves the cursor back to the beginning of the text input. This is probably not what you want if you're editing some text that's already there. Ideally we would just keep the selection at the end, but I don't know how to prevent this from happening - it seems to be part of how TextView handles the accessibility focus event? So instead I'm just explicitly setting the selection to the end of the text in our handler for accessibility click. Changelog: [Android][Fixed] Move selection to the end of the text input on accessibility click Reviewed By: mdvacca Differential Revision: D23441077 fbshipit-source-id: 16964f5b106637e55a98c6b0ef0f0041e8e6215d
This commit is contained in:
committed by
Facebook GitHub Bot
parent
5fdb558104
commit
f0e80ae229
@@ -199,6 +199,37 @@ public class TextInputTestCase extends ReactAppInstrumentationTestCase {
|
||||
assertFalse(reactEditText.isFocused());
|
||||
}
|
||||
|
||||
public void testAccessibilityFocus_notEmpty_selectionSetAtEnd() throws Throwable {
|
||||
String testId = "textInput1";
|
||||
String text = "Testing";
|
||||
|
||||
final ReactEditText reactEditText = getViewByTestId(testId);
|
||||
reactEditText.setText(text);
|
||||
runTestOnUiThread(
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
reactEditText.clearFocus();
|
||||
}
|
||||
});
|
||||
waitForBridgeAndUIIdle();
|
||||
assertFalse(reactEditText.isFocused());
|
||||
assertEquals(0, reactEditText.getSelectionStart());
|
||||
|
||||
runTestOnUiThread(
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
reactEditText.performAccessibilityAction(
|
||||
AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
|
||||
reactEditText.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, null);
|
||||
}
|
||||
});
|
||||
waitForBridgeAndUIIdle();
|
||||
assertTrue(reactEditText.isFocused());
|
||||
assertEquals(text.length(), reactEditText.getSelectionStart());
|
||||
}
|
||||
|
||||
private void fireEditorActionAndCheckRecording(
|
||||
final ReactEditText reactEditText, final int actionId) throws Throwable {
|
||||
fireEditorActionAndCheckRecording(reactEditText, actionId, true);
|
||||
|
||||
Reference in New Issue
Block a user