Unannounced Dynamic Updates

Id UnannouncedDynamicUpdates
Summary Dynamic changes are not communicated, causing users to miss context changes
Severity Warning
Category Assistive Technologies / Dynamic Feedback
Affects Kotlin and Java files
Implementation Partially covered by Android Lint - Custom lint rule for notifyX(), setText(), setVisibility() patterns without announceForAccessibility() or live regions

Symptom

UI state changes (selection, expansion, completion, etc.) and dynamic content updates lack proper accessibility communication through announceForAccessibility(), accessibilityLiveRegion, sendAccessibilityEvent(), Activity.setTitle(), ViewCompat.setAccessibilityPaneTitle(), View.onInitializeAccessibilityNodeInfo(), or other standard accessibility APIs.

Rationale

Prevents assistive technology users from receiving immediate feedback about state changes or content updates they've triggered, forcing them to manually explore the interface to determine if their actions were successful, significantly impacting task efficiency and user confidence.

Example

Kotlin Code

class ShoppingCartActivity : AppCompatActivity() {
    private lateinit var cartItems: RecyclerView
    private lateinit var adapter: CartAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        cartItems = RecyclerView(this)
        adapter = CartAdapter()
        cartItems.adapter = adapter
        setContentView(cartItems)
    }

    private fun addItemToCart(item: Item) {
        cartItems.add(item)
        adapter.notifyItemInserted(cartItems.size - 1)

        // Missing: announceForAccessibility("${item.name} added to cart")
        // TalkBack users don't know the action succeeded
    }
}

GitHub issues under this tag