diff options
author | Phil Weaver <pweaver@google.com> | 2017-05-12 06:56:16 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-05-12 06:56:16 +0000 |
commit | 15eaab36c4bfd2c7396619473dbc54138c797156 (patch) | |
tree | c61211f4a4f70cb8f294800de7ec75d9e36a58c0 /library | |
parent | 6f9823b5281b0ca6904ce1009ad958bbc6c254d4 (diff) | |
parent | cf3c368e44702164714b71fc3790c8928508b4f6 (diff) | |
download | setupwizard-15eaab36c4bfd2c7396619473dbc54138c797156.tar.gz |
Merge "Remove obsolete workaround for ClickableSpan a11y" into oc-dev
am: cf3c368e44
Change-Id: I2ffd70b5c25fecbc54a555ba20fc728a7c05685e
Diffstat (limited to 'library')
2 files changed, 143 insertions, 7 deletions
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java b/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java index e6fa497..3866551 100644 --- a/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java +++ b/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java @@ -16,14 +16,21 @@ package com.android.setupwizardlib.util; +import static android.support.v4.os.BuildCompat.isAtLeastO; + import android.graphics.Rect; import android.os.Bundle; +import android.support.v4.view.AccessibilityDelegateCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat; import android.support.v4.widget.ExploreByTouchHelper; import android.text.Layout; import android.text.Spanned; import android.text.style.ClickableSpan; import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.widget.TextView; @@ -32,6 +39,10 @@ import java.util.List; /** * An accessibility delegate that allows {@link android.text.style.ClickableSpan} to be focused and * clicked by accessibility services. + * <p> + * <strong>Note: </strong> From Android O on, there is native support for ClickableSpan + * accessibility, so this class is not needed (and indeed has no effect.) + * </p> * * <p />Sample usage: * <pre> @@ -54,19 +65,135 @@ import java.util.List; * @see com.android.setupwizardlib.view.RichTextView * @see android.support.v4.widget.ExploreByTouchHelper */ -public class LinkAccessibilityHelper extends ExploreByTouchHelper { +public class LinkAccessibilityHelper extends AccessibilityDelegateCompat { private static final String TAG = "LinkAccessibilityHelper"; private final TextView mView; private final Rect mTempRect = new Rect(); + private final ExploreByTouchHelper mExploreByTouchHelper; public LinkAccessibilityHelper(TextView view) { - super(view); + if (!isAtLeastO()) { + // Pre-O, we essentially extend ExploreByTouchHelper to expose a virtual view hierarchy + mExploreByTouchHelper = new ExploreByTouchHelper(view) { + @Override + protected int getVirtualViewAt(float x, float y) { + return this.getVirtualViewAt(x, y); + } + + @Override + protected void getVisibleVirtualViews(List<Integer> virtualViewIds) { + this.getVisibleVirtualViews(virtualViewIds); + } + + @Override + protected void onPopulateEventForVirtualView(int virtualViewId, + AccessibilityEvent event) { + this.onPopulateEventForVirtualView(virtualViewId, event); + } + + @Override + protected void onPopulateNodeForVirtualView(int virtualViewId, + AccessibilityNodeInfoCompat infoCompat) { + this.onPopulateNodeForVirtualView(virtualViewId, infoCompat); + + } + + @Override + protected boolean onPerformActionForVirtualView(int virtualViewId, int action, + Bundle arguments) { + return this.onPerformActionForVirtualView(virtualViewId, action, arguments); + } + }; + } else { + mExploreByTouchHelper = null; + } mView = view; } @Override + public void sendAccessibilityEvent(View host, int eventType) { + if (mExploreByTouchHelper != null) { + mExploreByTouchHelper.sendAccessibilityEvent(host, eventType); + } else { + super.sendAccessibilityEvent(host, eventType); + } + } + + @Override + public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) { + if (mExploreByTouchHelper != null) { + mExploreByTouchHelper.sendAccessibilityEventUnchecked(host, event); + } else { + super.sendAccessibilityEventUnchecked(host, event); + } + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) { + return (mExploreByTouchHelper != null) + ? mExploreByTouchHelper.dispatchPopulateAccessibilityEvent(host, event) + : super.dispatchPopulateAccessibilityEvent(host, event); + } + + @Override + public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) { + if (mExploreByTouchHelper != null) { + mExploreByTouchHelper.onPopulateAccessibilityEvent(host, event); + } else { + super.onPopulateAccessibilityEvent(host, event); + } + } + + @Override + public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { + if (mExploreByTouchHelper != null) { + mExploreByTouchHelper.onInitializeAccessibilityEvent(host, event); + } else { + super.onInitializeAccessibilityEvent(host, event); + } + } + + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { + if (mExploreByTouchHelper != null) { + mExploreByTouchHelper.onInitializeAccessibilityNodeInfo(host, info); + } else { + super.onInitializeAccessibilityNodeInfo(host, info); + } + } + + @Override + public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, + AccessibilityEvent event) { + return (mExploreByTouchHelper != null) + ? mExploreByTouchHelper.onRequestSendAccessibilityEvent(host, child, event) + : super.onRequestSendAccessibilityEvent(host, child, event); + } + + @Override + public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) { + return (mExploreByTouchHelper != null) + ? mExploreByTouchHelper.getAccessibilityNodeProvider(host) + : super.getAccessibilityNodeProvider(host); + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + return (mExploreByTouchHelper != null) + ? mExploreByTouchHelper.performAccessibilityAction(host, action, args) + : super.performAccessibilityAction(host, action, args); + } + + /** + * Delegated to {@link ExploreByTouchHelper} + */ + public final boolean dispatchHoverEvent(MotionEvent event) { + return (mExploreByTouchHelper != null) ? mExploreByTouchHelper.dispatchHoverEvent(event) + : false; + } + protected int getVirtualViewAt(float x, float y) { final CharSequence text = mView.getText(); if (text instanceof Spanned) { @@ -78,10 +205,9 @@ public class LinkAccessibilityHelper extends ExploreByTouchHelper { return spannedText.getSpanStart(linkSpan); } } - return INVALID_ID; + return ExploreByTouchHelper.INVALID_ID; } - @Override protected void getVisibleVirtualViews(List<Integer> virtualViewIds) { final CharSequence text = mView.getText(); if (text instanceof Spanned) { @@ -94,7 +220,6 @@ public class LinkAccessibilityHelper extends ExploreByTouchHelper { } } - @Override protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) { final ClickableSpan span = getSpanForOffset(virtualViewId); if (span != null) { @@ -105,7 +230,6 @@ public class LinkAccessibilityHelper extends ExploreByTouchHelper { } } - @Override protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat info) { final ClickableSpan span = getSpanForOffset(virtualViewId); @@ -126,7 +250,6 @@ public class LinkAccessibilityHelper extends ExploreByTouchHelper { info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK); } - @Override protected boolean onPerformActionForVirtualView(int virtualViewId, int action, Bundle arguments) { if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) { diff --git a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java b/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java index a1d01fd..e2c492a 100644 --- a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java +++ b/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java @@ -16,6 +16,8 @@ package com.android.setupwizardlib.test; +import static android.support.v4.os.BuildCompat.isAtLeastO; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -57,6 +59,7 @@ public class LinkAccessibilityHelperTest { @Test public void testGetVirtualViewAt() { + if (isAtLeastO()) return; initTextView(); final int virtualViewId = mHelper.getVirtualViewAt(dp2Px(15), dp2Px(10)); assertEquals("Virtual view ID should be 1", 1, virtualViewId); @@ -64,6 +67,7 @@ public class LinkAccessibilityHelperTest { @Test public void testGetVirtualViewAtHost() { + if (isAtLeastO()) return; initTextView(); final int virtualViewId = mHelper.getVirtualViewAt(dp2Px(100), dp2Px(100)); assertEquals("Virtual view ID should be INVALID_ID", @@ -72,6 +76,7 @@ public class LinkAccessibilityHelperTest { @Test public void testGetVisibleVirtualViews() { + if (isAtLeastO()) return; initTextView(); List<Integer> virtualViewIds = new ArrayList<>(); mHelper.getVisibleVirtualViews(virtualViewIds); @@ -82,6 +87,7 @@ public class LinkAccessibilityHelperTest { @Test public void testOnPopulateEventForVirtualView() { + if (isAtLeastO()) return; initTextView(); AccessibilityEvent event = AccessibilityEvent.obtain(); mHelper.onPopulateEventForVirtualView(1, event); @@ -95,6 +101,7 @@ public class LinkAccessibilityHelperTest { @Test public void testOnPopulateEventForVirtualViewHost() { + if (isAtLeastO()) return; initTextView(); AccessibilityEvent event = AccessibilityEvent.obtain(); mHelper.onPopulateEventForVirtualView(ExploreByTouchHelper.INVALID_ID, event); @@ -107,6 +114,7 @@ public class LinkAccessibilityHelperTest { @Test public void testOnPopulateNodeForVirtualView() { + if (isAtLeastO()) return; initTextView(); AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain(); mHelper.onPopulateNodeForVirtualView(1, info); @@ -125,6 +133,7 @@ public class LinkAccessibilityHelperTest { @Test public void testNullLayout() { + if (isAtLeastO()) return; initTextView(); // Setting the padding will cause the layout to be null-ed out. mTextView.setPadding(1, 1, 1, 1); @@ -142,6 +151,7 @@ public class LinkAccessibilityHelperTest { @Test public void testRtlLayout() { + if (isAtLeastO()) return; SpannableStringBuilder ssb = new SpannableStringBuilder("מכונה בתרגום"); ssb.setSpan(LINK_SPAN, 1, 2, 0 /* flags */); initTextView(ssb); @@ -161,6 +171,7 @@ public class LinkAccessibilityHelperTest { @Test public void testMultilineLink() { + if (isAtLeastO()) return; SpannableStringBuilder ssb = new SpannableStringBuilder( "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Praesent accumsan efficitur eros eu porttitor."); @@ -182,6 +193,7 @@ public class LinkAccessibilityHelperTest { @Test public void testRtlMultilineLink() { + if (isAtLeastO()) return; String iwLoremIpsum = "אחר על רביעי אקטואליה. לוח דת אחרות המקובל רומנית, מיזמים מועמדים " + "האנציקלופדיה בה צ'ט. מתן מה שנורו לערוך ייִדיש, בקר או החול אנתרופולוגיה, עוד " + "דפים המחשב מיזמים ב."; @@ -205,6 +217,7 @@ public class LinkAccessibilityHelperTest { @Test public void testBidiMultilineLink() { + if (isAtLeastO()) return; String iwLoremIpsum = "אחר על רביעי אקטואליה. לוח דת אחרות המקובל רומנית, מיזמים מועמדים " + "האנציקלופדיה בה צ'ט. מתן מה שנורו לערוך ייִדיש, בקר או החול אנתרופולוגיה, עוד " + "דפים המחשב מיזמים ב."; |