diff --git a/docs/manual-checks.md b/docs/manual-checks.md
index 19fa0ce..e7f8f60 100644
--- a/docs/manual-checks.md
+++ b/docs/manual-checks.md
@@ -2335,6 +2335,23 @@ Android is not delivering the click as a `contextmenu` event, and the gesture ne
`WebView` instead of a page one. Neither costs this head anything it has today: a phone without a pointer
has no right button to miss.
+### 11.14 Connections with nothing open asks what to connect to
+
+Close every shell, then press **Connections**. Type part of a saved host's name into the `connect to:` line.
+
+**Pass:** the matching hosts appear under the line as buttons a thumb can hit; tapping one asks for that
+host's password on a line of its own under ssh's wording — or connects at once, for a host with a key or a
+saved password. Then type `user@host` for a machine that is not saved and press CONNECT: the password line
+appears with the keyboard already on it, and BACK — or the system back gesture — steps off it onto the
+address rather than leaving the screen. A tap on a RECENT row lands on the prompt and asks whatever it needs
+to before anything is dialled. Nothing new appears on HOSTS or in the keychain afterwards.
+
+**Failure means:** a password line that appears with the keyboard still on the first line is the posted focus
+in `ConnectPrompt.axaml.cs` arriving before the box has bounds. Back that leaves Connections from the password
+line is `PhoneShell.OnBackRequested`'s prompt step having been reordered below the surface check. The
+decisions themselves — which name matches, what is refused, what is saved — are `ShellFlowTests`' prompt
+cases, shared with the desktop; this is the rectangles and the keyboard.
+
---
## Phase 12 — Shared vaults: the operations that span two accounts
diff --git a/src/DodoSSH.Client.Android/Theme/Phone.axaml b/src/DodoSSH.Client.Android/Theme/Phone.axaml
index c6b42b7..37d7f8d 100644
--- a/src/DodoSSH.Client.Android/Theme/Phone.axaml
+++ b/src/DodoSSH.Client.Android/Theme/Phone.axaml
@@ -843,6 +843,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/DodoSSH.Client.Android/Views/ConnectPrompt.axaml.cs b/src/DodoSSH.Client.Android/Views/ConnectPrompt.axaml.cs
new file mode 100644
index 0000000..ce01e6e
--- /dev/null
+++ b/src/DodoSSH.Client.Android/Views/ConnectPrompt.axaml.cs
@@ -0,0 +1,45 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Markup.Xaml;
+using Avalonia.Threading;
+
+namespace DodoSSH.Client.Android.Views;
+
+/// The phone's empty-terminal prompt: what to connect to, and its password when one is needed.
+///
+///
+/// The one thing the code-behind does is move the keyboard onto the password line when it appears. Enter on a
+/// name is answered with a second question, and a keyboard left on the first line — read-only by then — would
+/// type nothing and look as though it should.
+///
+///
+/// It does not take the keyboard when the screen opens, unlike the desktop's prompt. On a phone that would
+/// raise the software keyboard over the recent connections underneath, which are the likelier tap.
+///
+///
+/// FindControl rather than the generated x:Name fields, for the reason
+/// HostsScreen's constructor gives: no view on this head calls InitializeComponent, so those
+/// fields are null at run time.
+///
+///
+internal sealed partial class ConnectPrompt : UserControl
+{
+ public ConnectPrompt()
+ {
+ AvaloniaXamlLoader.Load(this);
+
+ var line = this.FindControl("PasswordLine")!;
+ var box = this.FindControl("Password")!;
+
+ line.PropertyChanged += (_, e) =>
+ {
+ if (e.Property == IsVisibleProperty && line.IsVisible)
+ {
+ // Posted at Loaded, as HostsScreen's own password sheet is: the box has no bounds on the turn
+ // its line becomes visible, and focusing a control with none raises no keyboard.
+ Dispatcher.UIThread.Post(() => box.Focus(NavigationMethod.Tab), DispatcherPriority.Loaded);
+ }
+ };
+ }
+}
diff --git a/src/DodoSSH.Client.Android/Views/PhoneShell.axaml.cs b/src/DodoSSH.Client.Android/Views/PhoneShell.axaml.cs
index 2498b61..43fd72b 100644
--- a/src/DodoSSH.Client.Android/Views/PhoneShell.axaml.cs
+++ b/src/DodoSSH.Client.Android/Views/PhoneShell.axaml.cs
@@ -674,6 +674,16 @@ internal sealed partial class PhoneShell : UserControl
return;
}
+ // The Connections prompt's password line, which back steps off onto the name it asked about — the
+ // same thing its BACK button does, and the nearer of the two things back could mean here. Leaving the
+ // surface would throw the name away along with the question.
+ if (current is { IsConnectPromptShowing: true, IsPromptAskingForPassword: true })
+ {
+ current.CancelPromptCommand.Execute(null);
+ e.Handled = true;
+ return;
+ }
+
if (!current.IsShowingPages)
{
current.ShowScreenCommand.Execute(current.Screen);
diff --git a/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml b/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml
index 2f8f909..b264c6b 100644
--- a/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml
+++ b/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml
@@ -345,9 +345,11 @@
running this surface is where a connection is made rather than a page apologising for having
nothing on it. Two things are offered, in the order somebody reaches for them.
- A box, because the case this application had no answer for is the address somebody has just been
- given. Everything else here starts from a keychain item, which is right for a machine used twice and
- is several screens of work for one used once.
+ A prompt, because a terminal with nothing in it should do what a terminal does, which is ask — the
+ same one the desktop draws in its empty terminal, over the same view-model state. It takes a saved
+ host's name or user@host for a machine that is not saved, and asks for a password only when one is
+ needed. See ConnectPrompt.axaml. It replaced a box that took addresses alone, which left a saved
+ machine several screens away from here.
And the machines already connected to, under it, because that is the commoner half by far: the
thing most likely to be wanted is the thing that was wanted yesterday. They come out of the vault's
@@ -359,44 +361,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -410,14 +375,13 @@