Merge "Fixing the accessibility text traversal in extend mode." into jb-mr2-dev
This commit is contained in:
@ -7069,7 +7069,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT);
|
||||
final boolean extendSelection = arguments.getBoolean(
|
||||
AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN);
|
||||
return nextAtGranularity(granularity, extendSelection);
|
||||
return traverseAtGranularity(granularity, true, extendSelection);
|
||||
}
|
||||
} break;
|
||||
case AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY: {
|
||||
@ -7078,7 +7078,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT);
|
||||
final boolean extendSelection = arguments.getBoolean(
|
||||
AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN);
|
||||
return previousAtGranularity(granularity, extendSelection);
|
||||
return traverseAtGranularity(granularity, false, extendSelection);
|
||||
}
|
||||
} break;
|
||||
case AccessibilityNodeInfo.ACTION_SET_SELECTION: {
|
||||
@ -7103,7 +7103,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean nextAtGranularity(int granularity, boolean extendSelection) {
|
||||
private boolean traverseAtGranularity(int granularity, boolean forward,
|
||||
boolean extendSelection) {
|
||||
CharSequence text = getIterableTextForAccessibility();
|
||||
if (text == null || text.length() == 0) {
|
||||
return false;
|
||||
@ -7114,60 +7115,29 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
}
|
||||
int current = getAccessibilitySelectionEnd();
|
||||
if (current == ACCESSIBILITY_CURSOR_POSITION_UNDEFINED) {
|
||||
current = 0;
|
||||
current = forward ? 0 : text.length();
|
||||
}
|
||||
final int[] range = iterator.following(current);
|
||||
final int[] range = forward ? iterator.following(current) : iterator.preceding(current);
|
||||
if (range == null) {
|
||||
return false;
|
||||
}
|
||||
final int start = range[0];
|
||||
final int end = range[1];
|
||||
final int segmentStart = range[0];
|
||||
final int segmentEnd = range[1];
|
||||
int selectionStart;
|
||||
int selectionEnd;
|
||||
if (extendSelection && isAccessibilitySelectionExtendable()) {
|
||||
int selectionStart = getAccessibilitySelectionStart();
|
||||
selectionStart = getAccessibilitySelectionStart();
|
||||
if (selectionStart == ACCESSIBILITY_CURSOR_POSITION_UNDEFINED) {
|
||||
selectionStart = start;
|
||||
selectionStart = forward ? segmentStart : segmentEnd;
|
||||
}
|
||||
setAccessibilitySelection(selectionStart, end);
|
||||
selectionEnd = forward ? segmentEnd : segmentStart;
|
||||
} else {
|
||||
setAccessibilitySelection(end, end);
|
||||
selectionStart = selectionEnd= forward ? segmentEnd : segmentStart;
|
||||
}
|
||||
sendViewTextTraversedAtGranularityEvent(
|
||||
AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
|
||||
granularity, start, end);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean previousAtGranularity(int granularity, boolean extendSelection) {
|
||||
CharSequence text = getIterableTextForAccessibility();
|
||||
if (text == null || text.length() == 0) {
|
||||
return false;
|
||||
}
|
||||
TextSegmentIterator iterator = getIteratorForGranularity(granularity);
|
||||
if (iterator == null) {
|
||||
return false;
|
||||
}
|
||||
int current = getAccessibilitySelectionStart();
|
||||
if (current == ACCESSIBILITY_CURSOR_POSITION_UNDEFINED) {
|
||||
current = text.length();
|
||||
}
|
||||
final int[] range = iterator.preceding(current);
|
||||
if (range == null) {
|
||||
return false;
|
||||
}
|
||||
final int start = range[0];
|
||||
final int end = range[1];
|
||||
if (extendSelection && isAccessibilitySelectionExtendable()) {
|
||||
int selectionEnd = getAccessibilitySelectionEnd();
|
||||
if (selectionEnd == ACCESSIBILITY_CURSOR_POSITION_UNDEFINED) {
|
||||
selectionEnd = end;
|
||||
}
|
||||
setAccessibilitySelection(start, selectionEnd);
|
||||
} else {
|
||||
setAccessibilitySelection(start, start);
|
||||
}
|
||||
sendViewTextTraversedAtGranularityEvent(
|
||||
AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY,
|
||||
granularity, start, end);
|
||||
setAccessibilitySelection(selectionStart, selectionEnd);
|
||||
final int action = forward ? AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
|
||||
: AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
|
||||
sendViewTextTraversedAtGranularityEvent(action, granularity, segmentStart, segmentEnd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1248,7 +1248,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
|
||||
if (eventTypeCount > 0) {
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append("TYPE_CURRENT_AT_GRANULARITY_MOVEMENT_CHANGED");
|
||||
builder.append("TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY");
|
||||
eventTypeCount++;
|
||||
} break;
|
||||
case TYPE_GESTURE_DETECTION_START: {
|
||||
|
@ -8722,8 +8722,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
&& getAccessibilitySelectionEnd() == end) {
|
||||
return;
|
||||
}
|
||||
// Hide all selection controllers used for adjusting selection
|
||||
// since we are doing so explicitlty by other means and these
|
||||
// controllers interact with how selection behaves.
|
||||
if (mEditor != null) {
|
||||
mEditor.hideControllers();
|
||||
}
|
||||
CharSequence text = getIterableTextForAccessibility();
|
||||
if (start >= 0 && start <= end && end <= text.length()) {
|
||||
if (Math.min(start, end) >= 0 && Math.max(start, end) <= text.length()) {
|
||||
Selection.setSelection((Spannable) text, start, end);
|
||||
} else {
|
||||
Selection.removeSelection((Spannable) text);
|
||||
|
Reference in New Issue
Block a user