diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2011-07-29 10:44:59 -0700 |
|---|---|---|
| committer | Svetoslav Ganov <svetoslavganov@google.com> | 2011-07-29 10:45:05 -0700 |
| commit | 7650259a597dd24137420d32acc35efc44db381e (patch) | |
| tree | ab184cb159301040987fea4abbc63fc0dae313e9 /core/java/android | |
| parent | a31f5e63743f3fc788acbd85474ec80eaf5c8b4d (diff) | |
| download | frameworks_base-7650259a597dd24137420d32acc35efc44db381e.zip frameworks_base-7650259a597dd24137420d32acc35efc44db381e.tar.gz frameworks_base-7650259a597dd24137420d32acc35efc44db381e.tar.bz2 | |
Improving accessibility feedback for two state widgets.
1. Added population of sensible text for the state of the
two state controls such as CheckBox, Switch, etc. This
is important since if they are in a layout manager which
fires an accessibility event there should be a description
of the widget.
bug:5092552
Change-Id: Ie3ca955653563496b84db379ae23a23fe88089a8
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/preference/CheckBoxPreference.java | 3 | ||||
| -rw-r--r-- | core/java/android/preference/SwitchPreference.java | 4 | ||||
| -rw-r--r-- | core/java/android/preference/TwoStatePreference.java | 47 | ||||
| -rw-r--r-- | core/java/android/widget/CheckBox.java | 13 | ||||
| -rw-r--r-- | core/java/android/widget/CheckedTextView.java | 10 | ||||
| -rw-r--r-- | core/java/android/widget/RadioButton.java | 13 | ||||
| -rw-r--r-- | core/java/android/widget/Switch.java | 15 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 3 | ||||
| -rw-r--r-- | core/java/android/widget/ToggleButton.java | 14 |
9 files changed, 82 insertions, 40 deletions
diff --git a/core/java/android/preference/CheckBoxPreference.java b/core/java/android/preference/CheckBoxPreference.java index 166b21b..1536760 100644 --- a/core/java/android/preference/CheckBoxPreference.java +++ b/core/java/android/preference/CheckBoxPreference.java @@ -61,8 +61,7 @@ public class CheckBoxPreference extends TwoStatePreference { View checkboxView = view.findViewById(com.android.internal.R.id.checkbox); if (checkboxView != null && checkboxView instanceof Checkable) { ((Checkable) checkboxView).setChecked(mChecked); - // Post this so this view is bound and attached when firing the event. - postSendAccessibilityEventForView(checkboxView); + sendAccessibilityEvent(checkboxView); } syncSummaryView(view); diff --git a/core/java/android/preference/SwitchPreference.java b/core/java/android/preference/SwitchPreference.java index 3dbd522..17f0c1b 100644 --- a/core/java/android/preference/SwitchPreference.java +++ b/core/java/android/preference/SwitchPreference.java @@ -102,8 +102,8 @@ public class SwitchPreference extends TwoStatePreference { View checkableView = view.findViewById(com.android.internal.R.id.switchWidget); if (checkableView != null && checkableView instanceof Checkable) { ((Checkable) checkableView).setChecked(mChecked); - // Post this so this view is bound and attached when firing the event. - postSendAccessibilityEventForView(checkableView); + + sendAccessibilityEvent(checkableView); if (checkableView instanceof Switch) { final Switch switchView = (Switch) checkableView; diff --git a/core/java/android/preference/TwoStatePreference.java b/core/java/android/preference/TwoStatePreference.java index b6f00ad..d186b20 100644 --- a/core/java/android/preference/TwoStatePreference.java +++ b/core/java/android/preference/TwoStatePreference.java @@ -37,10 +37,9 @@ public abstract class TwoStatePreference extends Preference { private CharSequence mSummaryOn; private CharSequence mSummaryOff; boolean mChecked; - private boolean mSendAccessibilityEventViewClickedType; + private boolean mSendClickAccessibilityEvent; private boolean mDisableDependentsState; - private SendAccessibilityEventTypeViewClicked mSendAccessibilityEventTypeViewClicked; public TwoStatePreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); @@ -60,9 +59,7 @@ public abstract class TwoStatePreference extends Preference { boolean newValue = !isChecked(); - // in onBindView() an AccessibilityEventViewClickedType is sent to announce the change - // not sending - mSendAccessibilityEventViewClickedType = true; + mSendClickAccessibilityEvent = true; if (!callChangeListener(newValue)) { return; @@ -188,26 +185,19 @@ public abstract class TwoStatePreference extends Preference { : (Boolean) defaultValue); } - /** - * Post send an accessibility event for the given view if appropriate. - * - * @param view View that should send the event - */ - void postSendAccessibilityEventForView(View view) { - // send an event to announce the value change of the state. It is done here - // because clicking a preference does not immediately change the checked state - // for example when enabling the WiFi - if (mSendAccessibilityEventViewClickedType - && AccessibilityManager.getInstance(getContext()).isEnabled() - && view.isEnabled()) { - mSendAccessibilityEventViewClickedType = false; - if (mSendAccessibilityEventTypeViewClicked == null) { - mSendAccessibilityEventTypeViewClicked = - new SendAccessibilityEventTypeViewClicked(); - } - mSendAccessibilityEventTypeViewClicked.mView = view; - view.post(mSendAccessibilityEventTypeViewClicked); + void sendAccessibilityEvent(View view) { + // Since the view is still not attached we create, populate, + // and send the event directly since we do not know when it + // will be attached and posting commands is not as clean. + AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(getContext()); + if (mSendClickAccessibilityEvent && accessibilityManager.isEnabled()) { + AccessibilityEvent event = AccessibilityEvent.obtain(); + event.setEventType(AccessibilityEvent.TYPE_VIEW_CLICKED); + view.onInitializeAccessibilityEvent(event); + view.dispatchPopulateAccessibilityEvent(event); + accessibilityManager.sendAccessibilityEvent(event); } + mSendClickAccessibilityEvent = false; } /** @@ -301,13 +291,4 @@ public abstract class TwoStatePreference extends Preference { } }; } - - private final class SendAccessibilityEventTypeViewClicked implements Runnable { - private View mView; - - @Override - public void run() { - mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); - } - } } diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java index b89c2a9..2788846 100644 --- a/core/java/android/widget/CheckBox.java +++ b/core/java/android/widget/CheckBox.java @@ -18,6 +18,9 @@ package android.widget; import android.content.Context; import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; + +import com.android.internal.R; /** @@ -65,4 +68,14 @@ public class CheckBox extends CompoundButton { public CheckBox(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + if (isChecked()) { + event.getText().add(mContext.getString(R.string.checkbox_checked)); + } else { + event.getText().add(mContext.getString(R.string.checkbox_not_checked)); + } + } } diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java index f3a6da7..7598e54 100644 --- a/core/java/android/widget/CheckedTextView.java +++ b/core/java/android/widget/CheckedTextView.java @@ -221,4 +221,14 @@ public class CheckedTextView extends TextView implements Checkable { super.onInitializeAccessibilityEvent(event); event.setChecked(mChecked); } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + if (isChecked()) { + event.getText().add(mContext.getString(R.string.radiobutton_selected)); + } else { + event.getText().add(mContext.getString(R.string.radiobutton_not_selected)); + } + } } diff --git a/core/java/android/widget/RadioButton.java b/core/java/android/widget/RadioButton.java index ebbe1cd..9fa649f 100644 --- a/core/java/android/widget/RadioButton.java +++ b/core/java/android/widget/RadioButton.java @@ -18,6 +18,9 @@ package android.widget; import android.content.Context; import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; + +import com.android.internal.R; /** @@ -72,4 +75,14 @@ public class RadioButton extends CompoundButton { super.toggle(); } } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + if (isChecked()) { + event.getText().add(mContext.getString(R.string.radiobutton_selected)); + } else { + event.getText().add(mContext.getString(R.string.radiobutton_not_selected)); + } + } } diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java index 0c80a11..57f73ac 100644 --- a/core/java/android/widget/Switch.java +++ b/core/java/android/widget/Switch.java @@ -364,8 +364,19 @@ public class Switch extends CompoundButton { @Override public void onPopulateAccessibilityEvent(AccessibilityEvent event) { super.onPopulateAccessibilityEvent(event); - Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout; - event.getText().add(switchText.getText()); + if (isChecked()) { + CharSequence text = mOnLayout.getText(); + if (TextUtils.isEmpty(text)) { + text = mContext.getString(R.string.switch_on); + } + event.getText().add(text); + } else { + CharSequence text = mOffLayout.getText(); + if (TextUtils.isEmpty(text)) { + text = mContext.getString(R.string.switch_off); + } + event.getText().add(text); + } } private Layout makeLayout(CharSequence text) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 127b6a3..dd5f065 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -8425,6 +8425,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (TextUtils.isEmpty(text)) { text = getHint(); } + if (TextUtils.isEmpty(text)) { + text = getContentDescription(); + } if (!TextUtils.isEmpty(text)) { event.getText().add(text); } diff --git a/core/java/android/widget/ToggleButton.java b/core/java/android/widget/ToggleButton.java index 3b680e8..ba9de24 100644 --- a/core/java/android/widget/ToggleButton.java +++ b/core/java/android/widget/ToggleButton.java @@ -22,6 +22,9 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; + +import com.android.internal.R; /** * Displays checked/unchecked states as a button @@ -146,5 +149,14 @@ public class ToggleButton extends CompoundButton { mIndicatorDrawable.setAlpha(isEnabled() ? NO_ALPHA : (int) (NO_ALPHA * mDisabledAlpha)); } } - + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + super.onPopulateAccessibilityEvent(event); + if (isChecked()) { + event.getText().add(mContext.getString(R.string.togglebutton_pressed)); + } else { + event.getText().add(mContext.getString(R.string.togglebutton_not_pressed)); + } + } } |
