diff --git a/src/DodoSSH.Client.Android/App.axaml.cs b/src/DodoSSH.Client.Android/App.axaml.cs
index 38a93f1..9b23117 100644
--- a/src/DodoSSH.Client.Android/App.axaml.cs
+++ b/src/DodoSSH.Client.Android/App.axaml.cs
@@ -246,11 +246,7 @@ public sealed partial class DodoSshApp : Avalonia.Application
knownHosts,
deviceKeys,
- // Difference 4: the system browser by intent, and the response by intent too rather than on a
- // loopback socket. See AndroidAuthorization for why the desktop's listener is not reused.
- async (url, cancellationToken) => await ServerConnection
- .SignInAsync(url, browser, TimeProvider.System, cancellationToken, ConfigureAndroidOidc)
- .ConfigureAwait(false),
+ SignInThroughBrowser(browser),
TimeProvider.System,
connections,
@@ -273,14 +269,7 @@ public sealed partial class DodoSshApp : Avalonia.Application
updates: updates,
- // Signing in to Spelunk comes back the way signing in to DodoSSH does — by intent, to the same
- // registered scheme, at the dev.dodotech.dodossh:/callback Spelunk allows — and names this phone as
- // the account's device list does, for difference 5's reason.
- spelunkAccounts: new SpelunkAccounts(
- browser,
- path => new AndroidRedirectCallback(path),
- TimeProvider.System,
- PhoneEnvironment.DeviceName));
+ spelunkAccounts: PhoneSpelunkAccounts(browser));
// Started rather than awaited: framework initialisation must not block on a schema migration. The
// view model shows its own progress and handles its own failures.
@@ -289,6 +278,23 @@ public sealed partial class DodoSshApp : Avalonia.Application
return viewModel;
}
+ ///
+ /// Difference 4: the system browser by intent, and the response by intent too rather than on a loopback
+ /// socket. See AndroidAuthorization for why the desktop's listener is not reused.
+ ///
+ private static MainWindowViewModel.SignInHandler SignInThroughBrowser(AndroidBrowserLauncher browser) =>
+ async (url, cancellationToken) => await ServerConnection
+ .SignInAsync(url, browser, TimeProvider.System, cancellationToken, ConfigureAndroidOidc)
+ .ConfigureAwait(false);
+
+ ///
+ /// Signing in to Spelunk comes back the way signing in to DodoSSH does — by intent, to the same registered
+ /// scheme, at the dev.dodotech.dodossh:/callback Spelunk allows — and names this phone as the account's
+ /// device list does, for difference 5's reason.
+ ///
+ private static SpelunkAccounts PhoneSpelunkAccounts(AndroidBrowserLauncher browser) =>
+ new(browser, path => new AndroidRedirectCallback(path), TimeProvider.System, PhoneEnvironment.DeviceName);
+
///
/// Difference 4: where the authorization response comes back to.
///