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
[Due for Payment 2026-04-09][$250] Android - Book Travel - It is not possible to click the “Add Phone Number” tab #85462
Version Number: v.9.3.38-0 Reproducible in staging?: Yes Reproducible in production?: Unable to validate in Prod - Provide reasoning. If this was caught during regression testing, add the test name, ID and link from BrowserStack:#85143 Email or phone of affected tester (no customers): N/A Issue reported by: Applause Internal Team Bug source: Pull Request QA execution Device used: Galaxy A55/ Android 16 App Component: Other
Action Performed:
Prerequisite: You must have a workspace with travel enabled and have already selected the ticket prices.
On the Summary page, fill in the personal information with Alberta Charleson’s details.
Tap the “Save Changes” button.
You will be prompted to enter a phone number.
Expected Result:
You can add the phone number.
Actual Result:
You cannot add the phone number because the button is hidden behind the Android tab.
Please re-state the problem that we are trying to solve in this issue.
On Android (Galaxy A55 / Android 16), when booking travel via Spotnana and being prompted to enter a phone number on the Summary page, the button to add the phone number is hidden behind the Android system navigation bar, making it impossible to tap.
What is the root cause of that problem?
The TravelDotLinkWebview component renders Spotnana's travel booking page inside a React Native WebView. The ScreenWrapper wrapping this WebView explicitly sets includeSafeAreaPaddingBottom={false}, which disables bottom safe area padding.
The app uses a transparent Android navigation bar (android:navigationBarColor=@android:color/transparent in styles.xml), meaning the app renders behind the system nav bar. Without bottom safe area padding, the WebView extends all the way to the bottom edge of the screen, causing the bottom portion of Spotnana's page content (the phone number button) to be obscured by the Android navigation bar.
This is exacerbated by Android 16, which enforces edge-to-edge display by default.
What changes do you think we should make in order to solve the problem?
In src/pages/Travel/TravelDotLinkWebview.tsx, remove the includeSafeAreaPaddingBottom={false} prop from the ScreenWrapper (or change it to includeSafeAreaPaddingBottom). The default value is true, which will apply the appropriate bottom safe area inset, pushing the WebView content above the Android navigation bar.
What alternative solutions did you explore? (Optional)
Migrate to edge-to-edge mode by adding enableEdgeToEdgeBottomSafeAreaPadding to the ScreenWrapper — this is the newer pattern used by some travel pages like WorkspaceConfirmationForTravelPage. However, this is more complex and may not be necessary since the WebView content is not managed by the app's own scrollable components.
Add bottom padding directly to the WebView — this would work but is less idiomatic than using ScreenWrapper's built-in safe area handling.
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.
changed the title [-]Android - Book Travel - It is not possible to click the “Add Phone Number” tab[/-][+][$250] Android - Book Travel - It is not possible to click the “Add Phone Number” tab[/+]on Mar 16, 2026
Please re-state the problem that we are trying to solve in this issue.
On Android, the "Add Phone Number" button in the travel booking flow is hidden behind the system navigation bar. Users can't tap it, so they're stuck and can't complete the booking.
What is the root cause of that problem?
TravelDotLinkWebview.tsx (line 24) sets includeSafeAreaPaddingBottom={false} on its ScreenWrapper. This was there from the component's creation (commit d0f45cb, June 2025) — likely copied from a screen that didn't need bottom padding.
Here's how it breaks: ScreenWrapperContainer (lines 149-162) always renders a bottom spacer View in legacy mode, but when includeSafeAreaPaddingBottom is false, that spacer gets paddingBottom: undefined instead of the device's safe area inset. So the WebView fills the full screen height, extending behind Android's transparent navigation bar (edge-to-edge mode enabled since Nov 2024 in styles.xml:10). Spotnana's bottom content ends up behind the gesture bar.
No tests exist for this component, which is how it shipped.
What changes do you think we should make in order to solve the problem?
Remove includeSafeAreaPaddingBottom={false} from the ScreenWrapper in TravelDotLinkWebview.tsx. The default is true, which gives the bottom spacer its proper paddingBottom via the safe area inset, constraining the WebView above the nav bar.
This is safe across platforms — on iOS, it works with the existing safe area handling. On web, the bottom inset is 0, so nothing changes visually. On devices without a gesture nav bar, the inset is also 0.
What alternative solutions did you explore? (Optional)
I looked at using enableEdgeToEdgeBottomSafeAreaPadding since WorkspaceConfirmationForTravelPage.tsx uses it. But it won't work here — edge-to-edge mode delegates padding to RN scrollable leaf components (ScrollView, SelectionList), and a WebView isn't one of those. Also, without bottomContent provided, the bottom spacer View doesn't render at all in edge-to-edge mode (ScreenWrapperContainer.tsx:149).
Adding padding directly to the WebView style would work but bypasses ScreenWrapper's built-in safe area handling, creating a maintenance burden for no real benefit.
Please re-state the problem that we are trying to solve in this issue.
On Android (tested on Galaxy A55 / Android 16), the "Add Phone Number" button in the Spotnana travel booking flow is hidden behind the Android system navigation bar, preventing users from completing the train booking.
What is the root cause of that problem?
In src/pages/Travel/TravelDotLinkWebview.tsx, the ScreenWrapper component is explicitly configured with includeSafeAreaPaddingBottom={false} (line 24). Since the app uses a transparent Android navigation bar (android:navigationBarColor=@android:color/transparent in android/app/src/main/res/values/styles.xml), the app renders behind the system nav bar. Without bottom safe area padding, the WebView extends to the absolute bottom edge of the screen, causing Spotnana's page content at the bottom (the phone number button) to be occluded by the Android gesture bar / navigation bar. This is made worse by Android 16's enforced edge-to-edge display.
What changes do you think we should make in order to solve the problem?
Remove the includeSafeAreaPaddingBottom={false} prop from the ScreenWrapper in src/pages/Travel/TravelDotLinkWebview.tsx. The default value of includeSafeAreaPaddingBottom is true, which will cause ScreenWrapperContainer to apply the correct bottom safe area inset via its bottom spacer View, pushing the WebView content above the Android navigation bar.
This change is safe cross-platform: on iOS, the existing safe area handling applies the correct inset; on web, the bottom inset is 0, so there is no visual change; on Android devices without a gesture nav bar, the inset is also 0.
What alternative solutions did you explore? (Optional)
Using enableEdgeToEdgeBottomSafeAreaPadding (as seen in WorkspaceConfirmationForTravelPage.tsx) — this delegates padding to RN scrollable leaf components (ScrollView, SelectionList), but a WebView is not one of those components, so the padding would not be applied. Additionally, without bottomContent provided, the bottom spacer View does not render in edge-to-edge mode (ScreenWrapperContainer.tsx:149), so this approach would not work.
Adding paddingBottom directly to the WebView style — this would work but bypasses ScreenWrapper's built-in safe area handling, creating a maintenance burden for no benefit.
📣 @chengyixu! 📣
Hey, it seems we don’t have your contributor details yet! You'll only have to do this once, and this is how we'll hire you on Upwork.
Please follow these steps:
Get the email address used to login to your Expensify account. If you don't already have an Expensify account, create one here. If you have multiple accounts (e.g. one for testing), please use your main account email.
Get the link to your Upwork profile. It's necessary because we only pay via Upwork. You can access it by logging in, and then clicking on your name. It'll look like this. If you don't already have an account, sign up for one here.
Copy the format below and paste it in a comment on this issue. Replace the placeholder text with your actual details.
Format:
Contributor details
Your Expensify account email: <REPLACE EMAIL HERE>
Upwork Profile Link: <REPLACE LINK HERE>
[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.
[BugZero Assignee] Create a GH issue for creating/updating the regression test once above steps have been agreed upon.
Link to issue:
Test:
Open the app on an Android device (ideally Android 16 or a device with gesture navigation)
Navigate to a workspace with travel enabled
Start booking travel and reach the Summary page with Spotnana's webview
Fill in personal information and tap "Save Changes"
When prompted to enter a phone number, verify the button is visible and tappable (not hidden behind the Android navigation bar)
Activity
MelvinBot commentedon Mar 16, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
On Android (Galaxy A55 / Android 16), when booking travel via Spotnana and being prompted to enter a phone number on the Summary page, the button to add the phone number is hidden behind the Android system navigation bar, making it impossible to tap.
What is the root cause of that problem?
The
TravelDotLinkWebviewcomponent renders Spotnana's travel booking page inside a React NativeWebView. TheScreenWrapperwrapping this WebView explicitly setsincludeSafeAreaPaddingBottom={false}, which disables bottom safe area padding.The app uses a transparent Android navigation bar (
android:navigationBarColor=@android:color/transparentinstyles.xml), meaning the app renders behind the system nav bar. Without bottom safe area padding, the WebView extends all the way to the bottom edge of the screen, causing the bottom portion of Spotnana's page content (the phone number button) to be obscured by the Android navigation bar.This is exacerbated by Android 16, which enforces edge-to-edge display by default.
What changes do you think we should make in order to solve the problem?
In
src/pages/Travel/TravelDotLinkWebview.tsx, remove theincludeSafeAreaPaddingBottom={false}prop from theScreenWrapper(or change it toincludeSafeAreaPaddingBottom). The default value istrue, which will apply the appropriate bottom safe area inset, pushing the WebView content above the Android navigation bar.What alternative solutions did you explore? (Optional)
Migrate to edge-to-edge mode by adding
enableEdgeToEdgeBottomSafeAreaPaddingto theScreenWrapper— this is the newer pattern used by some travel pages likeWorkspaceConfirmationForTravelPage. However, this is more complex and may not be necessary since the WebView content is not managed by the app's own scrollable components.Add bottom padding directly to the WebView — this would work but is less idiomatic than using
ScreenWrapper's built-in safe area handling.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 Mar 16, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @FitseTLT (
External)[-]Android - Book Travel - It is not possible to click the “Add Phone Number” tab[/-][+][$250] Android - Book Travel - It is not possible to click the “Add Phone Number” tab[/+]melvin-bot commentedon Mar 16, 2026
Job added to Upwork: https://www.upwork.com/jobs/~022033655130281316756
shivang-goliyan commentedon Mar 16, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
On Android, the "Add Phone Number" button in the travel booking flow is hidden behind the system navigation bar. Users can't tap it, so they're stuck and can't complete the booking.
What is the root cause of that problem?
TravelDotLinkWebview.tsx(line 24) setsincludeSafeAreaPaddingBottom={false}on itsScreenWrapper. This was there from the component's creation (commit d0f45cb, June 2025) — likely copied from a screen that didn't need bottom padding.Here's how it breaks:
ScreenWrapperContainer(lines 149-162) always renders a bottom spacer View in legacy mode, but whenincludeSafeAreaPaddingBottomis false, that spacer getspaddingBottom: undefinedinstead of the device's safe area inset. So the WebView fills the full screen height, extending behind Android's transparent navigation bar (edge-to-edge mode enabled since Nov 2024 instyles.xml:10). Spotnana's bottom content ends up behind the gesture bar.No tests exist for this component, which is how it shipped.
What changes do you think we should make in order to solve the problem?
Remove
includeSafeAreaPaddingBottom={false}from theScreenWrapperinTravelDotLinkWebview.tsx. The default istrue, which gives the bottom spacer its properpaddingBottomvia the safe area inset, constraining the WebView above the nav bar.This is safe across platforms — on iOS, it works with the existing safe area handling. On web, the bottom inset is 0, so nothing changes visually. On devices without a gesture nav bar, the inset is also 0.
What alternative solutions did you explore? (Optional)
I looked at using
enableEdgeToEdgeBottomSafeAreaPaddingsinceWorkspaceConfirmationForTravelPage.tsxuses it. But it won't work here — edge-to-edge mode delegates padding to RN scrollable leaf components (ScrollView, SelectionList), and a WebView isn't one of those. Also, withoutbottomContentprovided, the bottom spacer View doesn't render at all in edge-to-edge mode (ScreenWrapperContainer.tsx:149).Adding padding directly to the WebView style would work but bypasses ScreenWrapper's built-in safe area handling, creating a maintenance burden for no real benefit.
chengyixu commentedon Mar 19, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
On Android (tested on Galaxy A55 / Android 16), the "Add Phone Number" button in the Spotnana travel booking flow is hidden behind the Android system navigation bar, preventing users from completing the train booking.
What is the root cause of that problem?
In
src/pages/Travel/TravelDotLinkWebview.tsx, theScreenWrappercomponent is explicitly configured withincludeSafeAreaPaddingBottom={false}(line 24). Since the app uses a transparent Android navigation bar (android:navigationBarColor=@android:color/transparentinandroid/app/src/main/res/values/styles.xml), the app renders behind the system nav bar. Without bottom safe area padding, the WebView extends to the absolute bottom edge of the screen, causing Spotnana's page content at the bottom (the phone number button) to be occluded by the Android gesture bar / navigation bar. This is made worse by Android 16's enforced edge-to-edge display.What changes do you think we should make in order to solve the problem?
Remove the
includeSafeAreaPaddingBottom={false}prop from theScreenWrapperinsrc/pages/Travel/TravelDotLinkWebview.tsx. The default value ofincludeSafeAreaPaddingBottomistrue, which will causeScreenWrapperContainerto apply the correct bottom safe area inset via its bottom spacer View, pushing the WebView content above the Android navigation bar.This change is safe cross-platform: on iOS, the existing safe area handling applies the correct inset; on web, the bottom inset is 0, so there is no visual change; on Android devices without a gesture nav bar, the inset is also 0.
What alternative solutions did you explore? (Optional)
enableEdgeToEdgeBottomSafeAreaPadding(as seen inWorkspaceConfirmationForTravelPage.tsx) — this delegates padding to RN scrollable leaf components (ScrollView,SelectionList), but a WebView is not one of those components, so the padding would not be applied. Additionally, withoutbottomContentprovided, the bottom spacer View does not render in edge-to-edge mode (ScreenWrapperContainer.tsx:149), so this approach would not work.paddingBottomdirectly to the WebView style — this would work but bypassesScreenWrapper's built-in safe area handling, creating a maintenance burden for no benefit.melvin-bot commentedon Mar 19, 2026
📣 @chengyixu! 📣
Hey, it seems we don’t have your contributor details yet! You'll only have to do this once, and this is how we'll hire you on Upwork.
Please follow these steps:
Format:
chengyixu commentedon Mar 19, 2026
Contributor details
Your Expensify account email: Chengyi_xu@outlook.com
Upwork Profile Link: https://www.upwork.com/freelancers/~01d70946e6b723bb6f
24 remaining items
FitseTLT commentedon Apr 7, 2026
BugZero Checklist:
[Contributor] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to comment: https://github.com/Expensify/App/pull/65176/changes#r3047901398
[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.
[BugZero Assignee] Create a GH issue for creating/updating the regression test once above steps have been agreed upon.
Link to issue:
Test:
Do we agree 👍 or 👎
Zapier Logs
Run ID: 00040eee-d75a-adc0-d6d2-35d97df88204mallenexpensify commentedon Apr 10, 2026
Payment Summary
Contributor+: @FitseTLT paid $250 via Upwork
^ Test case created
Thx
FitseTLT commentedon Apr 10, 2026
@mallenexpensify I get paid on Upwork
mallenexpensify commentedon Apr 10, 2026
@FitseTLT can you please accept the job below? Please reply here and tag me once you have.
https://www.upwork.com/jobs/~022033655130281316756
sorry... again...
FitseTLT commentedon Apr 10, 2026
@mallenexpensify
mallenexpensify commentedon Apr 13, 2026
@FitseTLT paid, summary updated above. Thx.