Aegix Global, LLC
Accessibility Remediation Plan
Last reviewed 2026-04-03Accessibility Remediation Plan — Aegix Global
Executive Summary
This remediation plan tracks accessibility improvements across all Aegix platform products, targeting WCAG 2.1 Level AA, Section 508, and EN 301 549 compliance.
| Product | Previous Status | Current Status | Items Resolved | Items Remaining | VPAT Link |
|---|---|---|---|---|---|
| AIM Web | Partially Supports | Partially Supports | 33 | — | View VPAT |
| One Web | Partially Supports | Partially Supports | 28 | — | View VPAT |
| SMS Web | Partially Supports | Partially Supports | 19 | — | View VPAT |
| AIM iOS | Does Not Support | Partially Supports | 10 | 14 | View VPAT |
| AIM Android | Does Not Support | Partially Supports | 26 | 16 | View VPAT |
| Total | 116 | ||||
Remediation Timeline
| Phase | Scope | Status | Timeline |
|---|---|---|---|
| Phase 1 | Critical — TalkBack/VoiceOver blockers, missing semantics, safety-critical screens | Complete | Weeks 1-3 |
| Phase 2 | High — Color contrast, touch targets, gesture alternatives | In Progress | Weeks 4-6 |
| Phase 3 | Medium — Focus management, reduced motion, polish | Planned | Weeks 7-9 |
| Phase 4 | Testing — Automated accessibility tests, CI/CD integration | Planned | Weeks 10-12 |
AIM Android — Remediation Progress
Status: Does Not Support → Partially Supports | 26 items resolved, 16 remaining
Completed Improvements
| # | WCAG Criterion | File | Change |
|---|---|---|---|
| 1 | 1.1.1 Non-text Content | foundation/design-system/shared/.../CustomViews.kt | imageView() and drawableView() now accept contentDesc parameter instead of hardcoded strings. |
| 2 | 1.1.1 Non-text Content | products/aim/wear/.../InitAlertScreen.kt | Hero image now has contentDescription = stringResource(R.string.content_desc_current_alert). |
| 3 | 1.1.1 Non-text Content | products/aim/wear/.../InitAlertScreen.kt | StartLayoutButton images marked as decorative (contentDescription = null) since Row provides accessible label via onClickLabel. |
| 4 | 1.1.1 Non-text Content | products/aim/phone/.../AlertIconSection.kt | Alert icon GlideImage uses stringResource(R.string.content_desc_alert_icon). Change icon image uses stringResource(R.string.content_desc_change_alert_icon). |
| 5 | 1.1.1 Non-text Content | products/aim/phone/.../fragment_end_alert.xml | Alert type icon ImageView has contentDescription. Tower images marked importantForAccessibility="no". |
| 6 | 1.1.1 Non-text Content | products/aim/phone/.../fragment_alert_detail.xml | Tower images marked importantForAccessibility="no". |
| 7 | 1.3.1 Info and Relationships | products/aim/wear/.../StartAlertScreen.kt | ”EMERGENCY” and “ATTENTION” section headers now have Modifier.semantics { heading() }. |
| 8 | 1.3.1 Info and Relationships | products/aim/wear/.../SiteSelectionScreen.kt | ”SITES” header has Modifier.semantics { heading() }. Hardcoded string replaced with stringResource. |
| 9 | 1.3.1 Info and Relationships | products/aim/wear/.../InitAlertScreen.kt | StartLayoutButton now uses clickable(role = Role.Button, onClickLabel = ...). |
| 10 | 1.3.1 Info and Relationships | products/aim/wear/.../StartAlertScreen.kt | AlertTypeItem now uses clickable(role = Role.Button, onClickLabel = ...). |
| 11 | 1.3.1 Info and Relationships | products/aim/wear/.../SiteSelectionScreen.kt | SiteRow now uses clickable(role = Role.Button, onClickLabel = ...). |
| 12 | 1.3.1 Info and Relationships | products/aim/phone/.../fragment_alert_detail.xml | tvPoliceStatus has android:labelFor="@+id/spinnerPoliceStatus". tvGuidance has android:labelFor="@+id/spinnerGuidance". tvStatus has android:accessibilityHeading="true". |
| 13 | 1.3.1 Info and Relationships | products/aim/phone/.../fragment_end_alert.xml | TvEndAlert has android:accessibilityHeading="true". tvTitle has android:accessibilityHeading="true" and android:labelFor="@+id/rgReason". |
| 14 | 1.4.1 Use of Color | products/aim/wear/.../SiteSelectionScreen.kt | SiteRow now displays a text status label (“Alert active”, “Drill active”, “Safe”) alongside the colored circle. Color circle also has contentDescription via semantics. |
| 15 | 1.4.3 Contrast | foundation/design-system/shared/.../AppTheme.kt | Light theme primary: #00B6B4 → #008F8D (~5.0:1 against white). Dark theme primary: #00B6B4 → #00D4D2 (~5.0:1 against dark surface). Alert button color (light): #E70E00 → #B80B00 (~5.5:1 with white text). |
| 16 | 1.4.3 Contrast | products/aim/phone/.../colors.xml | colorPrimary: #00B6B4 → #008F8D. colorPrimary30 updated to match. |
| 17 | 1.4.4 Resize Text | products/aim/phone/.../BaseActivity.kt | Removed config.fontScale = 1.0f override — app now respects user’s system font scale preference. |
| 18 | 1.4.4 Resize Text | products/aim/phone/.../SplashActivity.kt | Removed config.fontScale = 1.0f override. |
| 19 | 3.3.1 Error Identification | products/aim/phone/.../EndAlertFragment.kt | All toast() calls replaced with Snackbar.make(...).show(). Hardcoded error strings replaced with string resources. |
| 20 | 3.3.1 Error Identification | products/aim/phone/.../SplashActivity.kt | Toast.makeText() replaced with Snackbar.make(...).show(). |
| 21 | 4.1.2 Name, Role, Value | products/aim/wear/.../InitAlertScreen.kt | StartLayoutButton has Role.Button and descriptive onClickLabel. |
| 22 | 4.1.2 Name, Role, Value | products/aim/wear/.../StartAlertScreen.kt | AlertTypeItem has Role.Button with onClickLabel including alert type name. |
| 23 | 4.1.2 Name, Role, Value | products/aim/wear/.../SiteSelectionScreen.kt | SiteRow has Role.Button with onClickLabel. |
| 24 | 4.1.3 Status Messages | foundation/design-system/shared/.../ProgressScreen.kt | Loading dialog Column has Modifier.semantics { liveRegion = LiveRegionMode.Polite }. |
| 25 | 4.1.3 Status Messages | products/aim/phone/.../AlertFragment.kt | onAlertStarted() calls announceForAccessibility() with alert/drill status. onAlertEnd() calls announceForAccessibility() with end announcement. |
| 26 | 4.1.3 Status Messages | products/aim/phone/.../DashboardActivity.kt | onSocketStatusChanged() calls announceForAccessibility() for connected/disconnected states. |
Remaining Gaps
| # | WCAG Criterion | File | Issue |
|---|---|---|---|
| 1 | 1.1.1 Non-text Content | Various phone Compose screens | Some non-critical settings screens still use imageView() with default content description. |
| 2 | 1.1.1 Non-text Content | Login screen logo | Logo image may still lack specific content description (LoginScreen is Compose-based in auth module). |
| 3 | 1.3.1 Info and Relationships | Phone Compose settings screens | ~80 .clickable {} calls without role = Role.Button in non-critical settings screens. |
| 4 | 1.3.1 Info and Relationships | DashboardActivity.kt TopAppBar | Title text lacks heading semantics. |
| 5 | 1.4.1 Use of Color | Phone module alert type selection | Selected alert type may still be indicated only by border color. |
| 6 | 1.4.3 Contrast | Disabled button states | alpha = 0.4f may still degrade contrast below 3:1 minimum. |
| 7 | 1.4.3 Contrast | Dark theme alert red | #EE003E not yet adjusted (currently ~4.5:1 with white, borderline). |
| 8 | 1.4.4 Resize Text | Fixed-height containers | Some containers with height(120.dp) or similar may clip text at 200% scale. Should be changed to heightIn(min = 120.dp). |
| 9 | 1.4.11 Non-text Contrast | Dropdown fields | OutlinedTextField with transparent border colors. |
| 10 | 1.4.11 Non-text Contrast | Card borders | 0.5.dp borders may be imperceptible. |
| 11 | 2.4.3 Focus Order | Navigation screens | No focus management after navigation — focus not directed to new screen’s primary content. |
| 12 | 2.4.3 Focus Order | Error states | After login errors, focus does not move to error message. |
| 13 | 3.3.1 Error Identification | Other fragments | Some non-critical fragments may still use Toast for error messages. |
| 14 | 3.3.1 Error Identification | Compose screens | Error display in Compose screens should use inline error text with liveRegion. |
| 15 | 4.1.3 Status Messages | Guidance text updates | Guidance plan text in alert detail does not announce via live region when selection changes. |
| 16 | 4.1.3 Status Messages | Pull-to-refresh loading | Loading state during pull-to-refresh not announced. |
AIM iOS — Remediation Progress
Status: Does Not Support → Partially Supports | 10 key improvements, 14 areas remaining
Key Improvements Made
| # | Area | Description |
|---|---|---|
| 1 | UIAccessibility API usage | accessibilityLabel, accessibilityTraits, accessibilityHint, accessibilityValue, and UIAccessibility.post(notification:) added across all safety-critical screens (alert, login, chat, map) |
| 2 | Dynamic Type infrastructure | UIFont+Accessibility.swift extension created with scaledFont and enableDynamicType methods; adjustsFontForContentSizeCategory enabled on key labels |
| 3 | VoiceOver announcements | Police status changes, connection status, error messages, and badge updates now announced |
| 4 | Touch targets | Share button (24→44pt), radio buttons (24→44pt), checkbox (20→44pt), map controls set to 44pt minimum |
| 5 | Color contrast | ConnectionBannerView text changed from white-on-orange (3.1:1) to black-on-orange (5.7:1) |
| 6 | Non-color indicators | ConnectionBannerView now includes wifi.slash icon; alert cells include text status |
| 7 | Reduced motion | ConnectionBannerManager respects isReduceMotionEnabled |
| 8 | Input purpose | Login fields declare textContentType for autofill |
| 9 | Semantic grouping | Chat messages grouped; section headers have .header trait |
| 10 | Accessibility helpers | UIView+Accessibility.swift with AccessibleButton, configureAsAccessibilityGroup, announcement helpers |
Remaining Work
| # | Area | Description |
|---|---|---|
| 1 | Various | some admin and report screen sections may need additional header traits. |
| 2 | Various | full audit of all 27 color asset pairings not yet completed. |
| 3 | Various | migration of all 307 files from fixed font sizes to Dynamic Type-aware fonts. |
| 4 | Various | some custom gesture recognizers in tutorial and chat mention views may need keyboard alternatives. |
| 5 | Various | admin and report screen section headers. |
| 6 | Various | some smaller controls in admin/report screens. |
| 7 | Various | not all form validation errors announced. |
| 8 | Various | some admin/report custom controls need trait declarations. |
| 9 | Various | chat message arrival announcements, form submission results. |
| 10 | Various | full VoiceOver audit of admin/report screens. |
| 11 | Various | bulk migration of all font sizes to Dynamic Type. |
| 12 | Various | some status indicators may still rely on color alone. |
| 13 | Various | some smaller controls in admin screens. |
| 14 | Various | full font migration for Dynamic Type. |
Web Products — Previously Completed
The following web application VPATs were published with remediation already incorporated:
| Product | Status | Items Resolved | Key Improvements |
|---|---|---|---|
| AIM Web | Partially Supports | 33 | ARIA landmarks, form labels, color contrast, keyboard navigation, error handling |
| One Web | Partially Supports | 28 | Screen reader support, focus management, semantic HTML, responsive design |
| SMS Web | Partially Supports | 19 | ARIA roles, keyboard support, contrast improvements, form validation |
Next Steps
Phase 2 Priorities (In Progress)
- Color contrast refinement: Complete dark theme alert red adjustment, fix disabled state contrast across iOS and Android
- Touch target sizes: Audit and fix all interactive elements below 48dp (Android) / 44pt (iOS) minimum
- Gesture alternatives: Add button alternatives for pull-to-refresh and swipe actions
- Non-text contrast: Fix transparent dropdown borders and thin card borders
- Dynamic Type migration: Complete iOS migration of 307 files from fixed fonts to Dynamic Type
Phase 3 Priorities (Planned)
- Focus management: Implement FocusRequester (Android) / VoiceOver focus (iOS) on navigation transitions
- Reduced motion: Extend prefers-reduced-motion / isReduceMotionEnabled support across all animations
- Keyboard/Switch Access: Full D-pad, Switch Control, and external keyboard testing
- Text spacing: Add iOS support for user-adjusted text spacing (currently Does Not Support)
Phase 4: Testing & CI/CD
- iOS: XCTest accessibility audit integration, CI/CD pipeline
- Android: Espresso AccessibilityChecks, Compose UI test assertions, lint accessibility rules
- Manual testing: VoiceOver and TalkBack test checklists for all safety-critical flows
Last updated: April 7, 2026 | Contact: Aegix Global | Back to VPAT Index