[No QA] Skip loading unread indicator updater on Android#94428
Conversation
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@ZhenjaHorbach Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
Reviewer Checklist
Screenshots/VideosAndroid: HybridApp2026-06-24.13.31.54.movAndroid: mWeb Chrome2026-06-24.13.17.53.moviOS: HybridApp2026-06-24.13.16.51.moviOS: mWeb Safari2026-06-24.13.17.53.movMacOS: Chrome / Safari2026-06-24.13.14.43.mov |
The merge-base changed after approval.
The merge-base changed after approval.
The merge-base changed after approval.
The merge-base changed after approval.
The merge-base changed after approval.
@TMisiukiewicz |
|
Lets burn this PR and create a new one |
|
I think it's okay |
|
@mountiny |
|
🚧 mountiny has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/mountiny in version: 9.4.19-1 🚀
Bundle Size Analysis (Sentry): |
|
🤖 No help site changes required. This PR is an internal performance optimization with no user-facing behavior change:
Expensify's help site ( No draft PR was created. |

Explanation of Change
updateUnreadis a no-op on Android. Despite this,getUnreadReportsForUnreadIndicatorwas walking every report on each Onyx report/report-action/NVP/draft update, only to discard the result.This PR stops loading the updater on Android entirely using the existing platform-file-extension convention already used in that folder:
src/libs/UnreadIndicatorUpdater/load.ts(default — web/iOS): dynamicallyimport('.')to register the Onyx subscriptions as before.src/libs/UnreadIndicatorUpdater/load.android.ts: no-op, so Metro excludes the updater module and its 5 Onyx subscriptions from the Android bundle.src/SplashScreenStateContext.tsxnow callsloadUnreadIndicatorUpdater()instead of inliningimport('./libs/UnreadIndicatorUpdater').Net effect: Android does zero report-walking for a result it never used. Web (tab title) and iOS (app icon badge) behavior is unchanged.
Fixed Issues
$ #94448
PROPOSAL:
Tests
Web:
iOS
src/libs/UnreadIndicatorUpdater/index.ts:just before
updateUnread(unreadReports.length)insidetriggerUnreadUpdate:Android
Offline tests
N/A
QA Steps
Web:
iOS
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari