Skip to content

Conversation

@Devasy
Copy link
Owner

@Devasy Devasy commented Jan 30, 2026

Implemented comprehensive accessibility improvements for the mobile application.

Changes:

  • Added accessibilityLabel to all interactive elements (buttons, inputs, list items) across all screens in mobile/screens/.
  • Added accessibilityRole (button, checkbox, progressbar) to ensure correct element identification by screen readers.
  • Added accessibilityHint for destructive actions (e.g., leaving group, deleting group) and complex interactions.
  • Added accessibilityState for custom checkbox implementations.
  • Updated skeleton loading states with accessibilityRole="progressbar".
  • Covered Auth, Dashboard, Groups, and Utility screens.

This ensures the mobile app is usable by screen reader users.


PR created automatically by Jules for task 2448891226254195206 started by @Devasy23

Summary by CodeRabbit

  • New Features

    • Enhanced mobile app accessibility across authentication, groups, expenses, and account screens—improved labels, roles, hints, and state for assistive tech.
  • Documentation

    • Added comprehensive mobile accessibility patterns and updated technical notes to reflect React Native accessibility guidance.
  • Chores

    • Marked a mobile accessibility TODO as completed; removed an outdated mobile pull-to-refresh note.

✏️ Tip: You can customize this high-level summary in your review settings.

Co-authored-by: Devasy <110348311+Devasy@users.noreply.github.com>
@Devasy Devasy requested a review from vrajpatelll as a code owner January 30, 2026 19:55
@google-labs-jules
Copy link
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@netlify
Copy link

netlify bot commented Jan 30, 2026

Deploy Preview for split-but-wiser canceled.

Name Link
🔨 Latest commit f120729
🔍 Latest deploy log https://app.netlify.com/projects/split-but-wiser/deploys/697d90c08c20a600079abfcd

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

Walkthrough

This PR adds accessibility properties (accessibilityLabel, accessibilityRole, accessibilityHint, accessibilityState) across mobile screens and updates .Jules documentation to record a completed mobile accessibility audit and React Native accessibility patterns.

Changes

Cohort / File(s) Summary
Documentation
.Jules/changelog.md, .Jules/knowledge.md, .Jules/todo.md
Documented completed mobile accessibility audit; added React Native accessibility patterns and marked the mobile a11y TODO as completed.
Auth Screens
mobile/screens/LoginScreen.js, mobile/screens/SignupScreen.js
Added accessibilityLabel/accessibilityRole/accessibilityHint to TextInput and Button components; small non-functional JSX refactors for button markup and navigation string quoting.
Account & Profile
mobile/screens/AccountScreen.js, mobile/screens/EditProfileScreen.js
Added accessibilityLabel/accessibilityRole/accessibilityHint to list items, photo button, inputs, and save action buttons.
Home / Dashboard
mobile/screens/HomeScreen.js
Added accessibilityRole/accessibilityLabel/accessibilityHint to group cards, modal TextInput and modal buttons, and app bar actions.
Group flows
mobile/screens/GroupDetailsScreen.js, mobile/screens/GroupSettingsScreen.js, mobile/screens/JoinGroupScreen.js
Added accessibility metadata to expense cards, FABs, settings icons, member controls, inputs, and group action buttons.
Expenses & Import
mobile/screens/AddExpenseScreen.js, mobile/screens/SplitwiseImportScreen.js
Added accessibilityLabel/accessibilityRole/accessibilityState to split checkboxes, per-member inputs, payer selector, Add Expense button, and Splitwise connect button.
Friends / Utilities
mobile/screens/FriendsScreen.js
Added accessibilityRole/accessibilityLabel/accessibilityHint to accordion, loading skeleton, and tooltip/close controls.

Possibly related PRs

Suggested reviewers

  • vrajpatelll
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title '[Mobile] Complete Accessibility Audit' directly and clearly summarizes the main change—comprehensive accessibility improvements across mobile screens.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
mobile/screens/EditProfileScreen.js (1)

101-111: ⚠️ Potential issue | 🟡 Minor

Accessibility label doesn't match dynamic button text.

The accessibilityLabel is static ("Change profile picture") but the visible button text changes dynamically between "Change Photo" and "Add Photo" based on whether an image is picked. Screen reader users may hear a different label than what's visually displayed, causing confusion.

🔧 Proposed fix
          <Button
            mode="outlined"
            onPress={pickImage}
            icon="camera"
            style={styles.imageButton}
-           accessibilityLabel="Change profile picture"
+           accessibilityLabel={pickedImage ? "Change profile picture" : "Add profile picture"}
            accessibilityRole="button"
            accessibilityHint="Opens your media library to select a new photo"
          >
            {pickedImage ? "Change Photo" : "Add Photo"}
          </Button>
mobile/screens/GroupDetailsScreen.js (1)

106-122: ⚠️ Potential issue | 🟡 Minor

Incorrect accessibilityRole="button" on non-interactive Card.

The Card component has accessibilityRole="button" but no onPress handler, meaning it's not interactive. Screen readers will announce this as a button, misleading users into thinking they can interact with it when they cannot.

🔧 Proposed fix - remove button role or add interactivity

