Aegix Global, LLC

AIM Android — VPAT 2.5

Aegix Platform — Safety and Incident Management · Last reviewed 2026-04-03

Last reviewed 2026-04-03

VPAT 2.5 — Aegix AIM Android Application

Product NameAegix AIM (Alert & Incident Management) Android App
Product VersionCurrent (as of 2026-04-07)
Report Date2026-04-07
VPAT Version2.5 (Revision 1)
ContactAegix Global
Evaluation MethodsStatic code analysis of all Activities, Fragments, Compose UI screens, XML layouts, custom Views, and service components

Applicable Standards

  • WCAG 2.1 Level A and Level AA
  • Revised Section 508 (2017)
  • EN 301 549 V3.2.1 (2021-03) Chapter 11 (Mobile Software)

Conformance Level Definitions

TermDescription
SupportsFully meets the criterion
Partially SupportsSome functionality meets the criterion
Does Not SupportMajority of functionality does not meet the criterion
Not ApplicableThe criterion is not relevant

Table 1: WCAG 2.1 Level A and AA Report

Principle 1: Perceivable

1.1.1 Non-text Content (Level A)

Conformance LevelPartially Supports
RemarksCore alert screens now have meaningful contentDescription attributes. Design system imageView() and drawableView() functions accept content description parameters. Some non-critical screens still use default descriptions.

Remediation completed:

#FileChange
1foundation/design-system/shared/.../CustomViews.ktimageView() and drawableView() now accept contentDesc parameter instead of hardcoded strings.
2products/aim/wear/.../InitAlertScreen.ktHero image now has contentDescription = stringResource(R.string.content_desc_current_alert).
3products/aim/wear/.../InitAlertScreen.ktStartLayoutButton images marked as decorative (contentDescription = null) since Row provides accessible label via onClickLabel.
4products/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).
5products/aim/phone/.../fragment_end_alert.xmlAlert type icon ImageView has contentDescription. Tower images marked importantForAccessibility="no".
6products/aim/phone/.../fragment_alert_detail.xmlTower images marked importantForAccessibility="no".

Remaining items:

#FileIssue
1Various phone Compose screensSome non-critical settings screens still use imageView() with default content description.
2Login screen logoLogo image may still lack specific content description (LoginScreen is Compose-based in auth module).

1.3.1 Info and Relationships (Level A)

Conformance LevelPartially Supports
RemarksHeading semantics added to safety-critical screens (wear module alert screens, phone XML layouts). Custom clickable elements on alert screens now have Role.Button semantics. Form labels linked to controls via android:labelFor. Some non-critical screens still lack heading and role semantics.

Remediation completed:

#FileChange
1products/aim/wear/.../StartAlertScreen.kt”EMERGENCY” and “ATTENTION” section headers now have Modifier.semantics { heading() }.
2products/aim/wear/.../SiteSelectionScreen.kt”SITES” header has Modifier.semantics { heading() }. Hardcoded string replaced with stringResource.
3products/aim/wear/.../InitAlertScreen.ktStartLayoutButton now uses clickable(role = Role.Button, onClickLabel = ...).
4products/aim/wear/.../StartAlertScreen.ktAlertTypeItem now uses clickable(role = Role.Button, onClickLabel = ...).
5products/aim/wear/.../SiteSelectionScreen.ktSiteRow now uses clickable(role = Role.Button, onClickLabel = ...).
6products/aim/phone/.../fragment_alert_detail.xmltvPoliceStatus has android:labelFor="@+id/spinnerPoliceStatus". tvGuidance has android:labelFor="@+id/spinnerGuidance". tvStatus has android:accessibilityHeading="true".
7products/aim/phone/.../fragment_end_alert.xmlTvEndAlert has android:accessibilityHeading="true". tvTitle has android:accessibilityHeading="true" and android:labelFor="@+id/rgReason".

Remaining items:

#FileIssue
1Phone Compose settings screens~80 .clickable {} calls without role = Role.Button in non-critical settings screens.
2DashboardActivity.kt TopAppBarTitle text lacks heading semantics.

1.3.4 Orientation (Level AA)

Conformance LevelSupports
RemarksNo android:screenOrientation lock found in AndroidManifest.xml. Activities support both portrait and landscape.

1.4.1 Use of Color (Level A)

Conformance LevelPartially Supports
RemarksSite selection status indicator now includes text label alongside color circle.

Remediation completed:

