Public Access
All seven screens of the design, plus the two it does not draw because it starts at an enrolled phone: naming a server, and choosing a passphrase. The five states docs/android-port.md worried about losing at 360dp are all here and none of them softened. The changed-key refusal is a full-screen panel rather than a bottom sheet, because a sheet is swipe-to-dismiss by convention and that screen must have no way forward. The recovery code raises FLAG_SECURE for its own state and lowers it afterwards, so the sentence about screenshots is true rather than decorative. The delete confirmations keep their counts and replace the row in place. Signing in works, and the seam it needed is worth more than the implementation: IAuthorizationCallback now sits between OidcClient and the loopback listener, so the two heads differ in where the response arrives and in nothing else. PKCE, the state check, discovery, the token exchange and the key binding stay one implementation — a second OIDC client would be a second place for a security bug to live. The phone registers a private-use scheme with the system rather than binding a loopback port, which on a shared device any other app can do first. The accessory key row needed TerminalWorkspace.SendInputAsync: ordinary typing goes from the renderer straight down the socket, and there was no way in for the keys a software keyboard does not have. Ctrl latches, because one thumb cannot chord, and the latch is drawn — a modifier that is on and does not look on is how somebody sends ^L to a database prompt believing they typed an l. 597 client tests green, including two new ones for the input path and one for the terminal surface command. Nothing has run on a device.
60 lines
2.6 KiB
XML
60 lines
2.6 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
|
|
<PropertyGroup>
|
|
<TargetFramework>net10.0-android</TargetFramework>
|
|
<OutputType>Exe</OutputType>
|
|
<Nullable>enable</Nullable>
|
|
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
|
|
|
<!--
|
|
minSdk 28 (Android 9), targetSdk 36. Chosen rather than inherited, because docs/android-port.md
|
|
flagged it as a real decision: the packages constrain targetSdk, not the floor.
|
|
|
|
28 is where the three platform APIs this head actually depends on all exist in the framework
|
|
itself rather than behind an AndroidX shim: BiometricPrompt, StrongBox-backed keys, and
|
|
KeyGenParameterSpec.SetUnlockedDeviceRequired. Going lower would mean carrying androidx.biometric
|
|
to reach devices that mostly cannot hold a hardware-backed key anyway — which is the one thing
|
|
the device key store is for.
|
|
-->
|
|
<SupportedOSPlatformVersion>28</SupportedOSPlatformVersion>
|
|
<TargetPlatformVersion>36</TargetPlatformVersion>
|
|
|
|
<ApplicationId>dev.dodotech.dodossh</ApplicationId>
|
|
<ApplicationVersion>1</ApplicationVersion>
|
|
<ApplicationDisplayVersion>0.1.0</ApplicationDisplayVersion>
|
|
|
|
<!--
|
|
False here for the same reason the desktop head sets it false: this process formats timestamps
|
|
and host names for a person. See DodoSSH.Client.App.csproj.
|
|
-->
|
|
<InvariantGlobalization>false</InvariantGlobalization>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- The phone's control styles. The palette they draw from lives in Shell and is shared. -->
|
|
<AvaloniaResource Include="Theme/**" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<PackageReference Include="Avalonia" />
|
|
<PackageReference Include="Avalonia.Android" />
|
|
<PackageReference Include="Avalonia.Themes.Fluent" />
|
|
<PackageReference Include="Avalonia.Fonts.Inter" />
|
|
<PackageReference Include="Avalonia.Controls.WebView" />
|
|
<PackageReference Include="CommunityToolkit.Mvvm" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup>
|
|
<!--
|
|
The same view models the desktop head drives. That sharing is the whole reason this head is a
|
|
sibling project rather than a fork: docs/android-port.md's phone-first decision says the interface
|
|
is a redesign, and that what survives it is every view model, command and piece of state.
|
|
-->
|
|
<ProjectReference Include="../DodoSSH.Client.Shell/DodoSSH.Client.Shell.csproj" />
|
|
<ProjectReference Include="../DodoSSH.Client.Session/DodoSSH.Client.Session.csproj" />
|
|
<ProjectReference Include="../DodoSSH.Client.Ssh/DodoSSH.Client.Ssh.csproj" />
|
|
<ProjectReference Include="../DodoSSH.Client.Terminal/DodoSSH.Client.Terminal.csproj" />
|
|
</ItemGroup>
|
|
|
|
</Project>
|