Aegix Global, LLC

Accessibility Remediation Plan

Aegix Platform — Safety and Incident Management · Effective April 7, 2026 \| Contact: Aegix Global \| [Back to VPAT Index](/vpat/) · Last reviewed 2026-04-03

Last reviewed 2026-04-03

Accessibility 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

PhaseScopeStatusTimeline
Phase 1Critical — TalkBack/VoiceOver blockers, missing semantics, safety-critical screensCompleteWeeks 1-3
Phase 2High — Color contrast, touch targets, gesture alternativesIn ProgressWeeks 4-6
Phase 3Medium — Focus management, reduced motion, polishPlannedWeeks 7-9
Phase 4Testing — Automated accessibility tests, CI/CD integrationPlannedWeeks 10-12

AIM Android — Remediation Progress

Status: Does Not SupportPartially Supports | 26 items resolved, 16 remaining

Completed Improvements

#WCAG CriterionFileChange
11.1.1 Non-text Contentfoundation/design-system/shared/.../CustomViews.ktimageView() and drawableView() now accept contentDesc parameter instead of hardcoded strings.
21.1.1 Non-text Contentproducts/aim/wear/.../InitAlertScreen.ktHero image now has contentDescription = stringResource(R.string.content_desc_current_alert).
31.1.1 Non-text Contentproducts/aim/wear/.../InitAlertScreen.ktStartLayoutButton images marked as decorative (contentDescription = null) since Row provides accessible label via onClickLabel.
41.1.1 Non-text Contentproducts/aim/phone/.../AlertIconSection.ktAlert icon GlideImage uses stringResource(R.string.content_desc_alert_icon). Change icon image uses stringResource(R.string.content_desc_change_alert_icon).
51.1.1 Non-text Contentproducts/aim/phone/.../fragment_end_alert.xmlAlert type icon ImageView has contentDescription. Tower images marked importantForAccessibility="no".
61.1.1 Non-text Contentproducts/aim/phone/.../fragment_alert_detail.xmlTower images marked importantForAccessibility="no".
71.3.1 Info and Relationshipsproducts/aim/wear/.../StartAlertScreen.kt”EMERGENCY” and “ATTENTION” section headers now have Modifier.semantics { heading() }.
81.3.1 Info and Relationshipsproducts/aim/wear/.../SiteSelectionScreen.kt”SITES” header has Modifier.semantics { heading() }. Hardcoded string replaced with stringResource.
91.3.1 Info and Relationshipsproducts/aim/wear/.../InitAlertScreen.ktStartLayoutButton now uses clickable(role = Role.Button, onClickLabel = ...).
101.3.1 Info and Relationshipsproducts/aim/wear/.../StartAlertScreen.ktAlertTypeItem now uses clickable(role = Role.Button, onClickLabel = ...).
111.3.1 Info and Relationshipsproducts/aim/wear/.../SiteSelectionScreen.ktSiteRow now uses clickable(role = Role.Button, onClickLabel = ...).
121.3.1 Info and Relationshipsproducts/aim/phone/.../fragment_alert_detail.xmltvPoliceStatus has android:labelFor="@+id/spinnerPoliceStatus". tvGuidance has android:labelFor="@+id/spinnerGuidance". tvStatus has android:accessibilityHeading="true".
131.3.1 Info and Relationshipsproducts/aim/phone/.../fragment_end_alert.xmlTvEndAlert has android:accessibilityHeading="true". tvTitle has android:accessibilityHeading="true" and android:labelFor="@+id/rgReason".
141.4.1 Use of Colorproducts/aim/wear/.../SiteSelectionScreen.ktSiteRow now displays a text status label (“Alert active”, “Drill active”, “Safe”) alongside the colored circle. Color circle also has contentDescription via semantics.
151.4.3 Contrastfoundation/design-system/shared/.../AppTheme.ktLight 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).
161.4.3 Contrastproducts/aim/phone/.../colors.xmlcolorPrimary: #00B6B4#008F8D. colorPrimary30 updated to match.
171.4.4 Resize Textproducts/aim/phone/.../BaseActivity.ktRemoved config.fontScale = 1.0f override — app now respects user’s system font scale preference.
181.4.4 Resize Textproducts/aim/phone/.../SplashActivity.ktRemoved config.fontScale = 1.0f override.
193.3.1 Error Identificationproducts/aim/phone/.../EndAlertFragment.ktAll toast() calls replaced with Snackbar.make(...).show(). Hardcoded error strings replaced with string resources.
203.3.1 Error Identificationproducts/aim/phone/.../SplashActivity.ktToast.makeText() replaced with Snackbar.make(...).show().
214.1.2 Name, Role, Valueproducts/aim/wear/.../InitAlertScreen.ktStartLayoutButton has Role.Button and descriptive onClickLabel.
224.1.2 Name, Role, Valueproducts/aim/wear/.../StartAlertScreen.ktAlertTypeItem has Role.Button with onClickLabel including alert type name.
234.1.2 Name, Role, Valueproducts/aim/wear/.../SiteSelectionScreen.ktSiteRow has Role.Button with onClickLabel.
244.1.3 Status Messagesfoundation/design-system/shared/.../ProgressScreen.ktLoading dialog Column has Modifier.semantics { liveRegion = LiveRegionMode.Polite }.
254.1.3 Status Messagesproducts/aim/phone/.../AlertFragment.ktonAlertStarted() calls announceForAccessibility() with alert/drill status. onAlertEnd() calls announceForAccessibility() with end announcement.
264.1.3 Status Messagesproducts/aim/phone/.../DashboardActivity.ktonSocketStatusChanged() calls announceForAccessibility() for connected/disconnected states.

Remaining Gaps

