Skip to content

[Due for payment 2026-09-02] Android - Attachment - Broken image thumbnail is shown when uploading attachment #99490

Closed

Description

@applause-bot

If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.


Version Number: 9.4.61-0
Reproducible in staging?: Yes
Reproducible in production?: No
If this was caught during regression testing, add the test name, ID and link from BrowserStack: https://test-management.browserstack.com/projects/2219752/test-runs/70876008/folder/13176710/41236935/1696743014?q=attachment&issue_type=jira&sort=-identifier
Email or phone of affected tester (no customers): sdsiodjnosdjiodsj@gmail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Samsung Galaxy S25 FE / Android 16
App Component: Chat Report View

Action Performed:

  1. Launch Expensify app.
  2. Open any chat.
  3. Send an image to the chat.

Expected Result:

Image thumbnail will load instantly when uploading attachment.

Actual Result:

Broken image thumbnail is shown when uploading attachment.

Workaround:

Unknown

Platforms:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome Safari

Screenshots/Videos

Bug7242788_1787695579017.Screen_Recording_20260826_060343_Expensify.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Mita Rachim
Bug ID: 7242788

Issue OwnerCurrent Issue Owner: @mallenexpensify

Activity

  1. added
    DeployBlockerCashThis issue or pull request should block deployment
    BugSomething is broken. Auto assigns a BugZero manager.
    on Aug 25, 2026
  2. applause-bot commented on Aug 25, 2026

    @applause-bot
    Author

    While Applause doesn't embed attachments for this bug, here are the links for quick view:
    https://platform.applause.com/services/links/v1/external/cac61e637136611ec75a0ec9cd40e82cd36c9137740b799e8e142b8d69c6405d

  3. github-actions commented on Aug 25, 2026

    @github-actions
    Contributor

    👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:

    1. Identify the pull request that introduced this issue and revert it.
    2. Find someone who can quickly fix the issue.
    3. Fix the issue yourself.
  4. melvin-bot commented on Aug 25, 2026

    @melvin-bot

    Triggered auto assignment to @Gonals (DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.

  5. melvin-bot commented on Aug 25, 2026

    @melvin-bot

    💬 A slack conversation has been started in #expensify-open-source

  6. MelvinBot commented on Aug 25, 2026

    @MelvinBot
    Contributor

    🔍 Investigation Summary

    Classification: App deploy blocker (Android) — no Expensify/App PR identified as the cause; symptoms point to the native app layer
    Causing PR: None identified in Expensify/App (Low confidence in any App-side PR)
    Related Issues: None

    Recommendation: NEEDS INVESTIGATION

    Every attachment-flow change in the 9.4.61 release was reviewed and none affect the plain-image chat-upload rendering path; the Android-only broken local thumbnail points at the native app layer, which needs a separate internal investigation.

    Assigned: No PR-author assignment — no App-repo PR reached medium confidence as the cause.
    Labels: No change. Keeping DeployBlockerCash (Android App deploy is genuinely blocked; bug is staging-only / not reproducible in production, so removal is not warranted). No web DeployBlocker label is present, which is correct.

    📋 Detailed Analysis

    What the bug is

    Sending a plain image to any chat on Android shows a broken thumbnail while the attachment uploads. Android App only; not reproducible in production; reproducible on staging 9.4.61-0. A plain chat image has no transaction, so it renders through the generic image path (AttachmentView image branch / Image), not any receipt/eReceipt path.

    App-repo PRs reviewed and ruled out

    The only 9.4.61 PRs that touch the attachment/upload surface do not alter the plain-image rendering path:

    • [Home Page] Add Concierge prompt box to home For You section #98336 (Concierge prompt box) — touches AttachmentModalBaseContent, ReportAddAttachmentModalContent, AttachmentPickerWithMenuItems, FileUtils.normalizeFileObject.
      • AttachmentModalBaseContent: the new behavior is gated behind confirmLeavesScreen, which only the new Concierge picker sets. The chat flow uses the default (false) → identical onClose() + requestAnimationFrame(confirm) behavior as before.
      • ReportAddAttachmentModalContent: reads confirmLeavesScreen from context; undefined for the chat flow → unchanged.
      • AttachmentPickerWithMenuItems: pure style refactor of the "+" button column (composerButtonColumn/composerButtonStack); no image involved.
      • normalizeFileObject: inert local-variable rename (isNativePlatform → isNative); no behavior change.
    • AttachmentView/index.tsx (distance eReceipt commits + a revert) — every added/removed branch is gated behind isDistanceRequest(transaction). Plain chat images have no transaction, so these branches are skipped.
    • fix: cut out text on android #99069 (react-native Android patch) — patches TextLayoutManager text-width measurement on Android 15+ only; affects text wrapping, not image rendering.
    • Onyx changes ([Onyx bump] Bump react-native-onyx from 3.0.98 to 3.0.100 #99301 bump, Perf: stop returning Sets and Maps from useOnyx collection selectors #99310 selector changes) — would affect all platforms; this bug is Android-only, so a cross-platform data change is an unlikely fit.

    Why this looks native, not App

    The regression is (a) Android-App-only and (b) a failure to render a local image URI during upload — a platform-specific rendering concern. No App-repo change in this release touches that path. This release also advanced the native submodule, and a native-layer change is the most consistent explanation. That code is internal, so a separate internal investigation is needed to confirm the root cause and the fix location (revert vs. forward-fix on the native side).

    Verification performed

    • Enumerated all 32 App PRs + submodule bumps in deploy checklist Deploy Checklist: New Expensify 2026-08-25 #99466.
    • Diffed the full production...staging compare and grepped for image/attachment/composer/onyx/report rendering paths.
    • Read normalizeFileObject at the merge commit to confirm the rename is inert.
    • Confirmed the AttachmentView and AttachmentModalBaseContent changes do not affect the plain-image (no-transaction) chat path.

    view run

  7. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Aug 26, 2026
  8. melvin-bot commented on Aug 26, 2026

    @melvin-bot

    Triggered auto assignment to Contributor-plus team member for initial proposal review - @linhvovan29546 (External)

  9. melvin-bot commented on Aug 26, 2026

    @melvin-bot

    Unable to auto-create job on Upwork. The BZ team member should create it manually for this issue.

  10. 28 remaining items

  11. linhvovan29546 commented on Aug 31, 2026

    @linhvovan29546
    Contributor

    Contributor+ Checklist:

    • [Contributor] The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.

      Link to the comment on the PR: https://github.com/Expensify/App/pull/96531/changes#r3892778000

    • [Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.

      Link to discussion:

    • [Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.

    Regression Test Proposal

    Test:

    • Launch the Expensify app (Android / iOS native).
    • Open any chat.
    • Send an image to the chat.
    • Verify the image renders the actual image (not a broken-image placeholder/icon) while the attachment is uploading.
    • Verify the image continues to display correctly after the upload completes.

    Do we agree 👍 or 👎

  12. added
    Awaiting PaymentAuto-added when associated PR is deployed to production
    and removed on Aug 31, 2026
  13. melvin-bot commented on Sep 1, 2026

    @melvin-bot

    Triggered auto assignment to @mallenexpensify (Awaiting Payment)

  14. melvin-bot commented on Sep 1, 2026

    @melvin-bot

    Payment Summary

    Resolving PRs:

    BugZero Checklist (@mallenexpensify)

    • I have confirmed assignees, roles, and Upwork contracts look correct
    • I have paid out Upwork contracts / manual NewDot requests
    • [BugZero Assignee] I have created a GH issue for creating/updating the regression test once above steps have been agreed upon
  15. mallenexpensify commented on Sep 3, 2026

    @mallenexpensify
    Contributor

    @linhvovan29546 from the C+ doc

    If there are posts on the PR or issue that reference a regression or deploy blocker, C+ posts on the issue and confirms regression (which will reduce pay by 50%) or provides reasoning why they shouldn’t be considered. If the C+ doesn’t update the issue, the contributor manager making the payment will assume any mention of a regression or deploy blockers reduces the issue amount.

  16. linhvovan29546 commented on Sep 4, 2026

    @linhvovan29546
    Contributor

    @mallenexpensify I’m not sure I understand what you mean, so let me summarize again: this PR fixes the regression introduced by PR #96531 (And I’m not C+ on this PR either). This PR does not introduce any new regressions.

  17. mallenexpensify commented on Sep 4, 2026

    @mallenexpensify
    Contributor

    Payment Summary

    Contributor+: @linhvovan29546 due $250 via NewDot

    Thanks for context @linhvovan29546 . I noticed `Deploy Blocker' mentioned here and also that it came from a regression. With paying so many issues it can take time to dig around to get details, it's helpful to have them on the issue I'm paying.

  18. twisterdotcom commented on Sep 5, 2026

    @twisterdotcom
    Contributor

    $250 approved for @linhvovan29546 in Report ID: R00K5qdjoZdN.

    Zapier Logs Run ID: 00040eee-6e20-ab5d-8bb1-e87d78e8bf54

    SO: https://stackoverflowteams.com/c/expensify/questions/7582

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionBugSomething is broken. Auto assigns a BugZero manager.DailyKSv2EngineeringExternalAdded to denote the issue can be worked on by a contributor

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions