Android VPAT journey

Background A Voluntary Product Accessibility Template (VPAT) is a document that outlines how well a product aligns with accessibility (a11y) standards. Its primary purpose is to inform customers about a product’s a11y features, enabling them to make informed decisions before purchasing software. At Slack, we conducted a VPAT by a third party a11y vendor in…

Hye Jung Choi
11 min readbeginner
--
View Original

Overview

This article details Slack's journey through a Voluntary Product Accessibility Template (VPAT) assessment for their Android app, conducted by a third-party vendor in 2024 following their IA4 UI redesign. It covers the major recurring accessibility themes identified, including inaccessible error messages, missing headings, label issues, and drag-and-drop accessibility, along with detailed resolution strategies and lessons learned for each issue mapped to specific WCAG standards.

What You'll Learn

1

How to make error messages accessible to TalkBack screen reader users on Android

2

How to implement accessible drag-and-drop alternatives using TalkBack custom actions

3

Why decorative elements like dividers should be excluded from accessibility list item counts

4

When to deviate from WCAG web standards for Android-native accessibility patterns

5

How to conduct a VPAT triage process and prioritize accessibility issues by severity

Prerequisites & Requirements

  • Basic understanding of Android development and UI components
  • Familiarity with accessibility concepts and screen readers (TalkBack)
  • Understanding of WCAG (Web Content Accessibility Guidelines) standards(optional)
  • Android TalkBack screen reader for testing accessibility changes(optional)

Key Questions Answered

What is a VPAT and why is it important for software products?
A Voluntary Product Accessibility Template (VPAT) is a document that outlines how well a product aligns with accessibility standards. Its primary purpose is to inform customers about a product's accessibility features, enabling them to make informed purchasing decisions. Slack conducted their VPAT via a third-party accessibility vendor in 2024 following their significant IA4 UI redesign.
How do you make Android error messages accessible to TalkBack users?
For errors displayed below edit fields, modify OutlinedTextField so the error is announced immediately. For banner-style errors using SKBanner, update the error type component so that when an error occurs, TalkBack automatically announces the error message. Without these changes, screen reader users must manually swipe through the screen to discover what happened after submitting invalid input.
How do you fix incorrect list item counts announced by TalkBack on Android?
The issue often stems from decorative elements like dividers being counted as list items. Slack's SK Bottom sheet counted divider items within lists, so a list with 7 rows including 2 dividers would announce '7 items' instead of '5 items.' The fix involves introducing an accessibility delegate (like SKListAccessibilityDelegate) that overwrites the CollectionInfo with the correct number of meaningful items, excluding decorative elements.
How do you make drag-and-drop accessible on Android for users with motor impairments?
Implement an Edit mode that displays visual drag handles (six-dot icons) for each draggable item, making the capability discoverable. Additionally, add TalkBack custom actions (like 'Move before' and 'Move after') so screen reader users can reorder items via the TalkBack context menu using three-finger tap or L/r drawing gestures, providing a non-drag alternative.
Should strikethrough text formatting be announced by screen readers?
After consulting with a member of the blind community, Slack decided that announcing strikethrough formatting is not beneficial. Most screen readers don't interpret this format because doing so would be verbose and potentially confusing—users might interpret the strikethrough announcement as part of the message itself. As a best practice, avoid using strikethrough formatting for accessibility reasons, as even some sighted users find it challenging to read.
How do you indicate errors without relying on color alone on Android?
When error messages below edit fields use only red text to indicate an error state, users who cannot perceive color differences cannot distinguish errors from regular text. The solution is to add an error icon alongside the red text, providing a non-color visual indicator. Slack conducted an audit of all their edit field error displays and updated them to include both color and icon indicators consistently.
Do WCAG web standards fully apply to Android native apps?
Not all WCAG standards can be directly applied to Android native apps. Slack's VPAT analysis revealed that certain accessibility issues flagged by the vendor were not applicable to Android's native patterns. For example, the vendor suggested top app bar titles should be headings, but testing other native Android apps showed this pattern is inconsistent with Android platform standards. Teams should test native Google apps and evaluate WCAG applicability per platform.
Should Android app bar titles be marked as headings for accessibility?
Slack's third-party accessibility vendor suggested that titles in the top app bar should be headings, but after testing other native Android apps, Slack found this pattern is not consistent with Android platform standards. They closed those tickets, demonstrating that blindly following WCAG web guidelines may not always be appropriate for native mobile apps. Teams should verify platform conventions before implementing vendor recommendations.

Technologies & Tools

Platform
Android
Primary mobile platform for the accessibility improvements
Accessibility Tool
Talkback
Android screen reader used for testing and announcing accessibility information
UI Framework
Jetpack Compose
OutlinedTextField component used for edit fields with error states
Accessibility Standard
Wcag
Web Content Accessibility Guidelines used as reference for VPAT assessment