#FileChange
1products/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.

Remaining items:

#FileIssue
1Phone module alert type selectionSelected alert type may still be indicated only by border color.

1.4.3 Contrast (Minimum) (Level AA)

Conformance LevelPartially Supports
RemarksPrimary teal color adjusted for better contrast in both light and dark themes. Alert red darkened for body text contrast.

Remediation completed:

#FileChange
1foundation/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).
2products/aim/phone/.../colors.xmlcolorPrimary: #00B6B4#008F8D. colorPrimary30 updated to match.

Remaining items:

#FileIssue
1Disabled button statesalpha = 0.4f may still degrade contrast below 3:1 minimum.
2Dark theme alert red#EE003E not yet adjusted (currently ~4.5:1 with white, borderline).

1.4.4 Resize Text (Level AA)

Conformance LevelSupports
RemarksSystem font scale override removed. Text uses sp units throughout.

Remediation completed:

#FileChange
1products/aim/phone/.../BaseActivity.ktRemoved config.fontScale = 1.0f override — app now respects user’s system font scale preference.
2products/aim/phone/.../SplashActivity.ktRemoved config.fontScale = 1.0f override.

Remaining items:

#FileIssue
1Fixed-height containersSome containers with height(120.dp) or similar may clip text at 200% scale. Should be changed to heightIn(min = 120.dp).

1.4.11 Non-text Contrast (Level AA)

Conformance LevelPartially Supports
RemarksSome UI component boundaries still use transparent or thin borders.

Remaining items:

#FileIssue
1Dropdown fieldsOutlinedTextField with transparent border colors.
2Card borders0.5.dp borders may be imperceptible.

Principle 2: Operable

2.1.1 Keyboard (Level A)

Conformance LevelPartially Supports
RemarksCompose built-in components (Button, TextField) support D-pad/keyboard. Custom clickable elements in wear alert screens now have proper role semantics enabling keyboard interaction.

2.4.3 Focus Order (Level A)

Conformance LevelPartially Supports
RemarksNo FocusRequester used on screen transitions. Overlay service with FLAG_NOT_FOCUSABLE no longer exists in the current codebase (safety issue from original VPAT is resolved).

Remaining items:

#FileIssue
1Navigation screensNo focus management after navigation — focus not directed to new screen’s primary content.
2Error statesAfter login errors, focus does not move to error message.

2.4.6 Headings and Labels (Level AA)

Conformance LevelPartially Supports
RemarksHeading semantics added to safety-critical screens. See 1.3.1 remediation above.

2.5.1 Pointer Gestures (Level A)

Conformance LevelPartially Supports
RemarksPull-to-refresh still lacks a button alternative on some screens.
Conformance LevelPartially Supports
RemarksSome interactive elements still fall below Android’s 48x48dp minimum touch target.

2.5.8 Target Size (Minimum) (Level AA — WCAG 2.2)

Conformance LevelPartially Supports
RemarksMinimum 24x24dp is met in most cases.

Principle 3: Understandable

3.3.1 Error Identification (Level A)

Conformance LevelPartially Supports
RemarksToast-based errors replaced with Snackbar in safety-critical flows (EndAlertFragment, SplashActivity). Snackbar is focusable and reliably announced by TalkBack.

Remediation completed:

#FileChange
1products/aim/phone/.../EndAlertFragment.ktAll toast() calls replaced with Snackbar.make(...).show(). Hardcoded error strings replaced with string resources.
2products/aim/phone/.../SplashActivity.ktToast.makeText() replaced with Snackbar.make(...).show().

Remaining items:

#FileIssue
1Other fragmentsSome non-critical fragments may still use Toast for error messages.
2Compose screensError display in Compose screens should use inline error text with liveRegion.

3.3.2 Labels or Instructions (Level A)

Conformance LevelPartially Supports
Remarksandroid:labelFor added to police status and guidance labels in alert detail. Radio group label linked in end alert screen.

Principle 4: Robust

4.1.2 Name, Role, Value (Level A)

Conformance LevelPartially Supports
RemarksSafety-critical custom interactive elements now have Role.Button semantics with onClickLabel. Wear alert screens fully remediated. Phone settings Compose screens still lack role semantics on many clickable elements.

Remediation completed:

