Loading core/java/android/view/View.java +9 −0 Original line number Diff line number Diff line Loading @@ -14649,6 +14649,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int selectionStart; int selectionEnd; if (extendSelection && isAccessibilitySelectionExtendable()) { prepareForExtendedAccessibilitySelection(); selectionStart = getAccessibilitySelectionStart(); if (selectionStart == ACCESSIBILITY_CURSOR_POSITION_UNDEFINED) { selectionStart = forward ? segmentStart : segmentEnd; Loading Loading @@ -14687,6 +14688,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } /** * Prepare for extended selection. * @hide */ public void prepareForExtendedAccessibilitySelection() { return; } /** * @hide */ core/java/android/widget/TextView.java +30 −10 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; } } Loading Loading @@ -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; } Loading Loading @@ -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 Loading Loading @@ -13703,6 +13712,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return true; } /** * @hide */ public void prepareForExtendedAccessibilitySelection() { requestFocusOnNonEditableSelectableText(); } /** * @hide */ Loading @@ -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(); Loading
core/java/android/view/View.java +9 −0 Original line number Diff line number Diff line Loading @@ -14649,6 +14649,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int selectionStart; int selectionEnd; if (extendSelection && isAccessibilitySelectionExtendable()) { prepareForExtendedAccessibilitySelection(); selectionStart = getAccessibilitySelectionStart(); if (selectionStart == ACCESSIBILITY_CURSOR_POSITION_UNDEFINED) { selectionStart = forward ? segmentStart : segmentEnd; Loading Loading @@ -14687,6 +14688,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } /** * Prepare for extended selection. * @hide */ public void prepareForExtendedAccessibilitySelection() { return; } /** * @hide */
core/java/android/widget/TextView.java +30 −10 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; } } Loading Loading @@ -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; } Loading Loading @@ -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 Loading Loading @@ -13703,6 +13712,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return true; } /** * @hide */ public void prepareForExtendedAccessibilitySelection() { requestFocusOnNonEditableSelectableText(); } /** * @hide */ Loading @@ -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();