diff options
| -rw-r--r-- | core/java/android/widget/TabHost.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/TabWidget.java | 28 |
2 files changed, 32 insertions, 1 deletions
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java index f720ceed296b..ff31dec2ff0c 100644 --- a/core/java/android/widget/TabHost.java +++ b/core/java/android/widget/TabHost.java @@ -144,6 +144,11 @@ mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1"); } } + @Override + public void sendAccessibilityEvent(int eventType) { + /* avoid super class behavior - TabWidget sends the right events */ + } + /** * If you are using {@link TabSpec#setContent(android.content.Intent)}, this * must be called since the activityGroup is needed to launch the local activity. diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index afae7eff6499..594b1e695581 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -28,6 +28,7 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.view.View.OnFocusChangeListener; +import android.view.accessibility.AccessibilityEvent; /** * @@ -335,7 +336,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { * @see #focusCurrentTab */ public void setCurrentTab(int index) { - if (index < 0 || index >= getTabCount()) { + if (index < 0 || index >= getTabCount() || index == mSelectedTab) { return; } @@ -343,6 +344,18 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { mSelectedTab = index; getChildTabViewAt(mSelectedTab).setSelected(true); mStripMoved = true; + + if (isShown()) { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + event.setItemCount(getTabCount()); + event.setCurrentItemIndex(mSelectedTab); + getChildTabViewAt(mSelectedTab).dispatchPopulateAccessibilityEvent(event); + return true; } /** @@ -416,6 +429,15 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { child.setOnFocusChangeListener(this); } + @Override + public void sendAccessibilityEventUnchecked(AccessibilityEvent event) { + // this class fires events only when tabs are focused or selected + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED && isFocused()) { + return; + } + super.sendAccessibilityEventUnchecked(event); + } + /** * Provides a way for {@link TabHost} to be notified that the user clicked on a tab indicator. */ @@ -436,6 +458,10 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { if (getChildTabViewAt(i) == v) { setCurrentTab(i); mSelectionChangedListener.onTabSelectionChanged(i, false); + if (isShown()) { + // a tab is focused so send an event to announce the tab widget state + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); + } break; } i++; |