Merge branch 'claude/trust-connect-popup-56abec'
ci / android head (push) Successful in 3m28s
ci / desktop nightly (push) Successful in 43s
ci / build and test (push) Successful in 2m6s
ci / api image (push) Successful in 25s

This commit is contained in:
2026-08-06 12:27:20 +02:00
11 changed files with 609 additions and 75 deletions
@@ -9960,12 +9960,37 @@ internal sealed partial class VaultViewModel(
await AutoSyncAsync(cancellationToken).ConfigureAwait(true);
}
/// <summary>Dismisses the trust prompt without pinning anything.</summary>
/// <summary>
/// Dismisses whichever host-key decision is showing, without pinning or forgetting anything.
/// </summary>
/// <remarks>
/// <para>
/// One command for both, because both are dismissals and the two states are mutually exclusive — which is
/// what <c>TransfersViewModel.RejectHostKey</c> has always done for the same pair of cards. The mismatch
/// has nothing else it may offer: withdrawing a pin is a deliberate act performed in the host's editor,
/// away from the moment of connecting, and a button here would be "continue anyway" with two clicks
/// instead of one.
/// </para>
/// <para>
/// <b>It used to clear only the pending key, which left the mismatch with no working exit.</b> That was
/// invisible for as long as the refusal was a banner at the top of a screen — nothing was drawn over, so
/// nothing was trapped, and the next connection attempt cleared it. It is not invisible now: both heads
/// draw the refusal over the surface, and the phone's is an opaque full-screen panel whose one button runs
/// this command. Leaving <see cref="HostKeyMismatch"/> set would have kept that panel up over every screen
/// the user went to afterwards, including the host editor they were being sent to.
/// </para>
/// </remarks>
[RelayCommand]
private void RejectHostKey()
{
var wasOffered = PendingHostKey is not null;
PendingHostKey = null;
Status = "The host key was not trusted, so nothing was connected.";
HostKeyMismatch = null;
Status = wasOffered
? "The host key was not trusted, so nothing was connected."
: "Nothing was connected.";
}
/// <summary>