feat(call): full-screen call when a phone is turned sideways (#126) #451

Merged
jared merged 1 commits from feat/landscape-call into lotus 2026-10-24 23:13:17 -04:00
Owner

Fixes #126. Owner decisions 2026-10-25: tap to show controls, auto-hide, and hide the Android browser's address bar on the first tap.

When: the phone is landscape, at most 500px tall, with touch input; the user has joined this room's call; and the chat is closed. A sideways phone is about 840px wide, which is this app's "Tablet" size class, so the trigger uses the screen's shape rather than the size class. Tablets and desktops never match.

What it does

  • Full screen: the call takes the whole screen. The room header, sidebar and call-status bar are hidden, and notch safe areas are respected.
  • Controls: taps inside the call frame never reach the app, so while the controls are hidden a transparent layer covers the call.
    • The first tap shows the call bar plus Chat and Exit full screen. The tap is otherwise swallowed, as in native video apps.
    • They hide again after 4 s without a touch.
    • While they're up the layer is gone, so the call underneath stays usable.
  • Android browser tabs: the first tap also enters the browser's own full screen, hiding the address bar. It's left again on rotating back, hanging up or exiting. No effect on iPhone or the installed app.
  • Exit full screen lasts until the phone is upright again.
  • Backdrop: the frame is transparent (room wallpaper), so in full screen it gets an opaque base colour under the wallpaper. Without it, the sidebar and call bar showed through.

How: Room decides (shouldGoImmersive) and sets immersiveCallAtom. CallView renders a transparent fixed layer whose placeholder the call frame follows (via the existing placement sync), with ImmersiveCallOverlay on top. CallStatusRenderer and the frame background read the atom.

Tested in Chromium emulating an Android phone (844×390 landscape, touch, mobile), with a real local call:

Step Result
Landscape frame 0,0 844×390 (full screen), tap layer present, status bar hidden
Tap call bar + Chat + Exit full screen; browser full screen on
~4 s later controls hidden, tap layer back
Exit full screen normal layout
Portrait and back to landscape full screen again

Also 2 new unit tests for the trigger and the browser-full-screen rule. All 1,433 unit tests pass; lint is at 29.

⚠️ As the issue says, this still wants a check on real phones (iOS Safari PWA and Android Chrome). Emulation can't show notch insets or real rotation behaviour.

🤖 Generated with Claude Code

https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5

Fixes #126. Owner decisions 2026-10-25: **tap to show controls, auto-hide**, and **hide the Android browser's address bar on the first tap**. **When:** the phone is landscape, at most 500px tall, with touch input; the user has **joined this room's call**; and the chat is closed. A sideways phone is about 840px wide, which is this app's "Tablet" size class, so the trigger uses the screen's shape rather than the size class. Tablets and desktops never match. **What it does** - **Full screen:** the call takes the whole screen. The room header, sidebar and call-status bar are hidden, and notch safe areas are respected. - **Controls:** taps inside the call frame never reach the app, so while the controls are hidden a transparent layer covers the call. - The **first tap** shows the call bar plus **Chat** and **Exit full screen**. The tap is otherwise swallowed, as in native video apps. - They hide again after **4 s** without a touch. - While they're up the layer is gone, so the call underneath stays usable. - **Android browser tabs:** the first tap also enters the browser's own full screen, hiding the address bar. It's left again on rotating back, hanging up or exiting. No effect on iPhone or the installed app. - **Exit full screen** lasts until the phone is upright again. - **Backdrop:** the frame is transparent (room wallpaper), so in full screen it gets an opaque base colour under the wallpaper. Without it, the sidebar and call bar showed through. **How:** `Room` decides (`shouldGoImmersive`) and sets `immersiveCallAtom`. `CallView` renders a transparent fixed layer whose placeholder the call frame follows (via the existing placement sync), with `ImmersiveCallOverlay` on top. `CallStatusRenderer` and the frame background read the atom. **Tested** in Chromium emulating an Android phone (844×390 landscape, touch, mobile), with a real local call: | Step | Result | |---|---| | Landscape | frame 0,0 844×390 (full screen), tap layer present, status bar hidden | | Tap | call bar + Chat + Exit full screen; browser full screen on | | ~4 s later | controls hidden, tap layer back | | Exit full screen | normal layout | | Portrait and back to landscape | full screen again | Also 2 new unit tests for the trigger and the browser-full-screen rule. All 1,433 unit tests pass; lint is at 29. ⚠️ As the issue says, this still wants a check on real phones (iOS Safari PWA and Android Chrome). Emulation can't show notch insets or real rotation behaviour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared added 1 commit 2026-10-24 22:50:38 -04:00
feat(call): full-screen call when a phone is turned sideways (#126)
CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Build & Quality Checks (pull_request) Successful in 3m31s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 11s
CI / Playwright smoke (e2e) (pull_request) Successful in 18m48s
6e6213a43b
Landscape, at most 500px tall, touch input (a sideways phone is ~840px
wide, the Tablet size class, so the trigger is the screen shape), in this
room's joined call, chat closed: the call takes the whole screen. No room
header, sidebar or call-status bar; safe-area insets respected.

- Taps inside the call frame never reach the app, so while the controls
  are hidden a transparent layer covers the call: the first tap shows the
  call bar plus Chat / Exit full screen, which hide again after 4 s
  without a touch; with them up the call underneath stays usable.
- In an Android browser tab the first tap also enters the browser's own
  full screen (hides the address bar); left again on rotate back, hang
  up or exit. No effect on iPhone or the installed app.
- Exit full screen lasts until the phone is upright again.
- The frame is transparent (room wallpaper), so in full screen it gets an
  opaque base colour under the wallpaper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared scheduled this pull request to auto merge when all checks succeed 2026-10-24 22:50:47 -04:00
jared merged commit 02c852e194 into lotus 2026-10-24 23:13:17 -04:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#451