diff options
author | Joe Fernandez <joefernandez@google.com> | 2012-08-01 16:21:17 -0700 |
---|---|---|
committer | Joe Fernandez <joefernandez@google.com> | 2012-09-05 11:27:48 -0700 |
commit | ba4cf3c8500ffdef349565e63a36f825edb76903 (patch) | |
tree | 18e07556f25a33c09ad809bb633c3af584d4466f /docs | |
parent | 6958c161a9f12aaa1db33bdc526040c3691638dc (diff) | |
download | frameworks_base-ba4cf3c8500ffdef349565e63a36f825edb76903.zip frameworks_base-ba4cf3c8500ffdef349565e63a36f825edb76903.tar.gz frameworks_base-ba4cf3c8500ffdef349565e63a36f825edb76903.tar.bz2 |
docs: Accessibility DevGuide, Jelly Bean edition
Change-Id: Idafa0d755c0397b539a6de5b10096abc1c06c2c7
Diffstat (limited to 'docs')
-rw-r--r-- | docs/html/guide/guide_toc.cs | 43 | ||||
-rw-r--r-- | docs/html/guide/topics/ui/accessibility/apps.jd | 420 | ||||
-rw-r--r-- | docs/html/guide/topics/ui/accessibility/calendar.png | bin | 0 -> 17811 bytes | |||
-rw-r--r-- | docs/html/guide/topics/ui/accessibility/checklist.jd | 173 | ||||
-rw-r--r-- | docs/html/guide/topics/ui/accessibility/index.jd | 60 | ||||
-rw-r--r-- | docs/html/guide/topics/ui/accessibility/services.jd | 263 | ||||
-rw-r--r-- | docs/html/tools/testing/testing_accessibility.jd | 257 | ||||
-rw-r--r-- | docs/html/tools/tools_toc.cs | 32 |
8 files changed, 994 insertions, 254 deletions
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 9465f18..e812ccb 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -8,7 +8,7 @@ <ul id="nav"> <!-- Walkthrough for Developers -- quick overview of what it's like to develop on Android --> <!--<li style="color:red">Overview</li> --> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/components/index.html"> <span class="en">App Components</span> @@ -223,7 +223,7 @@ <li><a href="<?cs var:toroot ?>guide/topics/search/adding-custom-suggestions.html">Adding Custom Suggestions</a></li> <li><a href="<?cs var:toroot ?>guide/topics/search/searchable-config.html">Searchable Configuration</a></li> </ul> - </li> + </li> <li><a href="<?cs var:toroot ?>guide/topics/ui/drag-drop.html"> <span class="en">Drag and Drop</span> </a></li> @@ -235,6 +235,9 @@ <li><a href="<?cs var:toroot ?>guide/topics/ui/accessibility/apps.html"> <span class="en">Making Applications Accessible</span> </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/accessibility/checklist.html"> + <span class="en">Accessibility Developer Checklist</span> + </a></li> <li><a href="<?cs var:toroot ?>guide/topics/ui/accessibility/services.html"> <span class="en">Building Accessibility Services</span> </a></li> @@ -382,9 +385,9 @@ </a></li> </ul> </li><!-- end of location and sensors --> - - + + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/topics/connectivity/index.html"> <span class="en">Connectivity</span> @@ -419,10 +422,10 @@ <span class="en">SIP</span> </a> </li> - + </ul> </li><!-- end of connectivity --> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/topics/text/index.html"> <span class="en">Text and Input</span> @@ -439,7 +442,7 @@ </a></li> </ul> </li><!-- end of text and input --> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/topics/data/index.html"> <span class="en">Data Storage</span> @@ -457,7 +460,7 @@ </ul> </li><!-- end of data storage --> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot?>guide/topics/admin/index.html"> <span class="en">Administration</span> @@ -475,7 +478,7 @@ --> </ul> </li><!-- end of administration --> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/webapps/index.html"> <span class="en">Web Apps</span> @@ -498,7 +501,7 @@ </a></li> </ul> </li><!-- end of web apps --> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/practices/index.html"> <span class="en">Best Practices</span> @@ -555,13 +558,13 @@ </ul> </li> - - + + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/google/index.html"> <span class="en">Google Services</span> </a></div> - <ul> + <ul> <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot?>guide/google/play/billing/index.html"> @@ -623,7 +626,7 @@ <li><a href="<?cs var:toroot ?>guide/google/play/expansion-files.html"> <span class="en">APK Expansion Files</span></a> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/google/gcm/index.html"> <span class="en">Google Cloud Messaging</span></a> @@ -649,9 +652,9 @@ </ul> </li><!-- end Google Play --> - - - + + + <!-- this needs to move <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/index.html"> @@ -691,9 +694,9 @@ </a></div> </li> </ul> - </li> + </li> </ul> --> - + <!-- Remove <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>guide/appendix/index.html"> @@ -710,7 +713,7 @@ <li><a href="<?cs var:toroot ?>guide/appendix/g-app-intents.html"> <span class="en">Intents List: Google Apps</span> </a></li> - + <li><a href="<?cs var:toroot ?>guide/appendix/glossary.html"> <span class="en">Glossary</span> diff --git a/docs/html/guide/topics/ui/accessibility/apps.jd b/docs/html/guide/topics/ui/accessibility/apps.jd index d23512b..13b4538 100644 --- a/docs/html/guide/topics/ui/accessibility/apps.jd +++ b/docs/html/guide/topics/ui/accessibility/apps.jd @@ -21,14 +21,11 @@ parent.link=index.html <li><a href="#accessibility-methods">Implementing accessibility API methods</a></li> <li><a href="#send-events">Sending accessibility events</a></li> <li><a href="#populate-events">Populating accessibility events</a></li> + <li><a href="#virtual-hierarchy">Providing a customized accessibility context</a></li> + <li><a href="#custom-touch-events">Handling custom touch events</a></li> </ol> </li> - <li><a href="#test">Testing Accessibility</a> - <ol> - <li><a href="#test-audibles">Testing audible feedback</a></li> - <li><a href="#test-navigation">Testing focus navigation</a></li> - </ol> - </li> + <li><a href="#test">Testing Accessibility</a></li> </ol> <h2>Key classes</h2> @@ -42,60 +39,79 @@ parent.link=index.html <h2>See also</h2> <ol> - <li><a href="{@docRoot}training/accessibility/index.html">Implementing Accessibility</a></li> - <li><a href="{@docRoot}training/design-navigation/index.html">Designing Effective Navigation</a> - </li> - <li><a href="{@docRoot}design/index.html">Android Design</a></li> + <li><a href="checklist.html">Accessibility Developer Checklist</a><li> + <li><a href="{@docRoot}tools/testing/testing_accessibility.html">Accessibility Testing Checklist</a><li> + <li><a href="{@docRoot}design/patterns/accessibility.html">Android Design: Accessibility</a></li> + <li><a href="{@docRoot}training/design-navigation/index.html">Designing Effective Navigation</a></li> + <li><a href="{@docRoot}training/accessibility/index.html">Training: Implementing Accessibility</a></li> </ol> </div> </div> -<p>Applications built for Android are accessible to users with visual, physical or age-related -disabilities when they activate accessibility features and services on a device. By default, -these services make your application more accessible. However, there are further steps you should -take to optimize the accessibility of your application and ensure a pleasant experience for all your -users.</p> +<p>Applications built for Android are more accessible to users with visual, physical or age-related +limitations when those users activate accessibility services and features on a device. These +services make your application more accessible even if you do not make any accessibility changes +to your code. However, there are steps you should take to optimize the accessibility of your +application and ensure a pleasant experience for all your users.</p> -<p>Making sure your application is accessible to all users is relatively easy, particularly when you -use framework-provided user interface components. If you only use these standard components for your -application, there are just a few steps required to ensure your application is accessible:</p> +<p>Making sure your application is accessible to all users requires only a few steps, particularly +when you create your user interface with the components provided by the Android framework. If you +use only the standard components for your application, the steps are:</p> <ol> - <li>Label your {@link android.widget.ImageButton}, {@link android.widget.ImageView}, {@link -android.widget.EditText}, {@link android.widget.CheckBox} and other user interface controls using -the <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> - {@code android:contentDescription}</a> attribute.</li> - <li>Make all of your user interface elements accessible with a directional controller, - such as a trackball or D-pad.</li> - <li>Test your application by turning on accessibility services like TalkBack and Explore by - Touch, and try using your application using only directional controls.</li> + <li>Add descriptive text to user interface controls in your application using the + <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> + {@code android:contentDescription}</a> attribute. Pay particular attention to + {@link android.widget.ImageButton}, {@link android.widget.ImageView} + and {@link android.widget.CheckBox}.</li> + <li>Make sure that all user interface elements that can accept input (touches or typing) can be + reached with a directional controller, such as a trackball, D-pad (physical or virtual) or + navigation <a href="http://support.google.com/android/bin/topic.py?hl=en&topic=2492346">gestures + </a>.</li> + <li>Make sure that audio prompts are always accompanied by another visual prompt or notification, + to assist users who are deaf or hard of hearing.</li> + <li>Test your application using only accessibility navigation services and features. Turn on + <a href="{@docRoot}tools/testing/testing_accessibility.html#testing-talkback">TalkBack</a> and + <a href="{@docRoot}tools/testing/testing_accessibility.html#testing-ebt">Explore by Touch</a>, + and then try using your application using only directional controls. For more information on + testing for accessibility, see the <a href="{@docRoot}tools/testing/testing_accessibility.html"> + Accessibility Testing Checklist</a>.</li> </ol> -<p>Developers who create custom controls that extend from the {@link android.view.View} class have -some additional responsibilities for making sure their components are accessible for users. This -document also discusses how to make custom view controls compatible with accessibility services.</p> +<p>If you build custom controls that extend the {@link android.view.View} class, you must complete +some additional work to make sure your components are accessible. This document discusses how to +make custom view controls compatible with accessibility services.</p> +<p class="note"> +<strong>Note:</strong> The implementation steps in this document describe the requirements for +making your application accessible for users with blindness or low-vision. Be sure to review the +requirements for serving users who are deaf and hard of hearing in the +<a href="{@docRoot}guide/topics/ui/accessibility/checklist.html">Accessibility Developer +Checklist</a></p>. -<h2 id="label-ui">Labeling User Interface Elements</h2> -<p>Many user interface controls rely on visual cues to inform users of their meaning. For -example, a note-taking application might use an {@link android.widget.ImageButton} with a -picture of a plus sign to indicate that the user can add a new note. Or, an {@link -android.widget.EditText} component may have a label near it that indicates its purpose. When a user -with impaired vision accesses your application, these visual cues are often useless.</p> -<p>To provide textual information about interface controls (as an alternative to the visual cues), -use the <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> -{@code android:contentDescription}</a> attribute. The text you provide in this attribute is not -visible on the screen, but if a user has enabled accessibility services that provide audible -prompts, then the description in this attribute is read aloud to the user.</p> +<h2 id="label-ui">Labeling User Interface Elements</h2> -<p>Set the <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> +<p>Many user interface controls depend on visual cues to indicate their meaning and usage. For +example, a note-taking application might use an {@link android.widget.ImageButton} with a +picture of a plus sign to indicate that the user can add a new note. An {@link +android.widget.EditText} component may have a label near it that indicates its purpose. A user +with impaired vision can't see these cues well enough to follow them, which makes them useless.</p> + +<p>You can make these controls more accessible with the +<a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> +{@code android:contentDescription}</a> XML layout attribute. The text in this attribute does not +appear on screen, but if the user enables accessibility services that provide audible prompts, then +when the user navigates to that control, the text is spoken.</p> + +<p>For this reason, set the +<a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> {@code android:contentDescription}</a> attribute for every {@link android.widget.ImageButton}, -{@link android.widget.ImageView}, {@link android.widget.EditText}, {@link android.widget.CheckBox} -in your application's user interface, and on any other input controls that might require additional -information for users who are not able to see it.</p> +{@link android.widget.ImageView}, {@link android.widget.CheckBox} +in your application's user interface, and add descriptions to any other input controls that might +require additional information for users who are not able to see it.</p> <p>For example, the following {@link android.widget.ImageButton} sets the content description for the plus button to the {@code add_note} string resource, which could be defined as “Add note" for an @@ -108,32 +124,38 @@ English language interface:</p> android:contentDescription=”@string/add_note”/> </pre> -<p>By including the description, speech-based accessibility services can announce "Add note" when a -user moves focus to this button or hovers over it.</p> +<p>By including the description, an accessibility service that provides spoken feedback can announce +"Add note" when a user moves focus to this button or hovers over it.</p> <p class="note"><strong>Note:</strong> For {@link android.widget.EditText} fields, provide an <a href="{@docRoot}reference/android/widget/TextView.html#attr_android:hint">android:hint</a> -attribute to help users understand what content is expected.</p> +attribute <em>instead</em> of a content description, to help users understand what content is +expected when the text field is empty. When the field is filled, TalkBack reads the entered +content to the user, instead of the hint text.</p> + <h2 id="focus-nav">Enabling Focus Navigation</h2> <p>Focus navigation allows users with disabilities to step through user interface controls using a -directional controller. Directional controllers can be physical, such as a clickable trackball, -directional pad (D-pad) or arrow keys, tab key navigation with an attached keyboard or a software -application, such as the +directional controller. Directional controllers can be physical, such as a trackball, directional +pad (D-pad) or arrow keys, or virtual, such as the <a href="https://play.google.com/store/apps/details?id=com.googlecode.eyesfree.inputmethod.latin"> -Eyes-Free Keyboard</a>, that provides an on-screen directional control.</p> +Eyes-Free Keyboard</a>, or the gestures navigation mode available in Android 4.1 and higher. +Directional controllers are a primary means of navigation for many Android users. +</p> + +<p>To ensure that users can navigate your application using only a directional controller, verify +that all user interface (UI) input controls in your application can be reached and activated +without using the touchscreen. You should also verify that clicking with the center button (or OK +button) of a directional controller has the same effect as touching a control that already has +focus. For information on testing directional controls, see +<a href="{@docRoot}tools/testing/testing_accessibility.html#test-navigation">Testing +focus navigation</a>.</p> -<p>A directional controller is a primary means of navigation for many users. -Verify that all user interface (UI) controls in your application are accessible -without using the touchscreen and that clicking with the center button (or OK button) of a -directional controller has the same effect as touching the controls on the touchscreen. For -information on testing directional controls, see <a href="#test-navigation">Testing focus -navigation</a>.</p> <h3 id="focus-enable">Enabling view focus</h3> -<p>A user interface element is accessible using directional controls when its +<p>A user interface element is reachable using directional controls when its <a href="{@docRoot}reference/android/view/View.html#attr_android:focusable"> {@code android:focusable}</a> attribute is set to {@code true}. This setting allows users to focus on the element using the directional controls and then interact with it. The user interface controls @@ -149,44 +171,44 @@ and even request that a control be given focus:</p> <li>{@link android.view.View#requestFocus requestFocus()}</li> </ul> -<p>When working with a view that is not focusable by default, you can make it focusable from the XML -layout file by setting the -<a href="{@docRoot}reference/android/view/View.html#attr_android:focusable"> -{@code android:focusable}</a> attribute to {@code true} or by using the {@link +<p>If a view is not focusable by default, you can make it focusable in your layout file by setting +the <a href="{@docRoot}reference/android/view/View.html#attr_android:focusable"> +{@code android:focusable}</a> attribute to {@code true} or by calling the its {@link android.view.View#setFocusable setFocusable()} method.</p> + <h3 id="focus-order">Controlling focus order</h3> <p>When users navigate in any direction using directional controls, focus is passed from one -user interface element (View) to another, as determined by the focus ordering. The ordering of the -focus movement is based on an algorithm that finds the nearest neighbor in a given direction. In -rare cases, the default algorithm may not match the order that you intended for your UI. In these -situations, you can provide explicit overrides to the ordering using the following XML attributes in -the layout file:</p> +user interface element (view) to another, as determined by the focus order. This order is based on +an algorithm that finds the nearest neighbor in a given direction. In rare cases, the algorithm may +not match the order that you intended or may not be logical for users. In these situations, you can +provide explicit overrides to the ordering using the following XML attributes in your layout file: +</p> <dl> - <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusDown" ->{@code android:nextFocusDown}</a></dt> - <dd>Defines the next view to receive focus when the user navigates down.</dd> - <a><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusLeft" ->{@code android:nextFocusLeft}</a></dt> - <dd>Defines the next view to receive focus when the user navigates left.</dd> - <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusRight" ->{@code android:nextFocusRight}</a></dt> - <dd>Defines the next view to receive focus when the user navigates right.</dd> - <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusUp" ->{@code android:nextFocusUp}</a></dt> - <dd>Defines the next view to receive focus when the user navigates up.</dd> + <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusDown"> + {@code android:nextFocusDown}</a></dt> + <dd>Defines the next view to receive focus when the user navigates down.</dd> + <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusLeft"> + {@code android:nextFocusLeft}</a></dt> + <dd>Defines the next view to receive focus when the user navigates left.</dd> + <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusRight"> + {@code android:nextFocusRight}</a></dt> + <dd>Defines the next view to receive focus when the user navigates right.</dd> + <dt><a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusUp"> + {@code android:nextFocusUp}</a></dt> + <dd>Defines the next view to receive focus when the user navigates up.</dd> </dl> -<p>The following example XML layout shows two focusable user interface elements where the <a -href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusDown" ->{@code android:nextFocusDown}</a> and <a -href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusUp" ->{@code android:nextFocusUp}</a> attributes have been explicitly set. The {@link android.widget.TextView} is +<p>The following example XML layout shows two focusable user interface elements where the +<a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusDown">{@code +android:nextFocusDown}</a> and +<a href="{@docRoot}reference/android/view/View.html#attr_android:nextFocusUp">{@code +android:nextFocusUp}</a> attributes have been explicitly set. The {@link android.widget.TextView} is located to the right of the {@link android.widget.EditText}. However, since these properties have been set, the {@link android.widget.TextView} element can now be reached by pressing the down arrow -when focus is on the {@link android.widget.EditText} element: </p> +when focus is on the {@link android.widget.EditText} element:</p> <pre> <LinearLayout android:orientation="horizontal" @@ -218,8 +240,9 @@ These are the main tasks for ensuring the accessibility of your view:</p> <ul> <li>Handle directional controller clicks</li> - <li>Implement Accessibility API methods</li> - <li>Send {@link android.view.accessibility.AccessibilityEvent} objects specific to your custom view</li> + <li>Implement accessibility API methods</li> + <li>Send {@link android.view.accessibility.AccessibilityEvent} objects specific to your custom + view</li> <li>Populate {@link android.view.accessibility.AccessibilityEvent} and {@link android.view.accessibility.AccessibilityNodeInfo} for your view</li> </ul> @@ -243,9 +266,9 @@ full keyboard much easier for users.</p> <p>Accessibility events are messages about users interaction with visual interface components in your application. These messages are handled by <a href="services.html">Accessibility Services</a>, -which use the information in these events to produce supplemental feedback and prompts when users -have enabled accessibility services. As of Android 4.0 (API Level 14) and higher, the methods for -generating accessibility events have been expanded to provide more detailed information beyond the +which use the information in these events to produce supplemental feedback and prompts. In +Android 4.0 (API Level 14) and higher, the methods for +generating accessibility events have been expanded to provide more detailed information than the {@link android.view.accessibility.AccessibilityEventSource} interface introduced in Android 1.6 (API Level 4). The expanded accessibility methods are part of the {@link android.view.View} class as well as the {@link android.view.View.AccessibilityDelegate} class. The methods are as follows:</p> @@ -262,12 +285,12 @@ sendAccessibilityEventUnchecked()}</dt> <dd>(API Level 4) This method is used when the calling code needs to directly control the check for accessibility being enabled on the device ({@link android.view.accessibility.AccessibilityManager#isEnabled AccessibilityManager.isEnabled()}). If -you do implement this method, you must assume that the calling method has already checked that -accessibility is enabled and the result is {@code true}. You typically do not need to implement this -method for a custom view.</dd> +you do implement this method, you must perform the call as if accessibility is enabled, regardless +of the actual system setting. You typically do not need to implement this method for a custom view. +</dd> <dt>{@link android.view.View#dispatchPopulateAccessibilityEvent -dispatchPopulateAccessibilityEvent()} </dt> +dispatchPopulateAccessibilityEvent()}</dt> <dd>(API Level 4) The system calls this method when your custom view generates an accessibility event. As of API Level 14, the default implementation of this method calls {@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()} for this view and @@ -276,21 +299,21 @@ dispatchPopulateAccessibilityEvent()} method for each child of this view. In ord accessibility services on revisions of Android <em>prior</em> to 4.0 (API Level 14) you <em>must</em> override this method and populate {@link android.view.accessibility.AccessibilityEvent#getText} with descriptive text for your custom -view.</dd> +view, which is spoken by accessibility services, such as TalkBack.</dd> <dt>{@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()}</dt> - <dd>(API Level 14) This method sets the text output of an {@link + <dd>(API Level 14) This method sets the spoken text prompt of the {@link android.view.accessibility.AccessibilityEvent} for your view. This method is also called if the view is a child of a view which generates an accessibility event. <p class="note"><strong>Note:</strong> Modifying additional attributes beyond the text within -this method potentially overwrites properties set by other methods. So, while you are able modify +this method potentially overwrites properties set by other methods. While you can modify attributes of the accessibility event with this method, you should limit these changes -to text content only and use the {@link android.view.View#onInitializeAccessibilityEvent +to text content, and use the {@link android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()} method to modify other properties of the event.</p> - <p class="note"><strong>Note:</strong> If your implementation of this event calls for completely -overiding the output text without allowing other parts of your layout to modify its content, then + <p class="note"><strong>Note:</strong> If your implementation of this event completely +overrides the output text without allowing other parts of your layout to modify its content, then do not call the super implementation of this method in your code.</p> </dd> @@ -306,7 +329,7 @@ that have not been set by the super class.</dd> <dt>{@link android.view.View#onInitializeAccessibilityNodeInfo onInitializeAccessibilityNodeInfo()}</dt> <dd>(API Level 14) This method provides accessibility services with information about the state of -the view. The default {@link android.view.View} implementation sets a standard set of view +the view. The default {@link android.view.View} implementation has a standard set of view properties, but if your custom view provides interactive control beyond a simple {@link android.widget.TextView} or {@link android.widget.Button}, you should override this method and set the additional information about your view into the {@link @@ -315,7 +338,7 @@ android.view.accessibility.AccessibilityNodeInfo} object handled by this method. <dt>{@link android.view.ViewGroup#onRequestSendAccessibilityEvent onRequestSendAccessibilityEvent()}</dt> <dd>(API Level 14) The system calls this method when a child of your view has generated an -{@link android.view.accessibility.AccessibilityEvent}. This step allows the the parent view to amend +{@link android.view.accessibility.AccessibilityEvent}. This step allows the parent view to amend the accessibility event with additional information. You should implement this method only if your custom view can have child views and if the parent view can provide context information to the accessibility event that would be useful to accessibility services.</dd> @@ -333,7 +356,7 @@ higher, to your project. Then, within your custom view class, call the {@link android.support.v4.view.ViewCompat#setAccessibilityDelegate ViewCompat.setAccessibilityDelegate()} method to implement the accessibility methods above. For an example of this approach, see the Android Support Library (revision 5 or higher) -sample {@code AccessibilityDelegateSupportActivity} in +sample {@code AccessibilityDelegateSupportActivity} in ({@code <sdk>/extras/android/support/v4/samples/Support4Demos/}) </li> </ul> @@ -446,20 +469,20 @@ public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { } </pre> -<p>On Android 4.0 (API Level 14) and higher, the {@link +<p>For Android 4.0 (API Level 14) and higher, use the {@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()} and {@link android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()} -methods are the recommended way to populate or modify the information in an {@link -android.view.accessibility.AccessibilityEvent}. Use the +methods to populate or modify the information in an {@link +android.view.accessibility.AccessibilityEvent}. Use the {@link android.view.View#onPopulateAccessibilityEvent onPopulateAccessibilityEvent()} method specifically for adding or modifying the text content of the event, which is turned into audible prompts by accessibility services such as TalkBack. Use the {@link android.view.View#onInitializeAccessibilityEvent onInitializeAccessibilityEvent()} method for populating additional information about the event, such as the selection state of the view.</p> -<p>In addition, you should also implement the +<p>In addition, implement the {@link android.view.View#onInitializeAccessibilityNodeInfo onInitializeAccessibilityNodeInfo()} -method. {@link android.view.accessibility.AccessibilityNodeInfo} objects populated by this method +method. The {@link android.view.accessibility.AccessibilityNodeInfo} objects populated by this method are used by accessibility services to investigate the view hierarchy that generated an accessibility event after receiving that event, to obtain a more detailed context information and provide appropriate feedback to users.</p> @@ -467,8 +490,8 @@ appropriate feedback to users.</p> <p>The example code below shows how override these three methods by using {@link android.support.v4.view.ViewCompat#setAccessibilityDelegate ViewCompat.setAccessibilityDelegate()}. Note that this sample code requires that the Android -<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> for API Level 4 (revision 5 -or higher) is added to your project.</p> +<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> for API Level 4 (revision +5 or higher) is added to your project.</p> <pre> ViewCompat.setAccessibilityDelegate(new AccessibilityDelegateCompat() { @@ -509,10 +532,10 @@ ViewCompat.setAccessibilityDelegate(new AccessibilityDelegateCompat() { } </pre> -<p>On applications targeting Android 4.0 (API Level 14) and higher, these methods can be implemented +<p>In applications targeting Android 4.0 (API Level 14) and higher, you can implement these methods directly in your custom view class. For another example of this approach, see the Android -<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> (revision 5 or higher) sample -{@code AccessibilityDelegateSupportActivity} in +<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> (revision 5 or higher) +sample {@code AccessibilityDelegateSupportActivity} in ({@code <sdk>/extras/android/support/v4/samples/Support4Demos/}).</p> <p class="note"><strong>Note:</strong> You may find information on implementing accessibility for @@ -525,50 +548,141 @@ approach is to use the methods.</p> -<h2 id="test">Testing Accessibility</h2> +<h3 id="virtual-hierarchy">Providing a customized accessibility context</h3> + +<p>In Android 4.0 (API Level 14), the framework was enhanced to allow accessibility services to + inspect the containing view hierarchy of a user interface component that generates an + accessibility event. This enhancement allows accessibility services to provide a much richer set + of contextual information with which to aid users.</p> + +<p>There are some cases where accessibility services cannot get adequate information + from the view hierarchy. An example of this is a custom interface control that has two or more + separately clickable areas, such as a calendar control. In this case, the services cannot get + adequate information because the clickable subsections are not part of the view hierarchy.</p> + +<img src="calendar.png" alt="" id="figure1" /> +<p class="img-caption"> + <strong>Figure 1.</strong> A custom calendar view with selectable day elements. +</p> + +<p>In the example shown in Figure 1, the entire calendar is implemented as a single view, so if you + do not do anything else, accessibility services do not receive enough information about the + content of the view and the user's selection within the view. For example, if a user clicks on the + day containing <strong>17</strong>, the accessibility framework only receives the description + information for the whole calendar control. In this case, the TalkBack accessibility service would + simply announce "Calendar" or, only slightly better, "April Calendar" and the user would be left + to wonder what day was selected.</p> + +<p>To provide adequate context information for accessibility services in situations like this, + the framework provides a way to specify a virtual view hierarchy. A <em>virtual view + hierarchy</em> is a way for application developers to provide a complementary view hierarchy + to accessibility services that more closely matches the actual information on screen. This + approach allows accessibility services to provide more useful context information to users.</p> + +<p>Another situation where a virtual view hierarchy may be needed is a user interface containing + a set of controls (views) that have closely related functions, where an action on one control + affects the contents of one or more elements, such as a number picker with separate up and down + buttons. In this case, accessibility services cannot get adequate information because action on + one control changes content in another and the relationship of those controls may not be apparent + to the service. To handle this situation, group the related controls with a containing view and + provide a virtual view hierarchy from this container to clearly represent the information and + behavior provided by the controls.</p> + +<p>In order to provide a virtual view hierarchy for a view, override the {@link + android.view.View#getAccessibilityNodeProvider} method in your custom view or view group and + return an implementation of {@link android.view.accessibility.AccessibilityNodeProvider}. For an + example implementation of this accessibility feature, see + {@code AccessibilityNodeProviderActivity} in the ApiDemos sample project. You can implement a + virtual view hierarchy that is compatible with Android 1.6 and later by using the + <a href="{@docRoot}tools/extras/support-library.html">Support Library</a> with the + {@link android.support.v4.view.ViewCompat#getAccessibilityNodeProvider + ViewCompat.getAccessibilityNodeProvider()} method and providing an implementation with + {@link android.support.v4.view.accessibility.AccessibilityNodeProviderCompat}.</p> + + +<h3 id="custom-touch-events">Handling custom touch events</h3> + +<p>Custom view controls may require non-standard touch event behavior. For example, a custom +control may use the {@link android.view.View#onTouchEvent} listener method to detect the +{@link android.view.MotionEvent#ACTION_DOWN} and {@link android.view.MotionEvent#ACTION_UP} events +and trigger a special click event. In order to maintain compatibility with accessibility services, +the code that handles this custom click event must do the following:</p> -<p>Testing the accessibility of your application is an important part of ensuring your users have a -great experience. You can test the most important parts of accessibility by testing your application -with audible feedback enabled and testing navigation within your application using directional -controls.</p> - -<h3 id="test-audibles">Testing audible feedback</h3> -<p>You can simulate the experience for many users by enabling an accessibility service that speaks -as you move around the screen. The Explore by Touch accessibility service, which is available on -devices with Android 4.0 and later. The <a -href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">TalkBack</a> -accessibility service, by the <a href="http://code.google.com/p/eyes-free/">Eyes-Free -Project</a> comes preinstalled on many Android devices.</p> - -<p>To enable TalkBack on revisions of Android prior to Android 4.0:</p> <ol> - <li>Launch the Settings application.</li> - <li>Navigate to the <strong>Accessibility</strong> category and select it.</li> - <li>Select <strong>Accessibility</strong> to enable it.</li> - <li>Select <strong>TalkBack</strong> to enable it.</li> + <li>Generate an appropriate {@link android.view.accessibility.AccessibilityEvent} for the + interpreted click action.</li> + <li>Enable accessibility services to perform the custom click action for users who are not able to + use a touch screen.</li> </ol> -<p class="note"><strong>Note:</strong> If the TalkBack accessibility service is not available, you -can install it for free from <a href="http://play.google.com">Google Play</a>.</p> +<p>To handle these requirements in an efficient way, your code should override the +{@link android.view.View#performClick} method, which must call the super implementation of this +method and then execute whatever actions are required by the click event. When the custom click +action is detected, that code should then call your {@code performClick()} method. The following +code example demonstrates this pattern.</p> -<p>To enable Explore by Touch on Android 4.0 and later:</p> -<ol> - <li>Launch the Settings application.</li> - <li>Navigate to the <strong>Accessibility</strong> category and select it.</li> - <li>Select the <strong>TalkBack</strong> to enable it.</li> - <li>Return to the <strong>Accessibility</strong> category and select <strong>Explore by -Touch</strong> to enable it. - <p class="note"><strong>Note:</strong> You must turn on TalkBack <em>first</em>, otherwise this -option is not available.</p> - </li> -</ol> +<pre> +class CustomTouchView extends View { -<h3 id="test-navigation">Testing focus navigation</h3> + public CustomTouchView(Context context) { + super(context); + } + + boolean mDownTouch = false; + + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + + // Listening for the down and up touch events + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mDownTouch = true; + return true; + + case MotionEvent.ACTION_UP: + if (mDownTouch) { + mDownTouch = false; + performClick(); // Call this method to handle the response, and + // thereby enable accessibility services to + // perform this action for a user who cannot + // click the touchscreen. + return true; + } + } + return false; // Return false for other touch events + } + + @Override + public boolean performClick() { + // Calls the super implementation, which generates an AccessibilityEvent + // and calls the onClick() listener on the view, if any + super.performClick(); + + // Handle the action for the custom click here + + return true; + } +} +</pre> + +<p>The pattern shown above makes sure that the custom click event is compatible with +accessibility services by using the {@link android.view.View#performClick} method to both generate +an accessibility event and provide an entry point for accessibility services to act on behalf of a +user to perform this custom click event.</p> + +<p class="note"><strong>Note:</strong> If your custom view has distinct clickable regions, such as +a custom calendar view, you must implement a <a href="#virtual-hierarchy">virtual view +hierarchy</a> by overriding {@link android.view.View#getAccessibilityNodeProvider} in your custom +view in order to be compatible with accessibility services.</p> + + +<h2 id="test">Testing Accessibility</h2> + +<p>Testing the accessibility of your application is an important part of ensuring your users have a +great experience. You can test the most important accessibility features by using your application +with audible feedback enabled and navigating within your application using only directional +controls. For more information on testing accessibility in your application, see the +<a href="{@docRoot}tools/testing/testing_accessibility.html">Accessibility Testing Checklist</a>. +</p> -<p>As part of your accessibility testing, you can test navigation of your application using focus, -even if your test devices does not have a directional controller. The <a -href="{@docRoot}tools/help/emulator.html">Android Emulator</a> provides a -simulated directional controller that you can easily use to test navigation. You can also use a -software-based directional controller, such as the one provided by the -<a href="https://play.google.com/store/apps/details?id=com.googlecode.eyesfree.inputmethod.latin"> -Eyes-Free Keyboard</a> to simulate use of a D-pad.</p> diff --git a/docs/html/guide/topics/ui/accessibility/calendar.png b/docs/html/guide/topics/ui/accessibility/calendar.png Binary files differnew file mode 100644 index 0000000..ca5c44f --- /dev/null +++ b/docs/html/guide/topics/ui/accessibility/calendar.png diff --git a/docs/html/guide/topics/ui/accessibility/checklist.jd b/docs/html/guide/topics/ui/accessibility/checklist.jd new file mode 100644 index 0000000..9473d1b --- /dev/null +++ b/docs/html/guide/topics/ui/accessibility/checklist.jd @@ -0,0 +1,173 @@ +page.title=Accessibility Developer Checklist +parent.title=Accessibility +parent.link=index.html +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + + <h2>In this document</h2> + <ol> + <li><a href="#requirements">Accessibility Requirements</a></li> + <li><a href="#recommendations">Accessibility Recommendations</a></li> + <li><a href="#special-cases">Special Cases and Considerations</a></li> + </ol> + + <h2>See also</h2> + <ol> + <li><a href="{@docRoot}design/patterns/accessibility.html">Android Design: Accessibility</a></li> + <li><a href="{@docRoot}tools/testing/testing_accessibility.html">Accessibility Testing Checklist</a></li> + <li><a href="{@docRoot}training/accessibility/index.html">Training: Implementing Accessibility</a></li> + <li><a href="{@docRoot}training/design-navigation/index.html">Designing Effective Navigation</a></li> + </ol> + +</div> +</div> + +<p>Making an application accessible is about a deep commitment to usability, getting the +details right and delighting your users. This document provides a checklist of accessibility +requirements, recommendations and considerations to help you make sure your application is +accessible. Following this checklist does not guarantee your application is accessible, but it's a +good place to start.</p> + +<p>Creating an accessible application is not just the responsibility of developers. Involve your +design and testing folks as well, and make them are aware of the guidelines for these other stages +of development:</p> + +<ul> + <li><a href="{@docRoot}design/patterns/accessibility.html">Android Design: Accessibility</a></li> + <li><a href="{@docRoot}tools/testing/testing_accessibility.html">Accessibility Testing + Checklist</a></li> +</ul> + +<p>In most cases, creating an accessible Android application does not require extensive code +restructuring. Rather, it means working through the subtle details of how users interact with your +application, so you can provide them with feedback they can sense and understand. This checklist +helps you focus on the key development issues to get the details of accessibility right.</p> + + +<h2 id="requirements">Accessibility Requirements</h2> + +<p>The following steps must be completed in order to ensure a minimum level of application + accessibility.</p> + +<ol> + <li><strong>Describe user interface controls:</strong> Provide content + <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#label-ui">descriptions</a> for user + interface components that do not have visible text, particularly + {@link android.widget.ImageButton}, {@link android.widget.ImageView} + and {@link android.widget.CheckBox} components. Use the + <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> + {@code android:contentDescription}</a> XML layout attribute or the {@link + android.view.View#setContentDescription} method to provide this information for accessibility + services. (Exception: <a href="#decorative">decorative graphics</a>)</li> + <li><strong>Enable focus-based navigation:</strong> Make sure + <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#focus-nav">users can navigate</a> + your screen layouts using hardware-based or software directional controls (D-pads, trackballs, + keyboards and navigation gestures). In a few cases, you may need to make user interface components + <a href="{@docRoot}reference/android/view/View.html#attr_android:focusable">focusable</a> + or change the <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#focus-order">focus + order</a> to be more logical for user actions.</li> + <li><strong>Custom view controls:</strong> If you build + <a href="{@docRoot}guide/topics/ui/custom-components.html">custom interface controls</a> for + your application, <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#custom-views"> + implement accessibility interfaces</a> for your custom views and provide content descriptions. + For custom controls that are intended to be compatible with versions of Android back to 1.6, + use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a> to implement + the latest accessibility features.</li> + <li><strong>No audio-only feedback:</strong> Audio feedback must always have a secondary + feedback mechanism to support users who are deaf or hard of hearing. For example, a sound alert + for the arrival of a message must be accompanied by a system + {@link android.app.Notification}, haptic feedback (if available) or other visual alert.</li> + <li><strong>Test:</strong> Test accessibility by navigating your application + using directional controls, and using eyes-free navigation with TalkBack enabled. + For more accessibility testing information, see the + <a href="{@docRoot}tools/testing/testing_accessibility.html">Accessibility Testing + Checklist</a>.</li> +</ol> + + +<h2 id="recommendations">Accessibility Recommendations</h2> + +<p>The following steps are recommended for ensuring the accessibility of your application. If you + do not take these actions, it may impact the overall accessibility and quality of your + application.</p> + +<ol> + <li><strong>Android Design Accessibility Guidelines:</strong> Before building your layouts, + review and follow the accessibility guidelines provided in the + <a href="{@docRoot}design/patterns/accessibility.html">Design guidelines</a>.</li> + <li><strong>Framework-provided controls:</strong> Use Android's built-in user interface + controls whenever possible, as these components provide accessibility support by default.</li> + <li><strong>Temporary or self-hiding controls and notifications:</strong> Avoid having user + interface controls that fade out or disappear after a certain amount of time. If this behavior + is important to your application, provide an alternative interface for these functions.</li> +</ol> + + +<h2 id="special-cases">Special Cases and Considerations</h2> + +<p>The following list describes specific situations where action should be taken to ensure an + accessible app. Review this list to see if any of these special cases and considerations apply to + your application, and take the appropriate action.</p> + +<ol> + <li><strong>Text field hints:</strong> For {@link android.widget.EditText} fields, provide an + <a href="{@docRoot}reference/android/widget/TextView.html#attr_android:hint">android:hint</a> + attribute <em>instead</em> of a content description, to help users understand what content is + expected when the text field is empty and allow the contents of the field to be spoken when + it is filled.</li> + <li><strong>Custom controls with high visual context:</strong> If your application contains a + <a href="{@docRoot}guide/topics/ui/custom-components.html">custom control</a> with a high degree + of visual context (such as a calendar control), default accessibility services processing may + not provide adequate descriptions for users, and you should consider providing a + <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#virtual-hierarchy">virtual + view hierarchy</a> for your control using + {@link android.view.accessibility.AccessibilityNodeProvider}.</li> + <li><strong>Custom controls and click handling:</strong> If a custom control in your + application performs specific handling of user touch interaction, such as listening with + {@link android.view.View#onTouchEvent} for {@link android.view.MotionEvent#ACTION_DOWN + MotionEvent.ACTION_DOWN} and {@link android.view.MotionEvent#ACTION_UP MotionEvent.ACTION_UP} + and treating it as a click event, you must trigger an {@link + android.view.accessibility.AccessibilityEvent} equivalent to a click and provide a way for + accessibility services to perform this action for users. For more information, see + <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#custom-touch-events">Handling custom + touch events</a>.</li> + <li><strong>Controls that change function:</strong> If you have buttons or other controls + that change function during the normal activity of a user in your application (for example, a + button that changes from <strong>Play</strong> to <strong>Pause</strong>), make sure you also + change the <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription"> + {@code android:contentDescription}</a> of the button appropriately.</li> + <li><strong>Prompts for related controls:</strong> Make sure sets of controls which provide a + single function, such as the {@link android.widget.DatePicker}, provide useful audio feedback + when an user interacts with the individual controls.</li> + <li><strong>Video playback and captioning:</strong> If your application provides video + playback, it must support captioning and subtitles to assist users who are deaf or hard of + hearing. Your video playback controls must also clearly indicate if captioning is available for + a video and provide a clear way of enabling captions.</li> + <li><strong>Supplemental accessibility audio feedback:</strong> Use only the Android accessibility + framework to provide accessibility audio feedback for your app. Accessibility services such as + <a href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback" + >TalkBack</a> should be the only way your application provides accessibility audio prompts to + users. Provide the prompting information with a + <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription">{@code + android:contentDescription}</a> XML layout attribute or dynamically add it using accessibility + framework APIs. For example, if your application takes action that you want to announce to a + user, such as automatically turning the page of a book, use the {@link + android.view.View#announceForAccessibility} method to have accessibility services speak this + information to the user.</li> + <li><strong>Custom controls with complex visual interactions:</strong> For custom controls that + provide complex or non-standard visual interactions, provide a + <a href="{@docRoot}guide/topics/ui/accessibility/apps.html#virtual-hierarchy">virtual view + hierarchy</a> for your control using {@link android.view.accessibility.AccessibilityNodeProvider} + that allows accessibility services to provide a simplified interaction model for the user. If + this approach is not feasible, consider providing an alternate view that is accessible.</li> + <li><strong>Sets of small controls:</strong> If you have controls that are smaller than + the minimum recommended touch size in your application screens, consider grouping these controls + together using a {@link android.view.ViewGroup} and providing a + <a href="{@docRoot}reference/android/view/View.html#attr_android:contentDescription">{@code + android:contentDescription}</a> for the group.</li> + <li id="decorative"><strong>Decorative images and graphics:</strong> Elements in application + screens that are purely decorative and do not provide any content or enable a user action should + not have accessibility content descriptions.</li> +</ol> diff --git a/docs/html/guide/topics/ui/accessibility/index.jd b/docs/html/guide/topics/ui/accessibility/index.jd index 6fd71e2..6cdbde4 100644 --- a/docs/html/guide/topics/ui/accessibility/index.jd +++ b/docs/html/guide/topics/ui/accessibility/index.jd @@ -8,47 +8,67 @@ parent.link=../index.html <h2>Topics</h2> <ol> - <li><a href="{@docRoot}guide/topics/ui/accessibility/apps.html">Making Applications Accessible</a> - </li> - <li><a href="{@docRoot}guide/topics/ui/accessibility/services.html">Building Accessibility - Services</a></li> + <li><a href="apps.html"> + Making Applications Accessible</a></li> + <li><a href="checklist.html"> + Accessibility Developer Checklist</a></li> + <li><a href="services.html"> + Building Accessibility Services</a></li> </ol> - <h2>Key classes</h2> + <h2>See also</h2> <ol> - <li>{@link android.view.accessibility.AccessibilityEvent}</li> - <li>{@link android.accessibilityservice.AccessibilityService}</li> + <li><a href="{@docRoot}design/patterns/accessibility.html">Android Design: Accessibility</a></li> + <li><a href="{@docRoot}training/accessibility/index.html">Training: Implementing Accessibility</a></li> + <li><a href="{@docRoot}tools/testing/testing_accessibility.html">Accessibility Testing Checklist</a></li> </ol> - - <h2>See also</h2> + + <h2>Related Videos</h2> <ol> - <li><a href="{@docRoot}training/accessibility/index.html">Implementing Accessibility</a></li> + <li> + <iframe title="Google I/O 2012 - Making Android Apps Accessible" + width="210" height="160" + src="http://www.youtube.com/embed/q3HliaMjL38?rel=0&hd=1" + frameborder="0" allowfullscreen> + </iframe> + <li> </ol> </div> </div> -<p>Many Android users have disabilities that require them to interact with their Android devices in -different ways. These include users who have visual, physical or age-related disabilities that -prevent them from fully seeing or using a touchscreen.</p> +<p>Many Android users have different abilities that require them to interact with their Android +devices in different ways. These include users who have visual, physical or age-related limitations +that prevent them from fully seeing or using a touchscreen, and users with hearing loss who may not +be able to perceive audible information and alerts.</p> <p>Android provides accessibility features and services for helping these users navigate their -devices more easily, including text-to-speech, haptic feedback, trackball and D-pad navigation that -augment their experience. Android application developers can take advantage of these services to -make their applications more accessible and also build their own accessibility services.</p> +devices more easily, including text-to-speech, haptic feedback, gesture navigation, trackball and +directional-pad navigation. Android application developers can take advantage of these services to +make their applications more accessible.</p> + +<p>Android developers can also build their own accessibility services, which can provide +enhanced usability features such as audio prompting, physical feedback, and alternative navigation +modes. Accessibility services can provide these enhancements for all applications, a set of +applications or just a single app.</p> <p>The following topics show you how to use the Android framework to make applications more accessible.</p> <dl> - <dt><strong><a href="{@docRoot}guide/topics/ui/accessibility/apps.html">Making Applications -Accessible</a></strong> + <dt><strong><a href="{@docRoot}guide/topics/ui/accessibility/apps.html"> + Making Applications Accessible</a></strong> </dt> <dd>Development practices and API features to ensure your application is accessible to users with disabilities.</dd> - <dt><strong><a href="{@docRoot}guide/topics/ui/accessibility/services.html">Building Accessibility -Services</a></strong> + <dt><strong><a href="{@docRoot}guide/topics/ui/accessibility/checklist.html"> + Accessibility Developer Checklist</a></strong> + </dt> + <dd>A checklist to help developers ensure that their applications are accessible.</dd> + + <dt><strong><a href="{@docRoot}guide/topics/ui/accessibility/services.html"> + Building Accessibility Services</a></strong> </dt> <dd>How to use API features to build services that make other applications more accessible for users.</dd> diff --git a/docs/html/guide/topics/ui/accessibility/services.jd b/docs/html/guide/topics/ui/accessibility/services.jd index 7d36181..2a6fe7a 100644 --- a/docs/html/guide/topics/ui/accessibility/services.jd +++ b/docs/html/guide/topics/ui/accessibility/services.jd @@ -14,8 +14,16 @@ parent.link=index.html <li><a href="#service-config">Accessibility service configuration</a></li> </ol> </li> + <li><a href="#register">Registering for Accessibility Events</a></li> <li><a href="#methods">AccessibilityService Methods</a></li> <li><a href="#event-details">Getting Event Details</a></li> + <li><a href="#act-for-users">Taking Action for Users</a> + <ol> + <li><a href="#detect-gestures">Listening for gestures</a></li> + <li><a href="#using-actions">Using accessibility actions</a></li> + <li><a href="#focus-types">Using focus types</a></li> + </ol> + </li> <li><a href="#examples">Example Code</a></li> </ol> @@ -30,7 +38,7 @@ parent.link=index.html <h2>See also</h2> <ol> - <li><a href="{@docRoot}training/accessibility/index.html">Implementing Accessibility</a></li> + <li><a href="{@docRoot}training/accessibility/index.html">Training: Implementing Accessibility</a></li> </ol> </div> @@ -45,20 +53,20 @@ might need additional or alternative interface feedback.</p> create and distribute their own services. This document explains the basics of building an accessibility service.</p> -<p>The ability for you to build and deploy accessibility services was introduced with Android -1.6 (API Level 4) and received significant improvements with Android 4.0 (API Level 14). The Android -Support Library was also updated with the release of Android 4.0 to provide support for these -enhanced accessibility features back to Android 1.6. Developers aiming for widely compatible -accessibility services are encouraged to use the -<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> and develop for the more -advanced accessibility features introduced in Android 4.0.</p> +<p>The ability for you to build and deploy accessibility services was introduced with Android 1.6 + (API Level 4) and received significant improvements with Android 4.0 (API Level 14). The Android + <a href="{@docRoot}tools/extras/support-library.html">Support Library</a> was also updated with + the release of Android 4.0 to provide support for these enhanced accessibility features back to + Android 1.6. Developers aiming for widely compatible accessibility services are encouraged to use + the Support Library and develop for the more advanced accessibility features introduced in + Android 4.0.</p> <h2 id="manifest">Manifest Declarations and Permissions</h2> <p>Applications that provide accessibility services must include specific declarations in their - application manifests in order to be treated as an accessibility service by an Android system. - This section explains the required and optional settings for accessibility services.</p> + application manifests to be treated as an accessibility service by the Android system. This + section explains the required and optional settings for accessibility services.</p> <h3 id="service-declaration">Accessibility service declaration</h3> @@ -66,7 +74,9 @@ advanced accessibility features introduced in Android 4.0.</p> <p>In order to be treated as an accessibility service, your application must include the {@code service} element (rather than the {@code activity} element) within the {@code application} element in its manifest. In addition, within the {@code service} element, you must also include an -accessibility service intent filter, as shown in the following sample:</p> +accessibility service intent filter. For compatiblity with Android 4.1 and higher, the manifest +must also request the {@link android.Manifest.permission#BIND_ACCESSIBILITY_SERVICE} permission +as shown in the following sample:</p> <pre> <application> @@ -76,6 +86,7 @@ accessibility service intent filter, as shown in the following sample:</p> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> </service> + <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> </application> </pre> @@ -123,6 +134,26 @@ shows example contents for the service configuration file:</p> /> </pre> +<p>For more information about the XML attributes which can be used in the accessibility service + configuration file, follow these links to the reference documentation:</p> + +<ul> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_description">{@code android:description}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_packageNames">{@code android:packageNames}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityEventTypes">{@code android:accessibilityEventTypes}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityFlags">{@code android:accessibilityFlags}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityFeedbackType">{@code android:accessibilityFeedbackType}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_notificationTimeout">{@code android:notificationTimeout}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_canRetrieveWindowContent">{@code android:canRetrieveWindowContent}</a></li> + <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_settingsActivity">{@code android:settingsActivity}</a></li> +</ul> + +<p>For more information about which configuration settings can be dynamically set at runtime, see +the {@link android.accessibilityservice.AccessibilityServiceInfo} reference documentation.</p> + + +<h2 id="register">Registering for Accessibility Events</h2> + <p>One of the most important functions of the accessibility service configuration parameters is to allow you to specify what types of accessibility events your service can handle. Being able to specify this information enables accessibility services to cooperate with each other, and allows you @@ -139,32 +170,27 @@ android.accessibilityservice.AccessibilityServiceInfo#packageNames AccessibilityServiceInfo.packageNames} member.</li> <li><strong>Event Types</strong> - Specify the types of accessibility events you want your service to handle. This parameter can be set in the accessibility service configuration files with the -{@code android:accessibilityEventTypes} attribute as a comma-separated list, or set using the +{@code android:accessibilityEventTypes} attribute as a list separated by the {@code |} character +(for example {@code accessibilityEventTypes="typeViewClicked|typeViewFocused"}), or set using the {@link android.accessibilityservice.AccessibilityServiceInfo#eventTypes AccessibilityServiceInfo.eventTypes} member. </li> </ul> -<p>For more information about the XML attributes which can be used in the accessibility service - configuration file, follow these links to the reference documentation:</p> +<p>When setting up your accessibility service, carefully consider what events your service is able +to handle and only register for those events. Since users can activate more than one accessibility +services at a time, your service must not consume events that it is not able to handle. Remember +that other services may handle those events in order to improve a user's experience.</p> -<ul> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_description">{@code android:description}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_packageNames">{@code android:packageNames}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityEventTypes">{@code android:accessibilityEventTypes}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityFlags">{@code android:accessibilityFlags}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityFeedbackType">{@code android:accessibilityFeedbackType}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_notificationTimeout">{@code android:notificationTimeout}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_canRetrieveWindowContent">{@code android:canRetrieveWindowContent}</a></li> - <li><a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_settingsActivity">{@code android:settingsActivity}</a></li> -</ul> - -<p>For more information about which configuration settings can be dynamically set at runtime, see -the {@link android.accessibilityservice.AccessibilityServiceInfo} reference documentation.</p> +<p class="note"><strong>Note:</strong> The Android framework dispatches accessibility events to +more than one accessibility service if the services provide different +<a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_accessibilityFeedbackType"> +feedback types</a>. However, if two or more services provide the same feedback type, then only the +first registered service receives the event.</p> <h2 id="methods">AccessibilityService Methods</h2> -<p>An application that provides accessibility service must extend the {@link +<p>An accessibility service must extend the {@link android.accessibilityservice.AccessibilityService} class and override the following methods from that class. These methods are presented in the order in which they are called by the Android system, from when the service is started @@ -188,15 +214,15 @@ onAccessibilityEvent()} - (required) This method is called back by the system wh {@link android.view.accessibility.AccessibilityEvent} that matches the event filtering parameters specified by your accessibility service. For example, when the user clicks a button or focuses on a user interface control in an application for which your accessibility service is providing feedback. -When this happens, the system calls this method of your service with the associated {@link -android.view.accessibility.AccessibilityEvent}, which you can then interpret and provide feedback to -the user. This method may be called many times over the lifecycle of your service.</li> +When this happens, the system calls this method, passing the associated {@link +android.view.accessibility.AccessibilityEvent}, which the service can then interpret and use to +provide feedback to the user. This method may be called many times over the lifecycle of your +service.</li> <li>{@link android.accessibilityservice.AccessibilityService#onInterrupt onInterrupt()} - (required) This method is called when the system wants to interrupt the feedback your service is -providing, usually in response to a user taking action, such as moving focus to a different user -interface control than the one for which you are currently providing feedback. This method may be -called many times over the lifecycle of your service.</li> +providing, usually in response to a user action such as moving focus to a different control. This +method may be called many times over the lifecycle of your service.</li> <li>{@link android.accessibilityservice.AccessibilityService#onUnbind onUnbind()} - (optional) This method is called when the system is about to shutdown the accessibility service. Use this @@ -206,7 +232,9 @@ services, such as the audio manager or device vibrator.</li> <p>These callback methods provide the basic structure for your accessibility service. It is up to you to decide on how to process data provided by the Android system in the form of {@link -android.view.accessibility.AccessibilityEvent} objects and provide feedback to the user.</p> +android.view.accessibility.AccessibilityEvent} objects and provide feedback to the user. For more +information about getting information from an accessibility event, see the +<a href="{@docRoot}training/accessibility/service.html">Implementing Accessibility</a> training.</p> <h2 id="event-details">Getting Event Details</h2> @@ -214,15 +242,15 @@ android.view.accessibility.AccessibilityEvent} objects and provide feedback to t <p>The Android system provides information to accessibility services about the user interface interaction through {@link android.view.accessibility.AccessibilityEvent} objects. Prior to Android 4.0, the information available in an accessibility event, while providing a significant amount of -detail about a user interface control selected by the user, typically provided limited contextual +detail about a user interface control selected by the user, offered limited contextual information. In many cases, this missing context information might be critical to understanding the meaning of the selected control.</p> -<p>A typical example of an interface where context is of critical importance is a calendar or day -planner. If a user selects a 4:00 PM time slot in a Monday to Friday day list and the accessibility -service announces “4 PM”, but fails to indicate this is a Friday a Monday, the month or day, this is -hardly ideal feedback for the user. In this case, the context of a user interface control is of -critical importance to a user who wants to schedule a meeting.</p> +<p>An example of an interface where context is critical is a calendar or day planner. If the +user selects a 4:00 PM time slot in a Monday to Friday day list and the accessibility service +announces “4 PM”, but does not announce the weekday name, the day of the month, or the month name, +the resulting feedback is confusing. In this case, the context of a user interface control is +critical to a user who wants to schedule a meeting.</p> <p>Android 4.0 significantly extends the amount of information that an accessibility service can obtain about an user interface interaction by composing accessibility events based on the view @@ -245,26 +273,167 @@ can obtain additional information about the event using these calls:</p> AccessibilityEvent.getRecordCount()} and {@link android.view.accessibility.AccessibilityEvent#getRecord getRecord(int)} - These methods allow you to retrieve the set of {@link android.view.accessibility.AccessibilityRecord} objects which contributed -to the {@link android.view.accessibility.AccessibilityEvent} passed to you by the system, which can -provide more context for your accessibility service.</li> +to the {@link android.view.accessibility.AccessibilityEvent} passed to you by the system. This level +of detail provides more context for the event that triggered your accessibility service.</li> <li>{@link android.view.accessibility.AccessibilityEvent#getSource AccessibilityEvent.getSource()} - This method returns an {@link -android.view.accessibility.AccessibilityNodeInfo} object. This object allows you to request the -parents and children of the component that originated the accessibility event and investigate their -contents and state in order to provide +android.view.accessibility.AccessibilityNodeInfo} object. This object allows you to request view +layout hierarchy (parents and children) of the component that originated the accessibility event. +This feature allows an accessibility service to investigate the full context of an event, including +the content and state of any enclosing views or child views. - <p class="caution"><strong>Important:</strong> The ability to investigate the full view +<p class="caution"><strong>Important:</strong> The ability to investigate the view hierarchy from an {@link android.view.accessibility.AccessibilityEvent} potentially exposes private user information to your accessibility service. For this reason, your service must request this level of access through the accessibility <a href="#service-config">service configuration XML</a> file, by including the {@code canRetrieveWindowContent} attribute and setting it to {@code true}. If you do not include this setting in your service configuration xml file, calls to {@link android.view.accessibility.AccessibilityEvent#getSource getSource()} fail.</p> + +<p class="note"><strong>Note:</strong> In Android 4.1 (API Level 16) and higher, the +{@link android.view.accessibility.AccessibilityEvent#getSource getSource()} method, +as well as {@link android.view.accessibility.AccessibilityNodeInfo#getChild +AccessibilityNodeInfo.getChild()} and +{@link android.view.accessibility.AccessibilityNodeInfo#getParent getParent()}, return only +view objects that are considered important for accessibility (views that draw content or respond to +user actions). If your service requires all views, it can request them by setting the +{@link android.accessibilityservice.AccessibilityServiceInfo#flags flags} member of the service's +{@link android.accessibilityservice.AccessibilityServiceInfo} instance to +{@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_INCLUDE_NOT_IMPORTANT_VIEWS}.</p> </li> </ul> +<h2 id="act-for-users">Taking Action for Users</h2> + +<p>Starting with Android 4.0 (API Level 14), accessibility services can act on behalf + of users, including changing the input focus and selecting (activating) user interface elements. + In Android 4.1 (API Level 16) the range of actions has been expanded to include scrolling lists + and interacting with text fields. Accessibility services can + also take global actions, such as navigating to the Home screen, pressing the Back button, opening + the notifications screen and recent applications list. Android 4.1 also includes a new type of + focus, <em>Accessibilty Focus</em>, which makes all visible elements selectable by an + accessibility service.</p> + +<p>These new capabilities make it possible for developers of accessibility services to create + alternative navigation modes such as + <a href="{@docRoot}tools/testing/testing_accessibility.html#test-gestures">gesture navigation</a>, + and give users with disabilities improved control of their Android devices.</p> + + +<h3 id="detect-gestures">Listening for gestures</h3> + +<p>Accessibility services can listen for specific gestures and respond by taking action on behalf + of a user. This feature, added in Android 4.1 (API Level 16), and requires that your + accessibility service request activation of the Explore by Touch feature. Your service can + request this activation by setting the + {@link android.accessibilityservice.AccessibilityServiceInfo#flags flags} member of the service’s + {@link android.accessibilityservice.AccessibilityServiceInfo} instance to + {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE}, + as shown in the following example. + </p> + +<pre> +public class MyAccessibilityService extends AccessibilityService { + @Override + public void onCreate() { + getServiceInfo().flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; + } + ... +} +</pre> + +<p>Once your service has requested activation of Explore by Touch, the user must allow the + feature to be turned on, if it is not already active. When this feature is active, your service + receives notification of accessibility gestures through your service's + {@link android.accessibilityservice.AccessibilityService#onGesture onGesture()} callback method + and can respond by taking actions for the user.</p> + + +<h3 id="using-actions">Using accessibility actions</h3> + +<p>Accessibility services can take action on behalf of users to make interacting with applications + simpler and more productive. The ability of accessibility services to perform actions was added + in Android 4.0 (API Level 14) and significantly expanded with Android 4.1 (API Level 16).</p> + +<p>In order to take actions on behalf of users, your accessibility service must + <a href="#register">register</a> to receive events from a few or many applications and request + permission to view the content of applications by setting the + <a href="{@docRoot}reference/android/R.styleable.html#AccessibilityService_canRetrieveWindowContent"> + {@code android:canRetrieveWindowContent}</a> to {@code true} in the + <a href="#service-config">service configuration file</a>. When events are received by your + service, it can then retrieve the + {@link android.view.accessibility.AccessibilityNodeInfo} object from the event using + {@link android.view.accessibility.AccessibilityEvent#getSource getSource()}. + With the {@link android.view.accessibility.AccessibilityNodeInfo} object, your service can then + explore the view hierarchy to determine what action to take and then act for the user using + {@link android.view.accessibility.AccessibilityNodeInfo#performAction performAction()}.</p> + +<pre> +public class MyAccessibilityService extends AccessibilityService { + + @Override + public void onAccessibilityEvent(AccessibilityEvent event) { + // get the source node of the event + AccessibilityNodeInfo nodeInfo = event.getSource(); + + // Use the event and node information to determine + // what action to take + + // take action on behalf of the user + nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + + // recycle the nodeInfo object + nodeInfo.recycle(); + } + ... +} +</pre> + +<p>The {@link android.view.accessibility.AccessibilityNodeInfo#performAction performAction()} method + allows your service to take action within an application. If your service needs to perform a + global action such as navigating to the Home screen, pressing the Back button, opening the + notifications screen or recent applications list, then use the + {@link android.accessibilityservice.AccessibilityService#performGlobalAction performGlobalAction()} + method.</p> + + +<h3 id="focus-types">Using focus types</h3> + +<p>Android 4.1 (API Level 16) introduces a new type of user interface focus called <em>Accessibility + Focus</em>. This type of focus can be used by accessibility services to select any visible user + interface element and act on it. This focus type is different from the more well known <em>Input + Focus</em>, which determines what on-screen user interface element receives input when a user + types characters, presses <strong>Enter</strong> on a keyboard or pushes the center button of a + D-pad control.</p> + +<p>Accessibility Focus is completely separate and independent from Input Focus. In fact, it is + possible for one element in a user interface to have Input Focus while another element has + Accessibility Focus. The purpose of Accessibility Focus is to provide accessibility services with + a method of interacting with any visible element on a screen, regardless of whether or not the + element is input-focusable from a system perspective. You can see accessibility focus in action by + testing accessibility gestures. For more information about testing this feature, see + <a href="{@docRoot}tools/testing/testing_accessibility.html#test-gestures">Testing gesture + navigation</a>.</p> + +<p class="note"> + <strong>Note:</strong> Accessibility services that use Accessibility Focus are responsible for + synchronizing the current Input Focus when an element is capable of this type of focus. Services + that do not synchronize Input Focus with Accessibility Focus run the risk of causing problems in + applications that expect input focus to be in a specific location when certain actions are taken. + </p> + +<p>An accessibility service can determine what user interface element has Input Focus or + Accessibility Focus using the {@link android.view.accessibility.AccessibilityNodeInfo#findFocus + AccessibilityNodeInfo.findFocus()} method. You can also search for elements that can be selected + with Input Focus using the + {@link android.view.accessibility.AccessibilityNodeInfo#focusSearch focusSearch()} method. + Finally, your accessibility service can set Accessibility Focus using the + {@link android.view.accessibility.AccessibilityNodeInfo#performAction + performAction(AccessibilityNodeInfo.ACTION_SET_ACCESSIBILITY_FOCUS)} method.</p> + + <h2 id="examples">Example Code</h2> <p>The API Demo project contains two samples which can be used as a starting point for generating diff --git a/docs/html/tools/testing/testing_accessibility.jd b/docs/html/tools/testing/testing_accessibility.jd new file mode 100644 index 0000000..daf9b36 --- /dev/null +++ b/docs/html/tools/testing/testing_accessibility.jd @@ -0,0 +1,257 @@ +page.title=Accessibility Testing Checklist +parent.title=Testing +parent.link=index.html +@jd:body + +<div id="qv-wrapper"> + <div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#goals">Testing Goals</a></li> + <li><a href="#requirements">Testing Requirements</a></li> + <li><a href="#recommendations">Testing Recommendations</a></li> + <li><a href="#special-cases">Special Cases and Considerations</a></li> + <li><a href="#how-to">Testing Accessibility Features</a> + <ol> + <li><a href="#test-audibles">Testing audible feedback</a></li> + <li><a href="#test-navigation">Testing focus navigation</a></li> + <li><a href="#test-gestures">Testing gesture navigation</a></li> + </ol> + </li> + </ol> + + <h2>See Also</h2> + <ol> + <li> + <a href="{@docRoot}guide/topics/ui/accessibility/checklist.html"> + Accessibility Developer Checklist</a> + </li> + <li> + <a href="{@docRoot}design/patterns/accessibility.html"> + Android Design: Accessibility</a> + </li> + <li> + <a href="{@docRoot}guide/topics/ui/accessibility/apps.html"> + Making Applications Accessible</a> + </li> + </ol> + </div> +</div> +<p> + Testing is an important part of making your application accessible to users with varying + abilities. Following <a href="{@docRoot}design/patterns/accessibility.html">design</a> and + <a href="{@docRoot}guide/topics/ui/accessibility/checklist.html">development</a> guidelines for + accessibility are important steps toward that goal, but testing for accessibility can uncover + problems with user interaction that are not obvious during design and development.</p> + +<p>This accessibility testing checklist guides you through the important aspects of + accessibility testing, including overall goals, required testing steps, recommended testing and + special considerations. This document also discusses how to enable accessibility features on + Android devices for testing purposes.</p> + + +<h2 id="goals">Testing Goals</h2> + +<p>Your accessibility testing should have the following, high level goals:</p> + +<ul> + <li>Set up and use the application without sighted assistance</li> + <li>All task workflows in the application can be easily navigated using directional controls and + provide clear and appropriate feedback</li> +</ul> + + +<h2 id="requirements">Testing Requirements</h2> + +<p>The following tests must be completed in order to ensure a minimum level of application + accessibility.</p> + +<ol> + <li><strong>Directional controls:</strong> Verify that the application can be operated + without the use of a touch screen. Attempt to use only directional controls to accomplish the + primary tasks in the application. Use the keyboard and directional-pad (D-Pad) controls in the + Android <a href="{@docRoot}tools/devices/emulator.html">Emulator</a> or use + <a href="http://support.google.com/nexus/bin/answer.py?hl=en&answer=2700718">gesture + navigation</a> on devices with Android 4.1 (API Level 16) or higher. + <p class="note"><strong>Note:</strong> Keyboards and D-pads provide different navigation paths + than accessibility gestures. While gestures allow users to focus on nearly any on-screen + content, keyboard and D-pad navigation only allow focus on input fields and buttons.</p> + </li> + <li><strong>TalkBack audio prompts:</strong> Verify that user interface controls that provide + information (graphics or text) or allow user action have clear and accurate audio descriptions + when <a href="#testing-talkback">TalkBack is enabled</a> and controls are focused. Use + directional controls to move focus between application layout elements.</li> + <li><strong>Explore by Touch prompts:</strong> Verify that user interface controls that + provide information (graphics or text) or allow user action have appropriate audio descriptions + when <a href="#testing-ebt">Explore by Touch is enabled</a>. There should be no + regions where contents or controls do not provide an audio description.</li> + <li><strong>Touchable control sizes:</strong> All controls where a user can select or take an + action must be a minimum of 48 dp (approximately 9mm) in length and width, as recommended by + <a href="{@docRoot}design/patterns/accessibility.html">Android Design</a>.</li> + <li><strong>Gestures work with TalkBack enabled:</strong> Verify that app-specific gestures, + such as zooming images, scrolling lists, swiping between pages or navigating carousel controls + continue to work when <a href="#testing-talkback">TalkBack is enabled</a>. If these gestures do + not function, then an alternative interface for these actions must be provided.</li> + <li><strong>No audio-only feedback:</strong> Audio feedback must always have a secondary + feedback mechanism to support users who are deaf or hard of hearing, for example: A sound alert + for the arrival of a message should also be accompanied by a system + {@link android.app.Notification}, haptic feedback (if available) or another visual alert.</li> +</ol> + + +<h2 id="recommendations">Testing Recommendations</h2> + +<p>The following tests are recommended for ensuring the accessibility of your application. If you + do not test these items, it may impact the overall accessibility and quality of your + application.</p> + +<ol> + <li><strong>Repetitive audio prompting:</strong> Check that closely related controls (such as + items with multiple components in a list) do not simply repeat the same audio prompt. For + example, in a contacts list that contains a contact picture, written name and title, the prompts + should not simply repeat “Bob Smith” for each item.</li> + <li><strong>Audio prompt overloading or underloading:</strong> Check that closely related + controls provide an appropriate level of audio information that enables users to understand and + act on a screen element. Too little or too much prompting can make it difficult to understand + and use a control.</li> +</ol> + + +<h2 id="special-cases">Special Cases and Considerations</h2> + +<p>The following list describes specific situations that should be tested to ensure an + accessible app. Some, none or all of the cases described here may apply to your application. Be + sure to review this list to find out if these special cases apply and take appropriate action.</p> + +<ol> + <li><strong>Review developer special cases and considerations:</strong> Review the list of + <a href="{@docRoot}guide/topics/ui/accessibility/checklist.html#special-cases">special cases</a> + for accessibility development and test your application for the cases that apply.</li> + <li><strong>Prompts for controls that change function:</strong> Buttons or other controls + that change function due to application context or workflow must provide audio prompts + appropriate to their current function. For example, a button that changes function from play + video to pause video should provide an audio prompt which is appropriate to its current state.</li> + <li><strong>Video playback and captioning:</strong> If the application provides video + playback, verify that it supports captioning and subtitles to assist users who are deaf or hard + of hearing. The video playback controls must clearly indicate if captioning is available for a + video and provide a clear way of enabling captions.</li> +</ol> + + +<h2 id="how-to">Testing Accessibility Features</h2> + +<p>Testing of accessibility features such as TalkBack, Explore by Touch and accessibility Gestures +requires setup of your testing device. This section describes how to enable these features for +accessibility testing.</p> + + +<h3 id="test-audibles">Testing audible feedback</h3> + +<p>Audible accessibility feedback features on Android devices provide audio prompts that speaks + the screen content as you move around an application. By enabling these features on an Android + device, you can test the experience of users with blindness or low-vision using your application. +</p> + +<p>Audible feedback for users on Android is typically provided by TalkBack accessibility service and +the Explore by Touch system feature. The TalkBack accessibility service comes preinstalled on most +Android devices and can also be downloaded for free from +<a href="https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback">Google +Play</a>. The Explore by Touch system feature is available on devices running Android 4.0 and later. +</p> + +<h4 id="testing-talkback">Testing with TalkBack</h4> + +<p>The <em>TalkBack</em> accessibility service works by speaking the contents of user interface +controls as the user moves focus onto controls. This service should be enabled as part of testing +focus navigation and audible prompts.</p> + +<p>To enable the TalkBack accessibility service:</p> +<ol> + <li>Launch the <strong>Settings</strong> application.</li> + <li>Navigate to the <strong>Accessibility</strong> category and select it.</li> + <li>Select <strong>Accessibility</strong> to enable it.</li> + <li>Select <strong>TalkBack</strong> to enable it.</li> +</ol> + +<p class="note"> + <strong>Note:</strong> While TalkBack is the most available Android accessibility service for + users with disabilities, other accessibility services are available and may be installed by users. +</p> + +<p>For more information about using TalkBack, see +<a href="http://support.google.com/nexus/bin/answer.py?hl=en&answer=2700928">Use TalkBack</a>.</p> + +<h4 id="testing-ebt">Testing with Explore by Touch</h4> + +<p>The <em>Explore by Touch</em> system feature is available on devices running Android 4.0 and + later, and works by enabling a special accessibility mode that allows users to drag a finger + around the interface of an application and hear the contents of the screen spoken. This feature + does not require screen elements to be focused using an directional controller, but listens for + hover events over user interface controls. +</p> + +<p>To enable Explore by Touch on Android 4.0 and later:</p> +<ol> + <li>Launch the <strong>Settings</strong> application.</li> + <li>Navigate to the <strong>Accessibility</strong> category and select it.</li> + <li>Select the <strong>TalkBack</strong> to enable it. + <p class="note"><strong>Note:</strong> On Android 4.1 (API Level 16) and higher, the system + provides a popup message to enable Explore by Touch. On older versions, you must follow the + step below.</p> + </li> + <li>Return to the <strong>Accessibility</strong> category and select <strong>Explore by +Touch</strong> to enable it. + <p class="note"><strong>Note:</strong> You must turn on TalkBack <em>first</em>, otherwise this +option is not available.</p> + </li> +</ol> + +<p>For more information about using the Explore by Touch features, see +<a href="http://support.google.com/nexus/bin/answer.py?hl=en&answer=2700722">Use Explore by +Touch</a>.</p> + +<h3 id="test-navigation">Testing focus navigation</h3> + +<p>Focus navigation is the use of directional controls to navigate between the individual user + interface elements of an application in order to operate it. Users with limited vision or limited + manual dexterity often use this mode of navigation instead of touch navigation. As part of + accessibility testing, you should verify that your application can be operated using only + directional controls.</p> + +<p>You can test navigation of your application using only focus controls, even if your test devices + does not have a directional controller. The <a href="{@docRoot}tools/help/emulator.html">Android + Emulator</a> provides a simulated directional controller that you can use to test navigation. You + can also use a software-based directional controller, such as the one provided by the + <a href="https://play.google.com/store/apps/details?id=com.googlecode.eyesfree.inputmethod.latin" + >Eyes-Free Keyboard</a> to simulate use of a D-pad on a test device that does not have a physical + D-pad.</p> + + +<h3 id="test-gestures">Testing gesture navigation</h3> + +<p>Gesture navigation is an accessibility navigation mode that allows users to navigate Android + devices and applications using specific + <a href="http://support.google.com/nexus/bin/answer.py?hl=en&answer=2700718">gestures</a>. This + navigation mode is available on Android 4.1 (API Level 16) and higher.</p> + +<p class="note"><strong>Note:</strong> Accessibility gestures provide a different navigation path +than keyboards and D-pads. While gestures allow users to focus on nearly any on-screen +content, keyboard and D-pad navigation only allow focus on input fields and buttons.</p> + +<p>To enable gesture navigation on Android 4.1 and later:</p> +<ul> + <li>Enable both TalkBack and the Explore by Touch feature as described in the + <a href="#testing-ebt">Testing with Explore by Touch</a>. When <em>both</em> of these + features are enabled, accessibility gestures are automatically enabled.</li> + <li>You can change gesture settings using <strong>Settings > Accessibility > TalkBack > + Settings > Manage shortcut gestures</strong>. +</ul> + +<p>For more information about using Explore by Touch accessibility gestures, see +<a href="http://support.google.com/android/bin/topic.py?hl=en&topic=2492346">Accessibility +gestures</a>.</p> + +<p class="note"> + <strong>Note:</strong> Accessibility services other than TalkBack may map accessibility gestures + to different user actions. If gestures are not producing the expected actions during testing, try + disabling other accessibility services before proceeding.</p>
\ No newline at end of file diff --git a/docs/html/tools/tools_toc.cs b/docs/html/tools/tools_toc.cs index 850e0ec..f3936b8 100644 --- a/docs/html/tools/tools_toc.cs +++ b/docs/html/tools/tools_toc.cs @@ -5,7 +5,7 @@ <a href="<?cs var:toroot ?>tools/index.html"><span class="en">Developer Tools</span></a> </div> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>sdk/index.html"><span class="en">Download</span></a></div> @@ -29,7 +29,7 @@ </li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"> <a href="/tools/workflow/index.html"><span class="en">Workflow</span></a> @@ -39,8 +39,8 @@ <div class="nav-section-header"><a href="/tools/devices/index.html"><span class="en">Setting Up Virtual Devices</span></a></div> <ul> <li><a href="/tools/devices/managing-avds.html"><span class="en">With AVD Manager</span></a></li> - <li><a href="/tools/devices/managing-avds-cmdline.html"><span class="en">From the Command Line</span></a></li> - <li><a href="/tools/devices/emulator.html"><span class="en">Using the Android Emulator</span></a></li> + <li><a href="/tools/devices/managing-avds-cmdline.html"><span class="en">From the Command Line</span></a></li> + <li><a href="/tools/devices/emulator.html"><span class="en">Using the Android Emulator</span></a></li> </ul> </li> <li><a href="/tools/device.html"><span class="en">Using Hardware Devices</span></a></li> @@ -48,16 +48,16 @@ <div class="nav-section-header"><a href="/tools/projects/index.html"><span class="en">Setting Up Projects</span></a></div> <ul> <li><a href="/tools/projects/projects-eclipse.html"><span class="en">From Eclipse with ADT</span></a></li> - <li><a href="/tools/projects/projects-cmdline.html"><span class="en">From the Command Line</span></a></li> + <li><a href="/tools/projects/projects-cmdline.html"><span class="en">From the Command Line</span></a></li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="/tools/building/index.html"><span class="en">Building and Running</span></a></div> <ul> <li><a href="/tools/building/building-eclipse.html"><span class="en">From Eclipse with ADT</span></a></li> - <li><a href="/tools/building/building-cmdline.html"><span class="en">From the Command Line</span></a></li> + <li><a href="/tools/building/building-cmdline.html"><span class="en">From the Command Line</span></a></li> </ul> </li> @@ -76,7 +76,7 @@ </li> <li><a href="<?cs var:toroot ?>tools/testing/testing_otheride.html"> <span class="en">From Other IDEs</span></a> - </li> + </li> <li> <a href="<?cs var:toroot?>tools/testing/activity_testing.html"> <span class="en">Activity Testing</span></a> @@ -90,6 +90,10 @@ <span class="en">Content Provider Testing</span></a> </li> <li> + <a href="<?cs var:toroot?>tools/testing/testing_accessibility.html"> + <span class="en">Accessibility Testing</span></a> + </li> + <li> <a href="<?cs var:toroot ?>tools/testing/what_to_test.html"> <span class="en">What To Test</span></a> </li> @@ -160,7 +164,7 @@ class="en">MonkeyRunner</span></a></li> <li><a href="<?cs var:toroot ?>tools/help/zipalign.html">zipalign</a></li> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>tools/revisions/index.html"><span class="en">Revisions</span></a></div> @@ -178,8 +182,8 @@ class="en">MonkeyRunner</span></a></li> class="en">Platforms</span></a></li> </ul> </li> - - + + <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>tools/extras/index.html"><span class="en">Extras</span></a></div> @@ -192,13 +196,13 @@ class="en">USB Drivers</span></a> </ul> </li> - + <li class="nav-section"> <div class="nav-section-header empty"><a href="<?cs var:toroot ?>tools/samples/index.html"><span class="en">Samples</span></a></div> </li> - + <li class="nav-section"> <div class="nav-section-header"> <a href="<?cs var:toroot ?>tools/adk/index.html"> @@ -217,7 +221,7 @@ class="en">USB Drivers</span></a> </li> </ul> </li> - + </ul><!-- nav --> <script type="text/javascript"> |