[SuwLib] Tap on list items must always register

When talkback is enabled, sometimes tap on list items does not result in
the whole item being selected by talkback. (No green border around the
item)

- This was caused because focus was enabled on richtextviews by
  ExploreByTouchHelper.
- Fix is to avoid creating LinkAccessibilityHelper when focus is
  disabled and text has no links

bug:29538956
Change-Id: I795a1f621635e8e8e5ee2fa60d2eafc02144b84a
This commit is contained in:
Ajay Nadathur 2016-06-23 16:26:04 -07:00 committed by Maurice Lam
parent d66273847c
commit 9a3d23293e
2 changed files with 46 additions and 1 deletions

View file

@ -108,8 +108,9 @@ public class RichTextView extends TextView {
// Set text first before doing anything else because setMovementMethod internally calls
// setText. This in turn ends up calling this method with mText as the first parameter
super.setText(text, type);
boolean hasLinks = hasLinks(text);
if (hasLinks(text)) {
if (hasLinks) {
// When a TextView has a movement method, it will set the view to clickable. This makes
// View.onTouchEvent always return true and consumes the touch event, essentially
// nullifying any return values of MovementMethod.onTouchEvent.
@ -119,6 +120,11 @@ public class RichTextView extends TextView {
} else {
setMovementMethod(null);
}
// ExploreByTouchHelper automatically enables focus for RichTextView
// even though it may not have any links. Causes problems during talkback
// as individual TextViews consume touch events and thereby reducing the focus window
// shown by Talkback. Disable focus if there are no links
setFocusable(hasLinks);
}
private boolean hasLinks(CharSequence text) {

View file

@ -72,4 +72,43 @@ public class RichTextViewTest extends AndroidTestCase {
assertTrue("The span should be a TextAppearanceSpan",
spans[0] instanceof TextAppearanceSpan);
}
@SmallTest
public void testTextContaininingLinksAreFocusable() {
Annotation testLink = new Annotation("link", "value");
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("Linked");
spannableStringBuilder.setSpan(testLink, 0, 3, 0);
RichTextView view = new RichTextView(getContext());
view.setText(spannableStringBuilder);
assertTrue("TextView should be focusable since it contains spans", view.isFocusable());
}
@SmallTest
public void testTextContainingNoLinksAreNotFocusable() {
RichTextView textView = new RichTextView(getContext());
textView.setText("Thou shall not be focusable!");
assertFalse("TextView should not be focusable since it does not contain any span",
textView.isFocusable());
}
// Based on the text contents of the text view, the "focusable" property of the element
// should also be automatically changed.
@SmallTest
public void testRichTxtViewFocusChangesWithTextChange() {
RichTextView textView = new RichTextView(getContext());
textView.setText("Thou shall not be focusable!");
assertFalse(textView.isFocusable());
SpannableStringBuilder spannableStringBuilder =
new SpannableStringBuilder("I am focusable");
spannableStringBuilder.setSpan(new Annotation("link", "focus:on_me"), 0, 1, 0);
textView.setText(spannableStringBuilder);
assertTrue(textView.isFocusable());
}
}