You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Android - Expensify Card - Card name cannot be removed in landscape mode #87403
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
👋 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:
Identify the pull request that introduced this issue and revert it.
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.
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:
BaseTextInput sets disableFullscreenUI={isInLandscapeMode} at line 435
In landscape on Android, this disables extract mode, forcing inline editing
Android IME in inline landscape mode has known issues with backspace event propagation
The card name input in CardNameStep.tsx:108-118 uses a standard TextInput wrapped in FormProvider
FormProvider controls the value via value={inputValues[inputID]} — if onChangeText never fires for the deletion, state doesn't update and the text remains
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.
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!
Activity
melvin-bot commentedon Apr 8, 2026
@mjasikowski recently merged #85229, but they are OOO right now, so I'll auto-assign someone else.
github-actions commentedon Apr 8, 2026
👋 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:
melvin-bot commentedon Apr 8, 2026
Triggered auto assignment to @Julesssss (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.melvin-bot commentedon Apr 8, 2026
💬 A slack conversation has been started in #expensify-open-source
OSBotify commentedon Apr 8, 2026
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.
6 remaining items
MelvinBot commentedon Apr 8, 2026
Proposal
What is the root cause of that problem?
When in landscape mode on Android,
disableFullscreenUI={isInLandscapeMode}is set on the nativeTextInputatBaseTextInput/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, soonChangeTextnever fires with the shorter string. Since the input value is controlled viaFormProvider(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
disableFullscreenUIso it is not set totrueon Android in landscape. One approach:index.native.tsx:435, changedisableFullscreenUI={isInLandscapeMode}to only apply on iOS (where extract mode behaves differently), or remove it entirely if extract mode on Android is acceptable UX.disableFullscreenUI={true}but add anonKeyPresshandler that detects backspace events and manually triggers text deletion whenonChangeTextdoesn'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 interceptsfocus()calls and transparently passes through all other operations includingclear()andsetNativeProps.autoFocussuppression (index.native.tsx:391) is secondary — it prevents auto-focus in landscape but doesn't affect text deletion.Investigation details
Evidence chain:
BaseTextInputsetsdisableFullscreenUI={isInLandscapeMode}at line 435CardNameStep.tsx:108-118uses a standardTextInputwrapped inFormProviderFormProvidercontrols the value viavalue={inputValues[inputID]}— ifonChangeTextnever fires for the deletion, state doesn't update and the text remainsRelated landscape issues:
Scope note: This bug likely affects ALL text inputs on Android in landscape mode, not just the card name field. Any controlled
TextInputusingBaseTextInputwill have the samedisableFullscreenUIbehavior.Next Steps for Contributor+ team: Reply with
@MelvinBot implement thisto create a draft PR,@MelvinBot <your feedback>to refine this analysis, or explain why you are rejecting Melvin's proposal.melvin-bot commentedon Apr 16, 2026
@GCyganek Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!
melvin-bot commentedon May 11, 2026
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!
GCyganek commentedon May 13, 2026
pr in prod