#FileChange
1products/aim/wear/.../InitAlertScreen.ktStartLayoutButton has Role.Button and descriptive onClickLabel.
2products/aim/wear/.../StartAlertScreen.ktAlertTypeItem has Role.Button with onClickLabel including alert type name.
3products/aim/wear/.../SiteSelectionScreen.ktSiteRow has Role.Button with onClickLabel.

4.1.3 Status Messages (Level AA)

Conformance LevelPartially Supports
RemarksLive region added to ProgressScreen loading dialog. Alert start/end events now announced via announceForAccessibility(). Socket connection status changes announced.

Remediation completed:

#FileChange
1foundation/design-system/shared/.../ProgressScreen.ktLoading dialog Column has Modifier.semantics { liveRegion = LiveRegionMode.Polite }.
2products/aim/phone/.../AlertFragment.ktonAlertStarted() calls announceForAccessibility() with alert/drill status. onAlertEnd() calls announceForAccessibility() with end announcement.
3products/aim/phone/.../DashboardActivity.ktonSocketStatusChanged() calls announceForAccessibility() for connected/disconnected states.

Remaining items:

#FileIssue
1Guidance text updatesGuidance plan text in alert detail does not announce via live region when selection changes.
2Pull-to-refresh loadingLoading state during pull-to-refresh not announced.

Table 2: Revised Section 508 — Functional Performance Criteria

CriterionConformanceRemarks
302.1 Without VisionPartially SupportsSafety-critical alert screens now have contentDescription, Role.Button semantics, heading structure, and live region announcements for alert start/end events. Overlay service no longer exists in codebase.
302.2 With Limited VisionPartially SupportsText uses sp units. System font scale override removed — app respects user preferences. Color contrast improved (primary teal and alert red adjusted). Some fixed-height containers may clip scaled text.
302.3 Without Perception of ColorPartially SupportsStatus indicator in SiteSelectionScreen now includes text label alongside color. Some alert type selection screens may still use color as sole differentiator.
302.4 Without HearingPartially SupportsAlert notifications now include vibration pattern via .setVibrate() and notification channel enableVibration().
302.5 With Limited HearingPartially SupportsNotifications provide visual content with vibration alternative.
302.6 Without SpeechSupportsApp does not require speech input.
302.7 With Limited ManipulationPartially SupportsMost controls are single-tap. Pull-to-refresh still lacks button alternative on some screens. Touch targets below 48dp in some areas.
302.8 With Limited Reach and StrengthPartially SupportsSame touch target issues as 302.7.
302.9 With Limited Language, Cognitive, and Learning AbilitiesPartially SupportsSimple UI flow. Error messages now use Snackbar (persistent, dismissible) instead of transient Toast.

Table 3: EN 301 549 Chapter 11 — Mobile Software

ClauseCriterionConformanceRemarks
11.1.1.1Non-text ContentPartially SupportsSafety-critical images now have contentDescription. Design system components accept content description parameters.
11.1.3.1Info and RelationshipsPartially SupportsHeading semantics and Role.Button added to wear alert screens and phone alert XML layouts. Form labels linked via labelFor.
11.1.3.4OrientationSupportsNo orientation lock in manifest.
11.1.4.3Contrast (Minimum)Partially SupportsPrimary teal adjusted: light #008F8D (~5.0:1), dark #00D4D2 (~5.0:1). Alert red adjusted to #B80B00 (~5.5:1).
11.1.4.4Resize TextSupportsfontScale override removed. Text uses sp.
11.1.4.11Non-text ContrastPartially SupportsSome dropdown field boundaries still transparent.
11.2.1.1KeyboardPartially SupportsCustom clickable elements in alert screens now have role semantics enabling keyboard interaction.
11.2.4.3Focus OrderPartially SupportsOverlay service no longer exists. No focus management on navigation transitions.
11.2.4.7Focus VisiblePartially SupportsCompose default focus indicators present on standard and role-annotated components.
11.2.5.1Pointer GesturesPartially SupportsPull-to-refresh still lacks button alternative.
11.3.3.1Error IdentificationPartially SupportsToast replaced with Snackbar in EndAlertFragment and SplashActivity.
11.4.1.2Name, Role, ValuePartially SupportsSafety-critical custom interactive elements now have roles and click labels.
11.4.1.3Status MessagesPartially SupportsLive region on ProgressScreen. Alert start/end/connection announced via announceForAccessibility.
11.5.2.3Use of Accessibility ServicesPartially SupportsTalkBack interaction improved for alert screens. Overlay service removed.
11.5.2.5Object InformationPartially SupportsRoles and states added to wear alert screens. Phone settings screens still lack roles.
11.5.2.7ValuesPartially SupportsForm field values accessible. Status indicator now has text label.
11.5.2.12Execution of Available ActionsPartially SupportsClickable items have onClickLabel for TalkBack action description.
11.5.2.13Tracking of Focus and SelectionPartially SupportsNo focus tracking across screen transitions.
11.5.2.15Change NotificationPartially SupportsAlert start/end events now announced. Loading state has live region. Connection changes announced.
11.5.2.17ModificationsPartially SupportsText fields editable. Status text labels visible alongside color.
11.7User PreferencesPartially SupportsRespects system dark theme. Font scale override removed — respects user font size. Does not respect prefers-reduced-motion.
11.8.2Accessible Content CreationNot ApplicableApp does not create content documents.

Summary

Conformance Status: Partially Supports (WCAG 2.1 Level AA overall)

Critical Issues Resolved

  1. System Font Scale Override Removed: (BaseActivity.kt, SplashActivity.kt): config.fontScale = 1.0f removed — users who need larger text now benefit from system font scaling.
  2. Live Regions for Real-time Events: Alert start/end events and connection status changes now announced via announceForAccessibility(). ProgressScreen loading dialog has LiveRegionMode.Polite.
  3. Vibration Alternative for Deaf Users: (LocalNotification.kt): Notification channel and individual notifications now include vibration patterns.
  4. Content Descriptions on Safety-Critical Images: Design system imageView()/drawableView() accept content description parameters. Wear alert screens and phone alert layouts have proper descriptions.
  5. Role.Button Semantics on Custom Interactive Elements: StartLayoutButton, AlertTypeItem, SiteRow in wear alert screens now have Role.Button with descriptive onClickLabel.
  6. Heading Structure on Safety-Critical Screens: “EMERGENCY”, “ATTENTION”, “SITES” in wear screens and alert type name, end alert headers in phone XML layouts have heading semantics.
  7. Color-Independent Status Indicators: Site selection status now shows text labels (“Alert active”, “Drill active”, “Safe”) alongside colored circles.
  8. Improved Color Contrast: Primary teal adjusted from #00B6B4 to #008F8D (light) / #00D4D2 (dark) for 5.0:1 contrast. Alert red adjusted to #B80B00 for 5.5:1 contrast.
  9. Toast Errors Replaced with Snackbar: EndAlertFragment and SplashActivity now use accessible Snackbar instead of unreliable Toast.
  10. Form Labels Linked to Controls: Police status and guidance labels linked to spinners via android:labelFor. Radio group label linked in end alert screen.
  11. Emergency Alert Overlay: The OverlayService.kt with FLAG_NOT_FOCUSABLE referenced in the original VPAT no longer exists in the current codebase — this safety-critical blocker is resolved.
  12. Phone Compose Settings Screens: ~80 clickable elements without Role.Button in non-critical settings screens.
  13. Focus Management: No FocusRequester on navigation transitions.
  14. Touch Target Sizes: Some elements below 48dp minimum.
  15. Pull-to-Refresh Alternative: No button alternative for gesture-dependent refresh.
  16. Non-text Contrast: Some dropdown borders still transparent.
  17. Reduced Motion: App does not respect prefers-reduced-motion.
  18. Automated Testing: No Espresso accessibility checks or CI/CD integration yet.

Remaining Work

  1. Phone Compose Settings Screens: ~80 clickable elements without Role.Button in non-critical settings screens.
  2. Focus Management: No FocusRequester on navigation transitions.
  3. Touch Target Sizes: Some elements below 48dp minimum.
  4. Pull-to-Refresh Alternative: No button alternative for gesture-dependent refresh.
  5. Non-text Contrast: Some dropdown borders still transparent.
  6. Reduced Motion: App does not respect prefers-reduced-motion.
  7. Automated Testing: No Espresso accessibility checks or CI/CD integration yet.

Positive Findings

  • No orientation lock (supports both portrait and landscape)
  • RTL support enabled (android:supportsRtl="true")
  • Text uses sp units (scalable) and system font scale is respected
  • Standard Compose components (Button, TextField, RadioButton) provide baseline accessibility
  • Dark theme support via Material3 dynamic color scheme
  • Alert notifications include vibration for deaf/hard-of-hearing users
  • Real-time alert events announced to screen reader users

View this document’s source in Git ↗