Key Actionable Insights

1
Always ensure error messages are immediately announced to screen reader users when they occur, rather than requiring users to navigate to discover them. For Android, this means updating both inline error displays (OutlinedTextField) and banner-style errors (like SKBanner) to trigger TalkBack announcements automatically.
This was classified as a P1 issue in Slack's VPAT because it directly prevents screen reader users from understanding the outcome of their actions, creating a fundamentally broken user experience.
2
Exclude purely decorative elements like dividers from accessibility list item counts by implementing custom accessibility delegates. When TalkBack announces list item counts, decorative separators should not inflate the number, as this creates confusion about the actual number of interactive items available.
Slack's SK Bottom sheet dividers were being counted as list items, causing TalkBack to announce incorrect totals. The fix involved creating an SKListAccessibilityDelegate that overwrites CollectionInfo with accurate counts.
3
For any gesture-based interaction like drag-and-drop, always provide an accessible alternative through TalkBack custom actions. Add visible affordances like drag handles in an Edit mode, and implement custom actions such as 'Move before' and 'Move after' in the TalkBack context menu.
Users with motor impairments may not be able to perform drag gestures. Slack added both visual drag handles and TalkBack custom actions accessible via three-finger tap or L/r drawing gestures to their workspace switcher.
4
Never rely on color alone to communicate information like error states. Always pair color indicators with additional visual cues such as icons. Conduct an audit across your app to ensure consistent implementation of multi-signal error indication.
This maps to WCAG 1.4.1 Use of Color (Level A). Slack found inconsistent implementation across screens and had to audit and update multiple edit field error displays to include error icons alongside red text.
5
Test your accessibility decisions against native platform conventions rather than applying WCAG web standards directly to mobile native apps. Verify patterns by testing native Google apps and consulting platform-specific guidelines before implementing vendor recommendations.
Slack's vendor suggested app bar titles should be headings, but this didn't match Android native patterns. The industry still lacks comprehensive platform-specific mobile accessibility guidelines, so teams must do their own research.
6
Collaborate with design teams and members of the disability community when making accessibility decisions, especially for ambiguous cases. Small UI changes like adding a search icon to an edit field can significantly improve the experience for users with cognitive difficulties who may forget the purpose of unlabeled fields.
Slack worked with their design team and blind community members to resolve issues like the strikethrough formatting question, which led to a pragmatic decision that most screen readers intentionally don't announce this format.

Common Pitfalls

1
Including decorative elements like dividers in accessibility list item counts. When purely visual separators are treated as list items, TalkBack announces inflated item counts that confuse screen reader users about how many actual interactive elements exist in a list.
Slack's SK Bottom sheet had this exact problem where 2 dividers among 5 real items caused TalkBack to announce '7 items in a list.' The fix requires implementing a custom accessibility delegate to report correct counts.
2
Using placeholder text as the only label for edit fields. When users enter text, the placeholder disappears and users with cognitive difficulties may forget the purpose of the field, especially in complex forms with multiple inputs.
Adding permanent visual indicators like icons (e.g., a search magnifying glass) provides a persistent cue about the field's purpose. Space constraints may sometimes limit optimal solutions, as Slack found with their message input area.
3
Directly applying WCAG web standards to Android native apps without verifying platform conventions. Third-party accessibility vendors may flag issues based on web standards that don't align with how native Android apps are designed and used.
Slack's vendor recommended marking top app bar titles as headings, but this isn't consistent with native Android patterns. Always test native Google apps to establish baseline platform behavior before accepting or rejecting vendor findings.
4
Relying solely on color (like red text) to indicate error states without providing additional visual cues. Users who are color blind or have visual impairments cannot distinguish error messages from regular text when color is the only differentiator.
The fix is straightforward—add error icons alongside colored text—but inconsistent implementation across screens means teams need to conduct a full audit to ensure all error displays follow the same accessible pattern.
5
Announcing strikethrough text formatting to screen reader users, which adds verbosity and confusion. Screen reader users may interpret the strikethrough announcement as part of the message content rather than as formatting metadata.
Most screen readers intentionally don't interpret strikethrough formatting. Slack consulted with blind community members and confirmed this is not an issue worth solving, and instead recommends avoiding strikethrough formatting altogether for accessibility.

Related Concepts

Vpat (voluntary Product Accessibility Template)
Wcag Compliance
Talkback Screen Reader
Android Accessibility
Screen Reader Announcements
Accessible Drag-and-drop Alternatives
Color Contrast And Error Indication
Semantic Headings For Assistive Technology
Accessibility Auditing And Triage
Mobile Native Vs. Web Accessibility Standards
Inclusive Design
Keyboard Navigation On Android Tablets