Implement live result-count announcements
epic-contact-search-accessible-ui-task-003 — Add a Semantics live region to the AccessibleSearchInputField that announces the number of search results after each debounced query completes. Use SemanticsService.announce() or a dedicated LiveRegionAnnouncer widget to broadcast result count changes to screen readers without disrupting focus.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 2 - 518 tasks
Can start after Tier 1 completes
Implementation Notes
Prefer a small stateless LiveRegionAnnouncer widget that listens to a ValueNotifier
Pass the result count down from the parent via the existing state provider (Riverpod or BLoC) rather than introducing a separate stream.
Testing Requirements
Unit tests using flutter_test with SemanticsController: verify announce() is called with correct string after debounce, verify no announcement on initial render, verify throttling prevents duplicate announcements. Integration test: type in search field, await debounce, assert semantic announcement string. Manual VoiceOver and TalkBack verification on physical devices required before merge.
Flutter's Semantics live region support for announcing dynamic result count changes may behave inconsistently between VoiceOver (iOS) and TalkBack (Android), particularly regarding announcement throttling and focus management, causing the feature to pass testing on one platform and fail on the other.
Mitigation & Contingency
Mitigation: Test live region announcements on both iOS (VoiceOver) and Android (TalkBack) early in development using the existing accessibility test harness. Reference the existing LiveRegionAnnouncer component (608-live-region-announcer) patterns used elsewhere in the app.
Contingency: If cross-platform consistency cannot be achieved, implement a platform-specific announcement strategy using the SemanticsService.announce API with platform-conditional announcement timing to work around OS-specific throttling behaviour.
Voice-to-text progressive enhancement for Blindeforbundet may not be available or may behave unpredictably on all device/OS combinations, particularly older Android devices, potentially causing crashes or silent failures that degrade the search experience.
Mitigation & Contingency
Mitigation: Implement voice-to-text as a strictly optional enhancement: detect availability at runtime, show the microphone button only when the platform speech API reports availability, and wrap all voice invocations in try/catch with graceful degradation to standard text input.
Contingency: If voice-to-text causes instability on a subset of devices discovered during TestFlight/beta, disable the feature flag for that platform version while a fix is investigated, without impacting the core text-based search functionality.