Public Access
Start port forwards on the phone, listed in a sheet off its terminal
The Android head skipped a host's forwards because it had nowhere to show what was listening. Its terminal bar now draws a ⇄ for a tab that has forwards, carrying the listening count in green and turning the danger colour when one failed, and it raises a sheet over the same rows the desktop sidebar lists: notation, route, state, failure reason and a tap to switch each off or on. MainWindowViewModel.StartForwards no longer returns early on Android. The sheet is shell state like the connect sheet: it collapses the renderer while up, is lowered by leaving the terminal, and the back gesture closes it first. Forwards ride the shell's keep-alive rather than holding the foreground service themselves, since a forward cannot outlive its shell. They only change the notification, which now counts ports forwarded beside shells connected, fed by a new ForwardsChanged event and ListeningForwardCount. The phone still has no editor for forwards; the More screen card, README and design-import-gaps now say they run here and are edited on the desktop.
This commit is contained in:
1 parent
f05deb4fbc
commit
c3dfa42108
13 files changed
+415
-56
No files matched your search
@@ -141,6 +141,11 @@ internal sealed class SessionForegroundService : Service
|
||||
/// <param name="liveSessions">Shells with a live channel behind them.</param>
|
||||
/// <param name="activeTransfers">Transfers still moving bytes.</param>
|
||||
/// <param name="holdsFileSession">Whether the Files screen holds a live, idle SFTP connection.</param>
|
||||
/// <param name="listeningForwards">
|
||||
/// Port forwards listening over those shells. Named in the summary and nothing else: a forward rides a
|
||||
/// shell's connection, so it cannot be the reason the process has to stay up — see
|
||||
/// <see cref="SessionKeepAlive"/>.
|
||||
/// </param>
|
||||
/// <remarks>
|
||||
/// Three outcomes, not the two a plain start-or-stop would have. Nothing live stops the service, as
|
||||
/// always. Something live and the service not yet running starts it. Something live and the service
|
||||
@@ -152,7 +157,7 @@ internal sealed class SessionForegroundService : Service
|
||||
/// which needs no foreground-start permission at all. A foregrounded refresh still prefers a real
|
||||
/// start even over a service that looks like it is running; the inline remark below is why.
|
||||
/// </remarks>
|
||||
public static void Reconcile(int liveSessions, int activeTransfers, bool holdsFileSession)
|
||||
public static void Reconcile(int liveSessions, int activeTransfers, bool holdsFileSession, int listeningForwards)
|
||||
{
|
||||
var context = PhoneEnvironment.Require();
|
||||
|
||||
@@ -165,7 +170,7 @@ internal sealed class SessionForegroundService : Service
|
||||
|
||||
// The summary says what is actually held, counted rather than generic — the same principle the
|
||||
// delete confirmations follow. "DodoSSH is running" would tell the user nothing they could act on.
|
||||
var summary = Summarise(liveSessions, activeTransfers, holdsFileSession);
|
||||
var summary = Summarise(liveSessions, activeTransfers, holdsFileSession, listeningForwards);
|
||||
|
||||
// In-place only while backgrounded, where it is the only legal move. Foregrounded, a real start is
|
||||
// always allowed and is preferred even when `running` says the service is up: a disconnect followed
|
||||
@@ -255,15 +260,22 @@ internal sealed class SessionForegroundService : Service
|
||||
activity.RequestPermissions([postNotifications], NotificationPermissionRequestCode));
|
||||
}
|
||||
|
||||
private static string Summarise(int liveSessions, int activeTransfers, bool holdsFileSession)
|
||||
private static string Summarise(int liveSessions, int activeTransfers, bool holdsFileSession, int listeningForwards)
|
||||
{
|
||||
var parts = new List<string>(3);
|
||||
var parts = new List<string>(4);
|
||||
|
||||
if (liveSessions > 0)
|
||||
{
|
||||
parts.Add(liveSessions == 1 ? "1 shell connected" : $"{liveSessions} shells connected");
|
||||
}
|
||||
|
||||
// Beside the shells they run over, and only while one is: a count left over from a session that has
|
||||
// just ended would be a receipt for ports nothing holds open any more.
|
||||
if (liveSessions > 0 && listeningForwards > 0)
|
||||
{
|
||||
parts.Add(listeningForwards == 1 ? "1 port forwarded" : $"{listeningForwards} ports forwarded");
|
||||
}
|
||||
|
||||
if (holdsFileSession)
|
||||
{
|
||||
parts.Add("Files connected");
|
||||
|
||||
Reference in new issue
Block a user