Skip to content

Android - Expensify Card - Card name cannot be removed in landscape mode #87403

Closed

Description

@nlemma

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!


Version Number: 9.3.54-2
Reproducible in staging?: Yes
Reproducible in production?: N/A - new feature, doesn't exist in prod
If this was caught during regression testing, add the test name, ID and link from BrowserStack: #85229
Email or phone of affected tester (no customers): applausetester+khcategory20@applause.expensifail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Samsung Galaxy S25 FE / Android 16
App Component: Workspace Settings

Action Performed:

Precondition:

  • Workspace is set up with Expensify Card.
  • User has assigned themselves a virtual card.
  1. Launch Expensify app in landscape mode.
  2. Go to workspace settings > Expensify Card.
  3. Tap Issue card.
  4. Proceed to "Give it a name" step.
  5. Enter card name.
  6. Try to remove card name.
  7. Dismiss the keyboard.

Expected Result:

Card name can be removed in landscape mode.

Actual Result:

Card name cannot be removed in landscape mode.

Workaround:

Unknown

Platforms:

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

Screenshots/Videos

Bug7125005_1775664497331.Screen_Recording_20260409_000347_Expensify__1_.mp4

View all open jobs on GitHub

Issue OwnerCurrent Issue Owner: @GCyganek

Activity

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

    @melvin-bot

    @mjasikowski recently merged #85229, but they are OOO right now, so I'll auto-assign someone else.

  3. github-actions commented on Apr 8, 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 Apr 8, 2026

    @melvin-bot

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

  5. melvin-bot commented on Apr 8, 2026

    @melvin-bot

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

  6. OSBotify commented on Apr 8, 2026

    @OSBotify
    Contributor

    Investigation Summary - Classification: Frontend bug - Causing PR: #85229 Unlock landscape mode by @GCyganek High confidence - Recommendation: REVERT - PR 85229 introduced getLandscapeTextInputRefProxy which wraps text input refs in a Proxy silencing ALL focus calls in landscape mode. While intended to block auto-focus, it also blocks user-initiated clearing of a text field. The card name input in CardNameStep.tsx uses useAutoFocusInput and in landscape mode its ref gets wrapped by this proxy, making the field unable to be cleared. Reverting PR 85229 would restore correct behavior. - Assigned: @GCyganek PR author, @mjasikowski @rushatgabhane @truph01 approving reviewers - Labels: DeployBlockerCash kept - Evidence: Reproducible only on staging not production confirming a recent PR introduced this. melvin-bot linked PR 85229 to this issue directly. PR 85229 is the only staging PR modifying landscape-mode text input behavior. Bug is specific to landscape mode on Android which is exactly what PR 85229 unlocked. - Verification: New file src/libs/getLandscapeTextInputRefProxy.ts introduced by PR 85229. Modified src/components/TextInput/BaseTextInput/implementation/index.native.tsx. Affected screen src/pages/workspace/expensifyCard/issueNew/CardNameStep.tsx. - Root Cause: getLandscapeTextInputRefProxy returns a Proxy replacing the focus property with a no-op for all landscape mode calls. This blanket suppression blocks not just auto-focus on mount but also any programmatic focus during user interaction like clearing text, rendering the card name field unable to be cleared in landscape mode.

  7. 6 remaining items

  8. MelvinBot commented on Apr 8, 2026

    @MelvinBot
    Contributor

    Proposal

    What is the root cause of that problem?

    When in landscape mode on Android, disableFullscreenUI={isInLandscapeMode} is set on the native TextInput at BaseTextInput/implementation/index.native.tsx:435. This was introduced by PR #85229 ("Unlock landscape mode").

    Android normally switches to "extract mode" (a fullscreen text editor) in landscape to give the keyboard more room. Setting disableFullscreenUI={true} forces inline editing instead. However, Android's IME (Input Method Editor) has known issues in this inline landscape mode — backspace/delete key events may not propagate correctly to React Native's JS layer, so onChangeText never fires with the shorter string. Since the input value is controlled via FormProvider (FormProvider.tsx:424), the displayed text never updates because the deletion event never reaches state.

    What changes do you think we should make in order to solve the problem?

    Remove or conditionally apply disableFullscreenUI so it is not set to true on Android in landscape. One approach:

    • At index.native.tsx:435, change disableFullscreenUI={isInLandscapeMode} to only apply on iOS (where extract mode behaves differently), or remove it entirely if extract mode on Android is acceptable UX.
    • If extract mode on Android is undesirable, an alternative is to keep disableFullscreenUI={true} but add an onKeyPress handler that detects backspace events and manually triggers text deletion when onChangeText doesn't fire, working around the Android IME bug.

    What alternative solutions did you explore? (Optional)

    • getLandscapeTextInputRefProxy (getLandscapeTextInputRefProxy.ts:14-21) was investigated but ruled out — it only intercepts focus() calls and transparently passes through all other operations including clear() and setNativeProps.
    • autoFocus suppression (index.native.tsx:391) is secondary — it prevents auto-focus in landscape but doesn't affect text deletion.
    Investigation details

    Evidence chain:

    1. BaseTextInput sets disableFullscreenUI={isInLandscapeMode} at line 435
    2. In landscape on Android, this disables extract mode, forcing inline editing
    3. Android IME in inline landscape mode has known issues with backspace event propagation
    4. The card name input in CardNameStep.tsx:108-118 uses a standard TextInput wrapped in FormProvider
    5. FormProvider controls the value via value={inputValues[inputID]} — if onChangeText never fires for the deletion, state doesn't update and the text remains

    Related landscape issues:

    Scope note: This bug likely affects ALL text inputs on Android in landscape mode, not just the card name field. Any controlled TextInput using BaseTextInput will have the same disableFullscreenUI behavior.


    Next Steps for Contributor+ team: Reply with @MelvinBot implement this to create a draft PR, @MelvinBot <your feedback> to refine this analysis, or explain why you are rejecting Melvin's proposal.

  9. removed their assignment
    on Apr 13, 2026
  10. melvin-bot commented on Apr 16, 2026

    @melvin-bot

    @GCyganek Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!

  11. melvin-bot commented on May 11, 2026

    @melvin-bot

    This issue has not been updated in over 15 days. @mjasikowski, @Julesssss, @GCyganek, @truph01 eroding to Monthly issue.

    P.S. Is everyone reading this sure this is really a near-term priority? Be brave: if you disagree, go ahead and close it out. If someone disagrees, they'll reopen it, and if they don't: one less thing to do!

  12. GCyganek commented on May 13, 2026

    @GCyganek
    Contributor

    pr in prod

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

Metadata

Metadata

Labels

BugSomething is broken. Auto assigns a BugZero manager.EngineeringMonthlyKSv2ReviewingHas a PR in review

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions