diff --git a/docs/manual-checks.md b/docs/manual-checks.md index 590641b..cec0a58 100644 --- a/docs/manual-checks.md +++ b/docs/manual-checks.md @@ -952,13 +952,15 @@ closed — which is how a foldable would open to a phone layout until somebody t Look at the bottom right of the host list with no host selected. **Pass:** a filled accent circle, 56×56, clear of the bottom edge and of the last row's text. Then press -and hold a host so the connect bar rises. +and hold a host so the action bar rises, and open the ⋯ menu → **Change group**. -**Pass:** the + has moved up with the bar and is not over the CONNECT button. +**Pass:** the + is gone the moment anything is ticked, and stays gone under the picker that panel raises. +It comes back when the cross at the left of the bar is pressed. -**Failure means:** the + was anchored to the screen rather than to the list's row. Nothing in the layout -harness would catch it if it could run — its only fit rule is containment inside the window, never overlap -between two controls, so a button sitting squarely on top of CONNECT reports clean. +**Failure means:** a + still drawn over a selection is `ShowsAddButton` no longer reading `IsChoosingHosts` +— a control that does something, where the something is not what the screen is about. Nothing in the layout +harness would catch it if it could run: its only fit rule is containment inside the window, never overlap +between two controls. ### 8.3 The sheet says what each choice does @@ -1004,7 +1006,7 @@ Add a group with a default SSH key. Add a host with no group and leave AUTHENTIC each time)**. Save. Now edit it and choose the group. **Pass:** the picker gains an **Inherit from group** entry and moves to it. Save, and the host row reads -`key`, and the connect bar shows a note naming the group rather than a password box. +`key`. Tap it: it connects without asking for anything, rather than raising the password sheet. **Failure means:** the picker's "Password (ask each time)" was written as a decision when it was only the absence of one, and this host will never use the fleet's key. @@ -1013,7 +1015,7 @@ absence of one, and this host will never use the fleet's key. On that same host, set AUTHENTICATION back to **Password (ask each time)** and save. -**Pass:** the connect bar shows a password box again, and it survives a lock and unlock. +**Pass:** tapping the row raises the password sheet again, and that survives a lock and unlock. **Failure means:** the fourth state has no storage and the host is inheriting whatever the group says. @@ -1090,60 +1092,101 @@ selection, which this head never sets. That is the exact failure the header-aime With only one writable vault, the entry answers on the status line instead and no panel opens. That is the intended answer, not a failure. -### 8.14 DELETE under a host is not beside EDIT +### 8.14 Remove is at the bottom of the menu, below a rule -Press and hold a host so the connect bar rises. +Press and hold a host so the action bar rises, then open the ⋯. -**Pass:** CONNECT, then EDIT and MOVE side by side, then DELETE full width in the danger colour on a row of -its own beneath them. On a host with nowhere to move to, MOVE is absent and the row is EDIT alone. +**Pass:** Connect, Connect via SFTP, Move to vault, Copy to vault, Change group, Duplicate — then a rule, +then **Remove** in the danger colour. The sheet scrolls if it has to, and Remove is reachable without the +list underneath being tapped by accident. -Press DELETE. +Tick a second host and open the ⋯ again. -**Pass:** the question takes the whole bar — no CONNECT, no EDIT, no second DELETE underneath it — and KEEP -puts them back with the host still there. +**Pass:** Connect and Connect via SFTP are gone. A terminal and a file session are each about one machine, +and there is no reading of "connect to these six". The other five are still there. -**Failure means:** a bar that kept its buttons under the question is one where DELETE can be pressed twice, -the second press landing on whatever the list rebuilt underneath. +Press Remove. +**Pass:** a question above the list naming the count — "Delete these 2 hosts?" — and KEEP puts the list back +with both hosts and both ticks still there. -### 8.15 A tap connects, and a long press is what raises the bar · **the one worth the most care** +**Failure means:** one question per host is `DeletionTarget.ChosenHosts` not being used, and six copies of +"delete prod-db?" is not a confirmation anybody reads. A question that cleared the ticks on KEEP is a +selection thrown away for declining to destroy it. + +### 8.15 A tap connects, and a long press chooses · **the one worth the most care** On a host bound to a key or a stored credential — one that needs nothing typed — tap the row once. **Pass:** it connects, and the terminal takes the screen. **Nothing rises over the list on the way past** — -no password box, no CONNECT, no EDIT/MOVE/DELETE. Come back to HOSTS: still nothing. +no password box, no action bar. Come back to HOSTS: still nothing, and no row is marked. Now press and hold the same row. -**Pass:** the bar comes up, naming that host, with all of it. Press and hold a different row: the bar -follows to that one rather than staying on the first. +**Pass:** the header is replaced by a bar carrying ✕, the count `1`, a pencil and a ⋯, and the row itself is +filled with a tick at its right-hand end. Press and hold a second row: the count reads `2` and the pencil is +gone. + +Tap one of the two. + +**Pass:** it unticks rather than connecting. Tap the other: the count reaches zero, the bar goes and the +vault header comes back. Now tap a host that authenticates with a **typed password**. -**Pass:** it does not dial. The bar rises with the password box in it and the status line says the host asks -for a password. Type it and press CONNECT — or tap the row a second time, which is the same thing — and it -connects. +**Pass:** it does not dial. A sheet rises from the bottom naming that host, with a password box, the +remember tick, CONNECT and CANCEL. Type it and press CONNECT — or dismiss the sheet, type nothing, and tap +the row a second time — and it connects. Dismissing it empties the box. -**Failure means:** a tap that raises the bar is the old behaviour, where choosing a machine put five -controls over the bottom of the list in the way of the one thing a tap on its name means. A tap that dials -a password host with an empty box is worse: the connection fails somewhere the user cannot see why. A long -press that connects means `held` in `HostsScreen.axaml.cs` is not suppressing the `Tapped` that follows a -hold, so one touch fires both gestures. +**Failure means:** a tap that connects while rows are ticked is `IsChoosingHosts` not being read in +`HostsScreen.axaml.cs` — a terminal opened on top of a selection somebody was halfway through building. A +tap on a group *heading* that ticks a host is worse: it means the handler is reading the list's selection +rather than the element under the finger, so a machine nobody pointed at has gone into a set about to be +deleted. A tap that dials a password host with an empty box fails somewhere the user cannot see why. And a +long press that also connects means `held` is not suppressing the `Tapped` that follows a hold. -### 8.16 The pencil in the header edits the chosen host +### 8.16 The pencil in the action bar opens a page, not a card -With a host chosen — by a tap that connected, or by a long press — look at the header beside LOCK. +Tick exactly one host and press the pencil. -**Pass:** a pencil. It opens that host's editor. With nothing chosen there is no pencil at all rather than a -greyed one, and while an editor is open it is gone. +**Pass:** the editor takes the **whole screen** — no search box, no sync line, no shells strip, no bottom +bar — with its own header carrying ←, the title, and a ✓. The ticks are gone: the screen is about one host +now. -Navigate to Settings and back. +Fill in a field and press ← . -**Pass:** the pencil is absent on every screen but HOSTS, including Settings and the keychain. +**Pass:** back on the list with nothing saved, and the boxes cleared for the next time. The system back +gesture does the same thing. -**Failure means:** a pencil visible over another screen is the `IsHostsShowing` wrapper gone — see -`PhoneShell.axaml`, which nests the two conditions because Avalonia's bindings have no "and". A pencil that -stays while the host editor is up is `CanEditSelectedHost` no longer reading `AnEditorIsOpen`. +Tick two hosts. + +**Pass:** no pencil. Editing two machines has no meaning, and the bar collapses the control rather than +greying it. + +**Failure means:** chrome left around the editor is `RefreshChrome` no longer reading the vault's +`IsEditing` — see `PhoneShell.axaml.cs`, which subscribes to the vault as well as the shell precisely so +that it can. A pencil beside a count of two is `HasOneChosenHost` not being read. + +### 8.17 Connect via SFTP crosses to the files screen with the host already chosen + +Tick one host that needs nothing typed and choose **Connect via SFTP** from the ⋯. + +**Pass:** the files screen, with that machine already chosen and connecting — not a picker asking which host +again. The ticks are gone. + +Now do the same with a host that authenticates with a typed password. + +**Pass:** the files screen with the picker open, that host chosen in it, its own password box beside it, and +a line saying the host asks for one. It does not dial with an empty box. + +Open a bucket first, then try the entry again. + +**Pass:** it refuses and says so, and the screen stays on the bucket. There is one file session behind both +destinations, so switching under a live one would show a screen titled S3 listing an SFTP host's files. + +**Failure means:** a picker asking which host is `MainWindowViewModel.OnVaultFilesRequested` failing to find +the row — that screen keeps its own copy of the host list, so it has to be re-found there by entity id +rather than handed the vault's object. --- @@ -1360,14 +1403,14 @@ seriousness here, since this password is typed rather than stored and so is type With at least one keychain host and one machine connected to by hand in the log, open Connections with nothing running. -**Pass:** tapping the keychain one lands on HOSTS with that host selected **and its connect bar up**. -Tapping the hand-typed one puts its address back in the box on this screen and leaves the password box -**empty**. Neither one dials anything on its own. +**Pass:** tapping the keychain one lands on HOSTS with that host **ticked and the action bar up**, ready +for CONNECT out of the ⋯. Tapping the hand-typed one puts its address back in the box on this screen and +leaves the password box **empty**. Neither one dials anything on its own. **Failure means:** if the hand-typed one navigates to HOSTS, the log entry is carrying a host id it should not have. If the password came back, something is storing it — it never was. And if the keychain one arrives -with the host selected but **no bar**, `ConnectToRecent` is setting the selection rather than opening the -pane: since 8.15 a selection alone raises nothing, so that is a screen with nothing to press. +at a list with nothing marked, `ConnectToRecent` is setting the selection rather than going through +`AskAboutHost`: nothing on that list means "selected" any more, so that is a screen with nothing to press. ### 11.9 Settings holds the keychain, and back walks out of it diff --git a/src/DodoSSH.Client.Android/Views/HostActionBar.axaml b/src/DodoSSH.Client.Android/Views/HostActionBar.axaml new file mode 100644 index 0000000..f3ae998 --- /dev/null +++ b/src/DodoSSH.Client.Android/Views/HostActionBar.axaml @@ -0,0 +1,63 @@ + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + +