31 lines
1.8 KiB
C#
31 lines
1.8 KiB
C#
using VoiceCat.Core;
|
|||
|
|
using UIKit;
|
||
|
|
|
||
|
|
namespace VoiceCat.iOS;
|
||
|
|
|
||
|
|
internal sealed class RootViewController : UIViewController
|
||
|
|
{
|
||
|
|
private readonly AppModel model;
|
||
|
|
private UIViewController? current;
|
||
|
|
internal RootViewController(AppModel model) { this.model = model; model.Changed += Refresh; model.IdentityRequested += ShowIdentity; }
|
||
|
|
public override void ViewDidLoad() { base.ViewDidLoad(); View!.BackgroundColor = UIColor.SystemBackground; Refresh(); }
|
||
|
|
|
||
|
|
private void Refresh()
|
||
|
|
{
|
||
|
|
bool main = model.IsConnected;
|
||
|
|
if (current is MainTabController && main || current is UINavigationController && !main) return;
|
||
|
|
UIViewController next = main ? new MainTabController(model) : new UINavigationController(new ServerListController(model));
|
||
|
|
if (current is not null) { current.WillMoveToParentViewController(null); current.View.RemoveFromSuperview(); current.RemoveFromParentViewController(); }
|
||
|
|
AddChildViewController(next); next.View.Frame = View!.Bounds; next.View.AutoresizingMask = UIViewAutoresizing.All; View.AddSubview(next.View); next.DidMoveToParentViewController(this); current = next;
|
||
|
|
}
|
||
|
|
|
||
|
|
private void ShowIdentity(ServerIdentityChallenge challenge)
|
||
|
|
{
|
||
|
|
UIAlertController alert = UIAlertController.Create(challenge.Status == VoiceCat.Crypto.TofuStatus.Mismatch ? "Server Identity Changed" : "New Server Identity",
|
||
|
|
$"{challenge.Host}:{challenge.Port}\n\nSHA-256\n{challenge.CertificateFingerprint}", UIAlertControllerStyle.Alert);
|
||
|
|
alert.AddAction(UIAlertAction.Create("Reject", UIAlertActionStyle.Destructive, _ => model.ResolveIdentity(false)));
|
||
|
|
alert.AddAction(UIAlertAction.Create("Trust", UIAlertActionStyle.Default, _ => model.ResolveIdentity(true)));
|
||
|
|
PresentViewController(alert, true, null);
|
||
|
|
}
|
||
|
|
}
|