If the card is purely informational, remove the button role:

      <Card
        style={styles.card}
-       accessibilityRole="button"
        accessibilityLabel={`Expense: ${item.description}, Amount: ${formatCurrency(
          item.amount
        )}. Paid by ${getMemberName(item.paidBy || item.createdBy)}. ${balanceText}`}
      >

Alternatively, if you intend to make the card tappable (e.g., to view expense details), add an onPress handler.

🤖 Fix all issues with AI agents
In `@mobile/screens/AccountScreen.js`:
- Around line 70-76: The Logout List.Item lacks an accessibilityHint to warn
users about the destructive action; update the logout component (the List.Item
with title "Logout" and onPress={handleLogout}) to include an accessibilityHint
prop (e.g., "Logs you out of the application") so screen readers convey the
consequence of the action; ensure the hint string is consistent with your
i18n/localization approach if applicable.

In `@mobile/screens/GroupSettingsScreen.js`:
- Around line 280-285: The IconButton for removing a member is missing an
accessibilityHint which would clarify the destructive action; update the
IconButton (the instance rendering icon="account-remove") to add an
accessibilityHint prop (e.g., using displayName or static text) that explains
the result like "Removes this member from the group" so screen readers convey
the action's consequence when invoking onKick(userId, displayName).

@Devasy
Copy link
Owner Author

Devasy commented Jan 31, 2026

@jules In @mobile/screens/AccountScreen.js:

  • Around line 70-76: The Logout List.Item lacks an accessibilityHint to warn
    users about the destructive action; update the logout component (the List.Item
    with title "Logout" and onPress={handleLogout}) to include an accessibilityHint
    prop (e.g., "Logs you out of the application") so screen readers convey the
    consequence of the action; ensure the hint string is consistent with your
    i18n/localization approach if applicable.

In @mobile/screens/GroupSettingsScreen.js:

  • Around line 280-285: The IconButton for removing a member is missing an
    accessibilityHint which would clarify the destructive action; update the
    IconButton (the instance rendering icon="account-remove") to add an
    accessibilityHint prop (e.g., using displayName or static text) that explains
    the result like "Removes this member from the group" so screen readers convey
    the action's consequence when invoking onKick(userId, displayName).

@google-labs-jules
Copy link
Contributor

@jules In @mobile/screens/AccountScreen.js:

  • Around line 70-76: The Logout List.Item lacks an accessibilityHint to warn
    users about the destructive action; update the logout component (the List.Item
    with title "Logout" and onPress={handleLogout}) to include an accessibilityHint
    prop (e.g., "Logs you out of the application") so screen readers convey the
    consequence of the action; ensure the hint string is consistent with your
    i18n/localization approach if applicable.

In @mobile/screens/GroupSettingsScreen.js:

  • Around line 280-285: The IconButton for removing a member is missing an
    accessibilityHint which would clarify the destructive action; update the
    IconButton (the instance rendering icon="account-remove") to add an
    accessibilityHint prop (e.g., using displayName or static text) that explains
    the result like "Removes this member from the group" so screen readers convey
    the action's consequence when invoking onKick(userId, displayName).

Thank you for the detailed feedback! I have implemented the requested changes:

  1. Added accessibilityHint="Logs you out of the application" to the Logout item in mobile/screens/AccountScreen.js.
  2. Added accessibilityHint="Removes this member from the group" to the remove member IconButton in mobile/screens/GroupSettingsScreen.js.

These additions will clarify the consequences of these destructive actions for screen reader users.

Co-authored-by: Devasy <110348311+Devasy@users.noreply.github.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
mobile/screens/GroupSettingsScreen.js (2)

317-329: ⚠️ Potential issue | 🟡 Minor

Add accessibilityState to communicate selection status.

The selected icon is visually indicated by mode="contained" vs "outlined", but screen reader users won't know which icon is currently selected. Add accessibilityState to convey this state.

♿ Proposed fix
               <Button
                 key={i}
                 mode={icon === i ? "contained" : "outlined"}
                 style={styles.iconBtn}
                 onPress={() => setIcon(i)}
                 disabled={!isAdmin}
                 accessibilityLabel={`Select icon ${i}`}
                 accessibilityRole="button"
+                accessibilityState={{ selected: icon === i }}
               >

359-370: 🧹 Nitpick | 🔵 Trivial

Consider adding accessibilityState for busy/disabled feedback.

The button's disabled and loading states should be communicated to assistive technologies. While react-native-paper may handle disabled, explicitly setting accessibilityState ensures screen readers announce the busy state during save operations.

♿ Suggested enhancement
               <Button
                 mode="contained"
                 style={{ marginTop: 12 }}
                 loading={saving}
                 disabled={saving}
                 onPress={onSave}
                 accessibilityLabel="Save Changes"
                 accessibilityRole="button"
+                accessibilityState={{ disabled: saving, busy: saving }}
               >

@Devasy Devasy merged commit ffaa12c into main Jan 31, 2026
13 checks passed
@Devasy Devasy deleted the jules/mobile-accessibility-audit-2448891226254195206 branch January 31, 2026 05:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants