Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improvements to Altitude Angel integration #3147

Merged
merged 72 commits into from
Aug 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
4612d4c
Fixing integration and login
rupertbenbrook-aa Jul 7, 2023
792fbab
Switched constants to config
rupertbenbrook-aa Jul 7, 2023
cc2f832
Add scopes to user display on settings
rupertbenbrook-aa Jul 7, 2023
9b06ff1
Minor package updates
rupertbenbrook-aa Jul 7, 2023
05857a5
Including home location in plan and VTOL capability
rupertbenbrook-aa Jul 7, 2023
90e892c
Remove snk
rupertbenbrook-aa Jul 10, 2023
613cc03
Adding user agent with version to requests
rupertbenbrook-aa Jul 11, 2023
9a56062
User interface improvements
rupertbenbrook-aa Jul 11, 2023
53b166e
User interface improvements
rupertbenbrook-aa Jul 11, 2023
0380ab8
Disable script errors
rupertbenbrook-aa Jul 11, 2023
b97e6a8
Clean up
rupertbenbrook-aa Jul 11, 2023
320b4fa
External browser login
rupertbenbrook-aa Jul 12, 2023
7e91a73
Exception handler in cancel
rupertbenbrook-aa Jul 13, 2023
fb8b3d1
Features dependent on token scopes actually present
rupertbenbrook-aa Jul 13, 2023
0762e80
First start experience check and tweak
rupertbenbrook-aa Jul 13, 2023
73f2b91
Adding map altitude filtering
rupertbenbrook-aa Jul 13, 2023
23b64b3
Info panel link in external browser and basic UTM zone
rupertbenbrook-aa Jul 13, 2023
01d57ec
Merge remote-tracking branch 'origin' into aa-update
rupertbenbrook-aa Jul 13, 2023
fe9a160
Tidy
rupertbenbrook-aa Jul 13, 2023
bcbbb89
Adding initial contact number support
rupertbenbrook-aa Jul 14, 2023
3661c67
Delay sign in till main window open
rupertbenbrook-aa Jul 14, 2023
2cc074c
Fix gitignore
rupertbenbrook-aa Jul 14, 2023
e115c01
Better panel layout
rupertbenbrook-aa Jul 14, 2023
d827c3e
Tweak
rupertbenbrook-aa Jul 14, 2023
0195f3a
Message display improvements
rupertbenbrook-aa Jul 14, 2023
58f8427
Don't steal window focus
rupertbenbrook-aa Jul 14, 2023
09c5e42
Improve info panel with dragging and curl click on plan map
rupertbenbrook-aa Jul 14, 2023
0fb234b
Ctrl+Click on planning map for info
rupertbenbrook-aa Jul 14, 2023
895c157
About and enable/disable improvements
rupertbenbrook-aa Jul 14, 2023
a23c4a7
Adding Polly retries to some missing places
rupertbenbrook-aa Jul 14, 2023
d374f24
Cleanup of unused types
rupertbenbrook-aa Jul 14, 2023
bd49e5e
Rate cards now in map info panel
rupertbenbrook-aa Jul 14, 2023
f995a4c
Retry signin
rupertbenbrook-aa Jul 14, 2023
cffd929
Showing excluded map data
rupertbenbrook-aa Jul 14, 2023
2ab24a6
Fix first start
rupertbenbrook-aa Jul 14, 2023
7a689bb
One sign in at a time
rupertbenbrook-aa Jul 14, 2023
6b2e422
Fix readable list
rupertbenbrook-aa Jul 14, 2023
35b9b3a
Support info in About
rupertbenbrook-aa Jul 14, 2023
b4fab98
Merge branch 'master' into aa-update
rupertbenbrook Jul 15, 2023
05e297a
Fix token expiry retry, policy retries and write back settings when set
rupertbenbrook-aa Jul 15, 2023
e419e1a
Fixing client override and enable
rupertbenbrook-aa Jul 17, 2023
5f7aefd
Clickable messages
rupertbenbrook-aa Jul 18, 2023
899f09f
Better exception display in wait panel
rupertbenbrook-aa Jul 18, 2023
d4f1356
Merge branch 'master' into aa-update
rupertbenbrook Jul 18, 2023
89a5f0d
Layout improvements
rupertbenbrook-aa Jul 19, 2023
011607c
Correcting rate calc and zone display
rupertbenbrook-aa Jul 19, 2023
5523e57
Map loaded messages shorter
rupertbenbrook-aa Jul 19, 2023
d3e2178
Better message display
rupertbenbrook-aa Jul 19, 2023
566403f
Merge branch 'master' into aa-update
rupertbenbrook Jul 20, 2023
e381886
In case JWT isn't valid
rupertbenbrook-aa Jul 20, 2023
a36057f
Better sign in handling that does not get in the way when signed out,…
rupertbenbrook-aa Jul 20, 2023
f023e4c
Removing loading message
rupertbenbrook-aa Jul 20, 2023
ebc38f4
Use Flurl instead of HttpClient
rupertbenbrook-aa Jul 20, 2023
e9eb292
Settings layout tweak
rupertbenbrook-aa Jul 20, 2023
6c3d941
Policy tweak
rupertbenbrook-aa Jul 20, 2023
d16fc29
Telemetry and flight improvements
rupertbenbrook-aa Jul 20, 2023
2d041b4
Moving state out of main mission planner adapter. New settings.
rupertbenbrook-aa Jul 20, 2023
9e0f6f9
New and more consistent messaging. Renaming classes.
rupertbenbrook-aa Jul 20, 2023
195f69a
New keyed service locator and better http policy wrapping
rupertbenbrook-aa Jul 22, 2023
a145705
Split out API and flight clients
rupertbenbrook-aa Jul 22, 2023
097a04f
Split out auth client and cancellation tokens in flight
rupertbenbrook-aa Jul 24, 2023
5e5ddb7
More moving around of client code. Better exception formatting. More …
rupertbenbrook-aa Jul 24, 2023
0afe1fb
Submitting flight plans via flight approvals
rupertbenbrook-aa Jul 24, 2023
c0a97e2
Minor
rupertbenbrook-aa Jul 24, 2023
8cfb68d
Minor message change
rupertbenbrook-aa Jul 24, 2023
a09a8e1
Reorganization of types to simplify project. Adding surveillance clie…
rupertbenbrook-aa Jul 24, 2023
be9315b
Fixing potential cancel bug
rupertbenbrook-aa Jul 25, 2023
22b9a2b
Fix ctrl+click flight planning map bug
rupertbenbrook-aa Jul 25, 2023
51d3dc3
Fixing dispose (thanks @casrya!)
rupertbenbrook-aa Jul 31, 2023
994e0c3
Adding missing cancellation tokens
rupertbenbrook-aa Jul 31, 2023
967b9d6
Merge branch 'ArduPilot:master' into aa-update
rupertbenbrook Aug 4, 2023
21ac29b
Merge branch 'ArduPilot:master' into aa-update
rupertbenbrook Aug 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
446 changes: 237 additions & 209 deletions ExtLibs/AltitudeAngelWings.Plugin/AASettings.Designer.cs

Large diffs are not rendered by default.

222 changes: 133 additions & 89 deletions ExtLibs/AltitudeAngelWings.Plugin/AASettings.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Expand Down Expand Up @@ -117,5 +117,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</root>
64 changes: 44 additions & 20 deletions ExtLibs/AltitudeAngelWings.Plugin/AltitudeAngelPlugin.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
using AltitudeAngelWings.Plugin.Properties;
using AltitudeAngelWings.Service;
using MissionPlanner;

namespace AltitudeAngelWings.Plugin
{
Expand All @@ -17,7 +20,7 @@ public class AltitudeAngelPlugin : MissionPlanner.Plugin.Plugin

private bool _enabled;

static internal AltitudeAngelPlugin Instance;
internal static AltitudeAngelPlugin Instance;

public override bool Init()
{
Expand All @@ -32,20 +35,29 @@ public override bool Init()

public override bool Loaded()
{
ServiceLocator.Clear();
if (Host.config.ContainsKey("AA_CheckEnableAltitudeAngel"))
{
_enabled = Host.config.GetBoolean("AA_CheckEnableAltitudeAngel");
}
else
try
{
AskToEnableAltitudeAngel();
ServiceLocator.Clear();
if (Host.config.ContainsKey("AA_CheckEnableAltitudeAngel"))
{
_enabled = Host.config.GetBoolean("AA_CheckEnableAltitudeAngel");
}
else
{
AskToEnableAltitudeAngel();
}
if (_enabled)
{
EnableAltitudeAngel();
}
return true;
}
if (_enabled)
catch (Exception e)
{
EnableAltitudeAngel();
Console.WriteLine(e);
}
return true;

return false;
}

public override bool Exit()
Expand All @@ -65,18 +77,26 @@ private void AskToEnableAltitudeAngel(bool explicitClick = false)
text,
Resources.AskToEnableCaption,
CustomMessageBox.MessageBoxButtons.YesNo) == CustomMessageBox.DialogResult.Yes;
Host.config["AA_CheckEnableAltitudeAngel"] = (_enabled).ToString();
Host.config["AA_CheckEnableAltitudeAngel"] = _enabled.ToString();
Host.config.Save();
}

private void EnableAltitudeAngel()
{
ServiceLocator.Clear();
ConfigureServiceLocator();
var service = ServiceLocator.GetService<IAltitudeAngelService>();
if (!service.IsSignedIn)
Task.Run(() =>
{
service.SignInAsync();
}
Host.MainForm.Invoke(new Action(() =>
{
// Wait for splash screen to be closed before signing in
Program.Splash.Closed += (sender, args) =>
{
service.SignInAsync();
};
}));
});
}

private ToolStripMenuItem CreateSettingsMenuItem()
Expand All @@ -86,7 +106,8 @@ private ToolStripMenuItem CreateSettingsMenuItem()
Name = SettingsMenuItemName,
Text = Resources.SettingsMenuItemText,
Enabled = true,
Visible = true
Visible = true,
Image = Resources.AAIconBlack.ToBitmap()
};
menuItem.Click += OnSettingsClick;
return menuItem;
Expand All @@ -97,17 +118,20 @@ private void OnSettingsClick(object sender, EventArgs e)
if (!_enabled)
{
AskToEnableAltitudeAngel(true);
if (_enabled)
{
EnableAltitudeAngel();
}
}
if (!_enabled) return;
EnableAltitudeAngel();
new AASettings().Show(Host.MainForm);
AASettings.Instance.Show(Host.MainForm);
}

private void ConfigureServiceLocator()
{
ServiceLocator.Clear();
ServiceLocator.Register(l => Host);
ServiceLocator.Configure();
ServiceLocator.ConfigureFromAssembly(Assembly.GetAssembly(typeof(AltitudeAngelPlugin)));
ServiceLocator.ConfigureFromAssembly(Assembly.GetAssembly(typeof(IAltitudeAngelService)));
}
}
}
15 changes: 12 additions & 3 deletions ExtLibs/AltitudeAngelWings.Plugin/AltitudeAngelWings.Plugin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,15 @@
<NoWarn>1701;1702;NU1605</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotSpatial.Topology" Version="1.9.0" />
<PackageReference Include="MP.DotSpatial.Positioning" Version="4.0.0" />
<PackageReference Include="MP.DotSpatial.Projections" Version="4.0.0" />
<COMReference Include="SHDocVw">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>1</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>eab22ac0-30c1-11cf-a7eb-0000c05bae0b</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\MissionPlanner.csproj">
Expand All @@ -44,6 +50,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Update="WaitPanel.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
Expand Down
125 changes: 125 additions & 0 deletions ExtLibs/AltitudeAngelWings.Plugin/ControlOverlayMessageDisplay.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using AltitudeAngelWings.Model;
using AltitudeAngelWings.Service.Messaging;
using Message = AltitudeAngelWings.Model.Message;

namespace AltitudeAngelWings.Plugin
{
public class ControlOverlayMessageDisplay : IMessageDisplay
{
private const int LeftOffset = 5;

private readonly Control _parent;
private readonly IUiThreadInvoke _uiThreadInvoke;
private readonly int _bottomOffset;

public ControlOverlayMessageDisplay(Control parent, IUiThreadInvoke uiThreadInvoke, int bottomOffset)
{
_parent = parent;
_uiThreadInvoke = uiThreadInvoke;
_bottomOffset = bottomOffset;
}

public void AddMessage(Message message)
{
var label = CreateLabel(message);
_uiThreadInvoke.Invoke(() =>
{
if (!_parent.Visible) return;
_parent.SuspendLayout();
var labels = GetMessageLabels();
if (!string.IsNullOrEmpty(message.Key))
{
var matchingKeys = labels.Where(l => l.Name == message.Key).ToList();
foreach (var remove in matchingKeys)
{
_parent.Controls.Remove(remove);
labels.Remove(remove);
remove.Dispose();
}
}
_parent.Controls.Add(label);
label.BringToFront();
labels.Add(label);
LayoutLabels(labels);
_parent.ResumeLayout();
});
}

public void RemoveMessage(Message message)
{
_uiThreadInvoke.Invoke(() =>
{
if (!_parent.Visible) return;
_parent.SuspendLayout();
var labels = GetMessageLabels();
foreach (var label in labels)
{
if (label.Tag != message) continue;
_parent.Controls.Remove(label);
labels.Remove(label);
label.Dispose();
break;
}
LayoutLabels(labels);
_parent.ResumeLayout();
});
}

private Label CreateLabel(Message message)
{
var label = new Label
{
Tag = message,
Text = message.Content,
Name = message.Key ?? "",
AutoSize = true,
ForeColor = GetColorForMessage(message),
BackColor = Color.Transparent,
Visible = true,
Anchor = AnchorStyles.Bottom | AnchorStyles.Left,
TextAlign = ContentAlignment.MiddleLeft,
Padding = new Padding(5, 0, 5, 1),
Font = new Font("Microsoft Sans Serif", 9, FontStyle.Regular)
};
if (message.OnClick == null)
{
return label;
}

label.Cursor = Cursors.Hand;
label.Click += (sender, e) =>
{
message.OnClick();
RemoveMessage(message);
};
return label;
}

private static Color GetColorForMessage(Message message)
{
switch (message.Type)
{
case MessageType.Error:
return Color.Red;
default:
return message.OnClick == null ? Color.White : Color.LawnGreen;
}
}

private void LayoutLabels(ICollection<Label> labels)
{
var totalHeight = 0;
foreach (var label in labels)
{
totalHeight += label.Height;
label.Location = new Point(LeftOffset, _parent.Height - totalHeight - _bottomOffset);
}
}

private IList<Label> GetMessageLabels() => _parent.Controls.OfType<Label>().Where(l => l.Tag is Message).ToList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Threading.Tasks;
using AltitudeAngelWings.Clients;
using AltitudeAngelWings.Clients.Auth;
using AltitudeAngelWings.Clients.Auth.Model;
using AltitudeAngelWings.Model;
using AltitudeAngelWings.Service.Messaging;
using MissionPlanner.Plugin;

namespace AltitudeAngelWings.Plugin
{
public class ExternalWebBrowserAuthorizeCodeProvider : IAuthorizeCodeProvider
{
private readonly ISettings _settings;
private readonly IAuthClient _authClient;
private readonly IMessagesService _messages;
private readonly PluginHost _host;
private readonly IUiThreadInvoke _uiThreadInvoke;
private string _pollId;

public ExternalWebBrowserAuthorizeCodeProvider(ISettings settings, IAuthClient authClient, IMessagesService messages, PluginHost host, IUiThreadInvoke uiThreadInvoke)
{
_settings = settings;
_authClient = authClient;
_messages = messages;
_host = host;
_uiThreadInvoke = uiThreadInvoke;
}

public void GetAuthorizeParameters(NameValueCollection parameters)
{
// Generate a random poll id
_pollId = Guid.NewGuid().ToString("N");

// Add poll id to the parameters
parameters.Add("poll_id", _pollId);
}

public async Task<string> GetAuthorizeCode(Uri authorizeUri)
{
if (string.IsNullOrWhiteSpace(_settings.ClientId) || string.IsNullOrWhiteSpace(_settings.ClientSecret))
{
await _messages.AddMessageAsync(Message.ForAction(
"BadClientCredentials",
"Client ID and Client Secret are not set correctly. Click here to open settings.",
() => AASettings.Instance.Show(_host.MainForm),
() => _settings.TokenResponse.IsValidForAuth()));
return null;
}

return await _uiThreadInvoke.Invoke(() => UiTask.ShowDialog(async cancellationToken =>
{
var tokens = await _authClient.GetTokenFromClientCredentials(cancellationToken);
Process.Start(authorizeUri.ToString());

string code;
do
{
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
code = await _authClient.GetAuthorizationCode(tokens.AccessToken, _pollId, cancellationToken);
} while (!cancellationToken.IsCancellationRequested && code == null);

return code;
},
"Opening a browser to sign in to Altitude Angel. Please sign in using the browser."));
}
}
}
Loading
Loading