summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
authorSally <sallyyuen@google.com>2022-03-15 17:33:40 +0000
committerSally <sallyyuen@google.com>2022-03-16 22:01:19 +0000
commit55022a5880614ff6f048ab622160059a164e83b1 (patch)
tree20eb5ca95207a69d6df53ed4138c5b413bb5b53e /core/java/android/widget/TextView.java
parentfe5ac369f95d2350ff9183f8226b09facbbaeb95 (diff)
Fixes for a11y selection
- TextView should request focus before performing selection on non-editable text, since selection requires focus. On the a11y service side, input focus should not matter when selecting non-editable text. - Remove clickable and long-clickable states, since these are present due to TextView#setTextIsSelectable. - Make UI controller changes consistent between SET_SiELECTION and SET_TEXT. Using SET_SELECTION means the action mode menu won't pop up and the left/right selection handles won't appear. Interactions between multiple EditTexts were previously inconsistent - Delete some obsolete javadoc Bug: 218357385 Test: builds and install: highlighting is consistent between SET actions. highlighting works when selecting text in TalkBack, without the service needing to purposely put input focus, atest AccessibilityTextTraverssalText Change-Id: I67986020aa112d45bd670f77b2b415617226c094
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r--core/java/android/widget/TextView.java40
1 files changed, 30 insertions, 10 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 3c8fcb978fbd..6f83a45ce7c6 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -12363,9 +12363,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
// A view should not be exposed as clickable/long-clickable to a service because of a
- // LinkMovementMethod.
+ // LinkMovementMethod or because it has selectable and non-editable text.
if ((info.isClickable() || info.isLongClickable())
- && mMovement instanceof LinkMovementMethod) {
+ && (mMovement instanceof LinkMovementMethod
+ || (isTextSelectable() && !isTextEditable()))) {
if (!hasOnClickListeners()) {
info.setClickable(false);
info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK);
@@ -12597,11 +12598,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return true;
}
if (start >= 0 && start <= end && end <= text.length()) {
+ requestFocusOnNonEditableSelectableText();
Selection.setSelection((Spannable) text, start, end);
- // Make sure selection mode is engaged.
- if (mEditor != null) {
- mEditor.startSelectionActionModeAsync(false);
- }
+ hideAccessibilitySelectionControllers();
return true;
}
}
@@ -12695,6 +12694,18 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return handled;
}
+ private void requestFocusOnNonEditableSelectableText() {
+ if (!isTextEditable() && isTextSelectable()) {
+ if (!isEnabled()) {
+ return;
+ }
+
+ if (isFocusable() && !isFocused()) {
+ requestFocus();
+ }
+ }
+ }
+
private boolean hasSpannableText() {
return mText != null && mText instanceof Spannable;
}
@@ -12723,9 +12734,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
/**
* Returns the text that should be exposed to accessibility services.
* <p>
- * This approximates what is displayed visually. If the user has specified
- * that accessibility services should speak passwords, this method will
- * bypass any password transformation method and return unobscured text.
+ * This approximates what is displayed visually.
*
* @return the text that should be exposed to accessibility services, may
* be {@code null} if no text is set
@@ -13706,6 +13715,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
/**
* @hide
*/
+ public void prepareForExtendedAccessibilitySelection() {
+ requestFocusOnNonEditableSelectableText();
+ }
+
+ /**
+ * @hide
+ */
@Override
public int getAccessibilitySelectionEnd() {
return getSelectionEnd();
@@ -13727,8 +13743,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
Selection.removeSelection((Spannable) text);
}
// Hide all selection controllers used for adjusting selection
- // since we are doing so explicitlty by other means and these
+ // since we are doing so explicitly by other means and these
// controllers interact with how selection behaves.
+ hideAccessibilitySelectionControllers();
+ }
+
+ private void hideAccessibilitySelectionControllers() {
if (mEditor != null) {
mEditor.hideCursorAndSpanControllers();
mEditor.stopTextActionMode();