From cddfeb1f5557a781f1be5d2f5d547651043ff3ba Mon Sep 17 00:00:00 2001 From: Jaap-Jan de Wit | DodoTech Date: Thu, 6 Aug 2026 07:38:31 +0200 Subject: [PATCH 1/3] Keep the phone's nav under Connections when nothing is running MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The chrome stands down for a shell, and it was standing down for the whole terminal surface. Those parted company when that surface gained a connect page: with no tabs open it draws a box, a CONNECT button and the machines connected to before, which is a page in everything but which enum it is in. A third of the display is worth giving to a shell and is not worth giving to that. Worse, it is the one screen somebody arrives at by closing their last tab — so the state the collapsed bar was most likely to be seen in was the state where it left the system back gesture as the only route to Hosts or Settings. So RefreshChrome reads one more question. IsTerminalSurface with no tabs joins the pages in both flags, which keeps the rail and the bar in step: above 600dp the rail is the bar, and fixing only the narrow layout would leave an unfolded device on the same screen with the same nothing. The vault header is deliberately not part of it. The surface draws its own bar with back and the +, and a header above that is the second row of chrome this head exists to avoid. The Connections entry lights for the first time, on IsTerminalSurface. It was left unbound on the argument that the bar was never drawn while that surface was up, so a lit state was unreachable — that argument is now false, and the flag is unambiguous on a control that is only drawn in two situations: false on every page, true on the connect page, and never read while a shell is showing. A bar sitting under a screen it does not point at is the entry looking broken instead. Nothing here is testable on this head — the phone's rectangles have no coverage, for the reasons Phase 8 of manual-checks records — so 11.7 gains the check that the bar is there with Connections lit, and 11.1 keeps the one that it is gone with a shell up, which is the half that pays for the arrangement. --- docs/android-port.md | 13 ++++++-- docs/manual-checks.md | 15 ++++++++-- .../Views/PhoneRail.axaml | 10 ++++--- .../Views/PhoneShell.axaml | 23 +++++++++----- .../Views/PhoneShell.axaml.cs | 30 +++++++++++++++++-- .../Views/TerminalScreen.axaml | 13 +++++--- 6 files changed, 81 insertions(+), 23 deletions(-) diff --git a/docs/android-port.md b/docs/android-port.md index 4ae7fc9..6a137b4 100644 --- a/docs/android-port.md +++ b/docs/android-port.md @@ -568,9 +568,16 @@ go at 360dp: believing they typed an `l`. **The surface has since taken the whole screen.** `PhoneShell` collapses the header, the session strip - and the bottom bar while a terminal is showing — one binding on `IsShowingPages` each — and the screen - draws a 35-pixel bar in their place: back, the session pills, and a `+` raising a sheet with the three - connections there are. That sheet is the head's first control that could be drawn over the renderer, so + and the bottom bar while a shell is showing, and the screen draws a 35-pixel bar in their place: back, + the session pills, and a `+` raising a sheet with the three connections there are. + + *A shell rather than the surface, and the two parted company once that surface gained a connect page.* + With nothing running, Connections is a box, a CONNECT button and the machines connected to before — a + page in everything but which enum it is in — so `RefreshChrome` keeps the bar (and, wide, the rail) under + it and the Connections entry lights for the first time. It is the one screen reachable by closing your + last tab, and collapsing the nav there left the system back gesture as the only route to Hosts or + Settings. The header is not part of that: the surface draws its own bar, and a vault header above it is + the second row of chrome this head exists to avoid. That sheet is the head's first control that could be drawn over the renderer, so it collapses it rather than covering it, exactly as the desktop's palette does; whether Android's WebView actually composites above Avalonia content is still the unverified question recorded below, and collapsing is correct under either answer. diff --git a/docs/manual-checks.md b/docs/manual-checks.md index 590641b..f87331d 100644 --- a/docs/manual-checks.md +++ b/docs/manual-checks.md @@ -1277,12 +1277,13 @@ headless surface has a native view to answer with. `docs/android-port.md` still Open a shell from HOSTS. -**Pass:** the vault header, the session strip and the four-entry bottom bar are all gone. What is left is +**Pass:** the vault header, the session strip and the three-entry bottom bar are all gone. What is left is one bar — a back arrow, the session pills, a `+` — and then the terminal down to the accessory keys. Press back: all three come back, the tab is still in the strip and its dot is still green. -**Failure means:** one of the three rows is not bound on `IsShowingPages`, or the terminal is being reached -by a route that leaves `Surface` on `Page`. +**Failure means:** the strip is not bound on `IsShowingPages`, `RefreshChrome` is not reading `HasTabs`, or +the terminal is being reached by a route that leaves `Surface` on `Page`. A bar still there **with a shell +showing** is the one that matters: that is the third of the screen this arrangement exists to give back. ### 11.2 The connect menu is not drawn over the renderer · **the important one** @@ -1348,6 +1349,14 @@ Close every tab, then press Connections in the bottom bar. keychain has ever connected to anything — a RECENT list underneath. The whole thing scrolls with the keyboard up, and the password box shows dots with **no suggestion strip** above the keyboard. +**And the bottom bar is still there, with Connections lit.** Press Hosts: it goes straight there, without +the back gesture. Then open a shell — the bar goes, which is 11.1. Wide, the same holds for the rail. + +**Failure means:** for the bar, `RefreshChrome` is back to collapsing the nav for the whole terminal +surface rather than for a shell — which strands anybody who reaches this screen by closing their last tab. +For an unlit Connections entry, `IsCurrent` lost its binding: on this screen it is the only true thing the +bar could say about where you are. + Type a machine you can reach and press CONNECT: a tab appears in the bar and the shell opens. Type something malformed — no `user@`, or `:70000` — and the refusal appears under the boxes, in the warning colour, with no tab and nothing dialled. diff --git a/src/DodoSSH.Client.Android/Views/PhoneRail.axaml b/src/DodoSSH.Client.Android/Views/PhoneRail.axaml index 8a5bc13..fc6d7be 100644 --- a/src/DodoSSH.Client.Android/Views/PhoneRail.axaml +++ b/src/DodoSSH.Client.Android/Views/PhoneRail.axaml @@ -134,15 +134,17 @@ -