#WCAG CriterionFileIssue
11.1.1 Non-text ContentVarious phone Compose screensSome non-critical settings screens still use imageView() with default content description.
21.1.1 Non-text ContentLogin screen logoLogo image may still lack specific content description (LoginScreen is Compose-based in auth module).
31.3.1 Info and RelationshipsPhone Compose settings screens~80 .clickable {} calls without role = Role.Button in non-critical settings screens.
41.3.1 Info and RelationshipsDashboardActivity.kt TopAppBarTitle text lacks heading semantics.
51.4.1 Use of ColorPhone module alert type selectionSelected alert type may still be indicated only by border color.
61.4.3 ContrastDisabled button statesalpha = 0.4f may still degrade contrast below 3:1 minimum.
71.4.3 ContrastDark theme alert red#EE003E not yet adjusted (currently ~4.5:1 with white, borderline).
81.4.4 Resize TextFixed-height containersSome containers with height(120.dp) or similar may clip text at 200% scale. Should be changed to heightIn(min = 120.dp).
91.4.11 Non-text ContrastDropdown fieldsOutlinedTextField with transparent border colors.
101.4.11 Non-text ContrastCard borders0.5.dp borders may be imperceptible.
112.4.3 Focus OrderNavigation screensNo focus management after navigation — focus not directed to new screen’s primary content.
122.4.3 Focus OrderError statesAfter login errors, focus does not move to error message.
133.3.1 Error IdentificationOther fragmentsSome non-critical fragments may still use Toast for error messages.
143.3.1 Error IdentificationCompose screensError display in Compose screens should use inline error text with liveRegion.
154.1.3 Status MessagesGuidance text updatesGuidance plan text in alert detail does not announce via live region when selection changes.
164.1.3 Status MessagesPull-to-refresh loadingLoading state during pull-to-refresh not announced.

AIM iOS — Remediation Progress

Status: Does Not SupportPartially Supports | 10 key improvements, 14 areas remaining

Key Improvements Made

#AreaDescription
1UIAccessibility API usageaccessibilityLabel, accessibilityTraits, accessibilityHint, accessibilityValue, and UIAccessibility.post(notification:) added across all safety-critical screens (alert, login, chat, map)
2Dynamic Type infrastructureUIFont+Accessibility.swift extension created with scaledFont and enableDynamicType methods; adjustsFontForContentSizeCategory enabled on key labels
3VoiceOver announcementsPolice status changes, connection status, error messages, and badge updates now announced
4Touch targetsShare button (24→44pt), radio buttons (24→44pt), checkbox (20→44pt), map controls set to 44pt minimum
5Color contrastConnectionBannerView text changed from white-on-orange (3.1:1) to black-on-orange (5.7:1)
6Non-color indicatorsConnectionBannerView now includes wifi.slash icon; alert cells include text status
7Reduced motionConnectionBannerManager respects isReduceMotionEnabled
8Input purposeLogin fields declare textContentType for autofill
9Semantic groupingChat messages grouped; section headers have .header trait
10Accessibility helpersUIView+Accessibility.swift with AccessibleButton, configureAsAccessibilityGroup, announcement helpers

Remaining Work

#AreaDescription
1Varioussome admin and report screen sections may need additional header traits.
2Variousfull audit of all 27 color asset pairings not yet completed.
3Variousmigration of all 307 files from fixed font sizes to Dynamic Type-aware fonts.
4Varioussome custom gesture recognizers in tutorial and chat mention views may need keyboard alternatives.
5Variousadmin and report screen section headers.
6Varioussome smaller controls in admin/report screens.
7Variousnot all form validation errors announced.
8Varioussome admin/report custom controls need trait declarations.
9Variouschat message arrival announcements, form submission results.
10Variousfull VoiceOver audit of admin/report screens.
11Variousbulk migration of all font sizes to Dynamic Type.
12Varioussome status indicators may still rely on color alone.
13Varioussome smaller controls in admin screens.
14Variousfull font migration for Dynamic Type.

Web Products — Previously Completed

The following web application VPATs were published with remediation already incorporated:

ProductStatusItems ResolvedKey Improvements
AIM WebPartially Supports33ARIA landmarks, form labels, color contrast, keyboard navigation, error handling
One WebPartially Supports28Screen reader support, focus management, semantic HTML, responsive design
SMS WebPartially Supports19ARIA roles, keyboard support, contrast improvements, form validation

Next Steps

Phase 2 Priorities (In Progress)

  1. Color contrast refinement: Complete dark theme alert red adjustment, fix disabled state contrast across iOS and Android
  2. Touch target sizes: Audit and fix all interactive elements below 48dp (Android) / 44pt (iOS) minimum
  3. Gesture alternatives: Add button alternatives for pull-to-refresh and swipe actions
  4. Non-text contrast: Fix transparent dropdown borders and thin card borders
  5. Dynamic Type migration: Complete iOS migration of 307 files from fixed fonts to Dynamic Type

Phase 3 Priorities (Planned)

  1. Focus management: Implement FocusRequester (Android) / VoiceOver focus (iOS) on navigation transitions
  2. Reduced motion: Extend prefers-reduced-motion / isReduceMotionEnabled support across all animations
  3. Keyboard/Switch Access: Full D-pad, Switch Control, and external keyboard testing
  4. Text spacing: Add iOS support for user-adjusted text spacing (currently Does Not Support)

Phase 4: Testing & CI/CD

  1. iOS: XCTest accessibility audit integration, CI/CD pipeline
  2. Android: Espresso AccessibilityChecks, Compose UI test assertions, lint accessibility rules
  3. Manual testing: VoiceOver and TalkBack test checklists for all safety-critical flows

Last updated: April 7, 2026 | Contact: Aegix Global | Back to VPAT Index

View this document’s source in Git ↗