diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index c1685d98b..37aeef888 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -62,7 +62,6 @@ namespace MatterHackers.MatterControl using MatterHackers.MatterControl.Library; using MatterHackers.MatterControl.PartPreviewWindow; using MatterHackers.MatterControl.PartPreviewWindow.View3D; - using MatterHackers.MatterControl.PluginSystem; using MatterHackers.MatterControl.PrinterControls.PrinterConnections; using MatterHackers.MatterControl.SimplePartScripting; using MatterHackers.MeshVisualizer; @@ -77,6 +76,8 @@ namespace MatterHackers.MatterControl /// public static INativePlatformFeatures Platform { get; set; } + public static bool IsLoading { get; internal set; } = true; + /// /// The root SystemWindow /// @@ -85,8 +86,6 @@ namespace MatterHackers.MatterControl public class ApplicationController { - public static string PlatformFeaturesProvider { get; set; } = "MatterHackers.MatterControl.WindowsPlatformsFeatures, MatterControl"; - public ThemeConfig Theme { get; set; } = new ThemeConfig(); public RunningTasksConfig Tasks { get; set; } = new RunningTasksConfig(); @@ -98,8 +97,6 @@ namespace MatterHackers.MatterControl private static string cacheDirectory = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "temp", "cache"); - public bool IsLoading { get; internal set; } = true; - // TODO: Any references to this property almost certainly need to be reconsidered. ActiveSliceSettings static references that assume a single printer // selection are being redirected here. This allows us to break the dependency to the original statics and consolidates // us down to a single point where code is making assumptions about the presence of a printer, printer counts, etc. If we previously checked for @@ -160,7 +157,7 @@ namespace MatterHackers.MatterControl // HACK: short term solution to resolve printer reference for non-printer related contexts DragDropData.Printer = printer; - if (!ApplicationController.Instance.IsLoading) + if (!AppContext.IsLoading) { // Fire printer changed event } @@ -176,7 +173,7 @@ namespace MatterHackers.MatterControl ActiveSliceSettings.OnActivePrinterChanged(null); } - if (!ApplicationController.Instance.IsLoading + if (!AppContext.IsLoading && printer.Settings.PrinterSelected && printer.Settings.GetValue(SettingsKey.auto_connect)) { @@ -500,7 +497,6 @@ namespace MatterHackers.MatterControl // Initialize statics DefaultThumbBackground.DefaultBackgroundColor = Color.Transparent; - AppContext.Platform = AggContext.CreateInstanceFrom(PlatformFeaturesProvider); Object3D.AssetsPath = ApplicationDataStorage.Instance.LibraryAssetsPath; this.Library = new LibraryConfig(); @@ -510,7 +506,7 @@ namespace MatterHackers.MatterControl // Name = "MainSlidePanel"; ActiveTheme.ThemeChanged.RegisterEvent((s, e) => { - if (!ApplicationController.Instance.IsLoading) + if (!AppContext.IsLoading) { ReloadAll(); } @@ -765,7 +761,7 @@ namespace MatterHackers.MatterControl ActiveSliceSettings.ActivePrinterChanged.RegisterEvent((s, e) => { - if (!ApplicationController.Instance.IsLoading) + if (!AppContext.IsLoading) { ApplicationController.Instance.ReloadAll(); } @@ -806,6 +802,72 @@ namespace MatterHackers.MatterControl } } + public void OnLoadActions() + { + // TODO: Calling UserChanged seems wrong. Load the right user before we spin up controls, rather than after + // Pushing this after load fixes that empty printer list + /////////////////////ApplicationController.Instance.UserChanged(); + + bool showAuthWindow = PrinterSetup.ShouldShowAuthPanel?.Invoke() ?? false; + if (showAuthWindow) + { + if (ApplicationSettings.Instance.get(ApplicationSettingsKey.SuppressAuthPanel) != "True") + { + //Launch window to prompt user to sign in + UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage())); + } + } + else + { + //If user in logged in sync before checking to prompt to create printer + if (ApplicationController.SyncPrinterProfiles == null) + { + RunSetupIfRequired(); + } + else + { + ApplicationController.SyncPrinterProfiles.Invoke("ApplicationController.OnLoadActions()", null).ContinueWith((task) => + { + RunSetupIfRequired(); + }); + } + } + + // TODO: This should be moved into the splash screen and shown instead of MainView + if (AggContext.OperatingSystem == OSType.Android) + { + // show this last so it is on top + if (UserSettings.Instance.get("SoftwareLicenseAccepted") != "true") + { + UiThread.RunOnIdle(() => DialogWindow.Show()); + } + } + + if (ApplicationController.Instance.ActivePrinter is PrinterConfig printer + && printer.Settings.PrinterSelected + && printer.Settings.GetValue(SettingsKey.auto_connect)) + { + UiThread.RunOnIdle(() => + { + //PrinterConnectionAndCommunication.Instance.HaltConnectionThread(); + printer.Connection.Connect(); + }, 2); + } + + //HtmlWindowTest(); + + AppContext.IsLoading = false; + } + + private static void RunSetupIfRequired() + { + if (!ProfileManager.Instance.ActiveProfiles.Any()) + { + // Start the setup wizard if no profiles exist + UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage())); + } + } + public void SwitchToSharedLibrary() { // Switch to the shared library @@ -1421,6 +1483,8 @@ namespace MatterHackers.MatterControl } } + public enum ReportSeverity2 { Warning, Error } + public interface INativePlatformFeatures { event EventHandler PictureTaken; @@ -1431,79 +1495,171 @@ namespace MatterHackers.MatterControl bool CameraInUseByExternalProcess { get; set; } bool IsNetworkConnected(); void FindAndInstantiatePlugins(SystemWindow systemWindow); + void ProcessCommandline(); + void ReportException(Exception e, string key = "", string value = "", ReportSeverity2 warningLevel = ReportSeverity2.Warning); + void PlatformInit(Action reporter); } - public class WindowsPlatformsFeatures : INativePlatformFeatures + public static class Application { - public bool CameraInUseByExternalProcess { get; set; } = false; + private static ProgressBar progressBar; + private static TextWidget statusText; + private static FlowLayoutWidget progressPanel; + private static string lastSection = ""; + private static Stopwatch timer; - public event EventHandler PictureTaken; - - public void TakePhoto(string imageFileName) + public static string PlatformFeaturesProvider { get; set; } = "MatterHackers.MatterControl.WindowsPlatformsFeatures, MatterControl"; + + public static SystemWindow LoadRootWindow(int width, int height) { - ImageBuffer noCameraImage = new ImageBuffer(640, 480); - Graphics2D graphics = noCameraImage.NewGraphics2D(); - graphics.Clear(Color.White); - graphics.DrawString("No Camera Detected", 320, 240, pointSize: 24, justification: Agg.Font.Justification.Center); - graphics.DrawString(DateTime.Now.ToString(), 320, 200, pointSize: 12, justification: Agg.Font.Justification.Center); - AggContext.ImageIO.SaveImageData(imageFileName, noCameraImage); + timer = Stopwatch.StartNew(); - PictureTaken?.Invoke(null, null); - } + var systemWindow = new DesktopRootSystemWindow(width, height) + { + BackgroundColor = Color.DarkGray + }; - public void OpenCameraPreview() - { - //Camera launcher placeholder (KP) - if (ApplicationSettings.Instance.get(ApplicationSettingsKey.HardwareHasCamera) == "true") - { - //Do something - } - else - { - //Do something else (like show warning message) - } - } + var overlay = new GuiWidget(); + overlay.AnchorAll(); - public void PlaySound(string fileName) - { - if (AggContext.OperatingSystem == OSType.Windows) + systemWindow.AddChild(overlay); + + progressPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) { - using (var mediaStream = AggContext.StaticData.OpenSteam(Path.Combine("Sounds", fileName))) + HAnchor = HAnchor.Center, + VAnchor = VAnchor.Center, + MinimumSize = new VectorMath.Vector2(400, 100), + }; + overlay.AddChild(progressPanel); + + progressPanel.AddChild(statusText = new TextWidget("", textColor: new Color("#bbb")) + { + MinimumSize = new VectorMath.Vector2(200, 30) + }); + + progressPanel.AddChild(progressBar = new ProgressBar() + { + FillColor = new Color("#3D4B72"), + BorderColor = new Color("#777"), + Height = 11, + Width = 300, + HAnchor = HAnchor.Absolute, + VAnchor = VAnchor.Absolute + }); + + AppContext.RootSystemWindow = systemWindow; + + // Hook SystemWindow load and spin up MatterControl once we've hit first draw + systemWindow.Load += (s, e) => + { + ReportStartupProgress(0.02, "First draw->RunOnIdle"); + + //UiThread.RunOnIdle(() => + Task.Run(() => { - (new System.Media.SoundPlayer(mediaStream)).Play(); - } - } - } + ReportStartupProgress(0.1, "Datastore"); + Datastore.Instance.Initialize(); - public bool IsNetworkConnected() - { - return true; - } - - public void ConfigureWifi() - { - } - - public void FindAndInstantiatePlugins(SystemWindow systemWindow) - { - string oemName = ApplicationSettings.Instance.GetOEMName(); - foreach (MatterControlPlugin plugin in PluginFinder.CreateInstancesOf()) - { - string pluginInfo = plugin.GetPluginInfoJSon(); - Dictionary nameValuePairs = Newtonsoft.Json.JsonConvert.DeserializeObject>(pluginInfo); - - if (nameValuePairs != null && nameValuePairs.ContainsKey("OEM")) - { - if (nameValuePairs["OEM"] == oemName) + ReportStartupProgress(0.15, "MatterControlApplication.Initialize"); + var mainView = Initialize(systemWindow, (progress0To1, status) => { - plugin.Initialize(systemWindow); - } - } - else - { - plugin.Initialize(systemWindow); - } + ReportStartupProgress(0.2 + progress0To1 * 0.7, status); + }); + + ReportStartupProgress(0.9, "AddChild->MainView"); + systemWindow.AddChild(mainView, 0); + + ReportStartupProgress(1, ""); + systemWindow.BackgroundColor = Color.Transparent; + overlay.Close(); + + // TODO: Still can't figure out the delay between concluding this block and the first actual render with MainView content. Current + // best guess is delays between widget construction and OpenGL texture creation + }); + }; + + // Block indefinitely + ReportStartupProgress(0, "ShowAsSystemWindow"); + systemWindow.ShowAsSystemWindow(); + + return systemWindow; + } + + public static GuiWidget Initialize(SystemWindow systemWindow, Action reporter) + { + AppContext.Platform = AggContext.CreateInstanceFrom(PlatformFeaturesProvider); + + reporter?.Invoke(0.01, "PlatformInit"); + AppContext.Platform.PlatformInit((status) => + { + reporter?.Invoke(0.01, status); + }); + + // TODO: Appears to be unused and should be removed + // set this at startup so that we can tell next time if it got set to true in close + UserSettings.Instance.Fields.StartCount = UserSettings.Instance.Fields.StartCount + 1; + + reporter?.Invoke(0.05, "ApplicationController"); + var na = ApplicationController.Instance; + + // Set the default theme colors + reporter?.Invoke(0.1, "LoadOemOrDefaultTheme"); + ApplicationController.LoadOemOrDefaultTheme(); + + // Accessing any property on ProfileManager will run the static constructor and spin up the ProfileManager instance + reporter?.Invoke(0.2, "ProfileManager"); + bool na2 = ProfileManager.Instance.IsGuestProfile; + + reporter?.Invoke(0.3, "MainView"); + ApplicationController.Instance.MainView = new WidescreenPanel(); + + // now that we are all set up lets load our plugins and allow them their chance to set things up + reporter?.Invoke(0.8, "Plugins"); + AppContext.Platform.FindAndInstantiatePlugins(systemWindow); + if (ApplicationController.Instance.PluginsLoaded != null) + { + ApplicationController.Instance.PluginsLoaded.CallEvents(null, null); } + + reporter?.Invoke(0.9, "Process Commandline"); + AppContext.Platform.ProcessCommandline(); + + reporter?.Invoke(0.91, "OnLoadActions"); + ApplicationController.Instance.OnLoadActions(); + + UiThread.RunOnIdle(CheckOnPrinter); + + return ApplicationController.Instance.MainView; + } + + private static void ReportStartupProgress(double progress0To1, string section) + { + statusText.Text = section; + progressBar.RatioComplete = progress0To1; + progressPanel.Invalidate(); + + Console.WriteLine($"Time to '{lastSection}': {timer.ElapsedMilliseconds}"); + timer.Restart(); + + lastSection = section; + } + + private static void CheckOnPrinter() + { + try + { + // TODO: UiThread should not be driving anything in Printer.Connection + ApplicationController.Instance.ActivePrinter.Connection.OnIdle(); + } + catch (Exception e) + { + Debug.Print(e.Message); + GuiWidget.BreakInDebugger(); +#if DEBUG + throw e; +#endif + } + UiThread.RunOnIdle(CheckOnPrinter); } } } \ No newline at end of file diff --git a/DesktopRootSystemWindow.cs b/DesktopRootSystemWindow.cs index a5d0f2dfb..c865bfc86 100644 --- a/DesktopRootSystemWindow.cs +++ b/DesktopRootSystemWindow.cs @@ -133,7 +133,7 @@ namespace MatterHackers.MatterControl } #endif -#if DEBUG +#if DEBUG && !__ANDROID__ WinformsSystemWindow.InspectorCreator = (inspectingWindow) => { if (inspectingWindow == this) @@ -268,12 +268,13 @@ namespace MatterHackers.MatterControl message = "Are you sure you want exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again.".Localize(); } } +#if !__ANDROID__ else if (PartsSheet.IsSaving()) { caption = "Confirm Exit".Localize(); message = "You are currently saving a parts sheet, are you sure you want to exit?".Localize(); } - +#endif if (caption != null) { // Record that we are waiting for a response to the request to close diff --git a/MatterControlApplication.cs b/MatterControlApplication.cs index d5e0a20a5..c25fb35a1 100644 --- a/MatterControlApplication.cs +++ b/MatterControlApplication.cs @@ -34,6 +34,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Threading; +using System.Threading.Tasks; using MatterHackers.Agg; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; @@ -49,6 +50,7 @@ namespace MatterHackers.MatterControl { public static class MatterControlApplication { + #if DEBUG //public static string MCWSBaseUri { get; } = "http://192.168.2.129:9206"; @@ -57,181 +59,7 @@ namespace MatterHackers.MatterControl public static string MCWSBaseUri { get; } = "https://mattercontrol.appspot.com"; #endif - public static GuiWidget Initialize(SystemWindow systemWindow, Action reporter) - { - if (AggContext.OperatingSystem == OSType.Mac && AggContext.StaticData == null) - { - // Set working directory - this duplicates functionality in Main but is necessary on OSX as Main fires much later (after the constructor in this case) - // resulting in invalid paths due to path tests running before the working directory has been overridden. Setting the value before initializing StaticData - // works around this architectural difference. - Directory.SetCurrentDirectory(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)); - } - - // Initialize a standard file system backed StaticData provider - if (AggContext.StaticData == null) // it may already be initialized by tests - { - reporter?.Invoke(0.01, "StaticData"); - AggContext.StaticData = new MatterHackers.Agg.FileSystemStaticData(); - } - - - ApplicationSettings.Instance.set("HardwareHasCamera", "false"); - - // TODO: Appears to be unused and should be removed - // set this at startup so that we can tell next time if it got set to true in close - UserSettings.Instance.Fields.StartCount = UserSettings.Instance.Fields.StartCount + 1; - - var commandLineArgs = Environment.GetCommandLineArgs(); - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - - for (int currentCommandIndex = 0; currentCommandIndex < commandLineArgs.Length; currentCommandIndex++) - { - string command = commandLineArgs[currentCommandIndex]; - string commandUpper = command.ToUpper(); - switch (commandUpper) - { - case "FORCE_SOFTWARE_RENDERING": - GL.HardwareAvailable = false; - break; - - case "CLEAR_CACHE": - AboutWidget.DeleteCacheData(0); - break; - - case "SHOW_MEMORY": - DesktopRootSystemWindow.ShowMemoryUsed = true; - break; - } - } - - reporter?.Invoke(0.05, "ApplicationController"); - var na = ApplicationController.Instance; - - // Set the default theme colors - reporter?.Invoke(0.1, "LoadOemOrDefaultTheme"); - ApplicationController.LoadOemOrDefaultTheme(); - - // Accessing any property on ProfileManager will run the static constructor and spin up the ProfileManager instance - reporter?.Invoke(0.2, "ProfileManager"); - bool na2 = ProfileManager.Instance.IsGuestProfile; - - reporter?.Invoke(0.3, "MainView"); - ApplicationController.Instance.MainView = new WidescreenPanel(); - - // now that we are all set up lets load our plugins and allow them their chance to set things up - reporter?.Invoke(0.8, "Plugins"); - AppContext.Platform.FindAndInstantiatePlugins(systemWindow); - if (ApplicationController.Instance.PluginsLoaded != null) - { - ApplicationController.Instance.PluginsLoaded.CallEvents(null, null); - } - - // TODO: Do we still want to support command line arguments for adding to the queue? - foreach (string arg in commandLineArgs) - { - string argExtension = Path.GetExtension(arg).ToUpper(); - if (argExtension.Length > 1 - && MeshFileIo.ValidFileExtensions().Contains(argExtension)) - { - QueueData.Instance.AddItem(new PrintItemWrapper(new PrintItem(Path.GetFileName(arg), Path.GetFullPath(arg)))); - } - } - - reporter?.Invoke(0.9, "AfterLoad"); - AfterLoad(); - - return ApplicationController.Instance.MainView; - } - - public static void AfterLoad() - { - // ApplicationController.Instance.OnLoadActions {{ - - // TODO: Calling UserChanged seems wrong. Load the right user before we spin up controls, rather than after - // Pushing this after load fixes that empty printer list - /////////////////////ApplicationController.Instance.UserChanged(); - - bool showAuthWindow = PrinterSetup.ShouldShowAuthPanel?.Invoke() ?? false; - if (showAuthWindow) - { - if (ApplicationSettings.Instance.get(ApplicationSettingsKey.SuppressAuthPanel) != "True") - { - //Launch window to prompt user to sign in - UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage())); - } - } - else - { - //If user in logged in sync before checking to prompt to create printer - if (ApplicationController.SyncPrinterProfiles == null) - { - RunSetupIfRequired(); - } - else - { - ApplicationController.SyncPrinterProfiles.Invoke("ApplicationController.OnLoadActions()", null).ContinueWith((task) => - { - RunSetupIfRequired(); - }); - } - } - - // TODO: This should be moved into the splash screen and shown instead of MainView - if (AggContext.OperatingSystem == OSType.Android) - { - // show this last so it is on top - if (UserSettings.Instance.get("SoftwareLicenseAccepted") != "true") - { - UiThread.RunOnIdle(() => DialogWindow.Show()); - } - } - - if (ApplicationController.Instance.ActivePrinter is PrinterConfig printer - && printer.Settings.PrinterSelected - && printer.Settings.GetValue(SettingsKey.auto_connect)) - { - UiThread.RunOnIdle(() => - { - //PrinterConnectionAndCommunication.Instance.HaltConnectionThread(); - printer.Connection.Connect(); - }, 2); - } - // ApplicationController.Instance.OnLoadActions }} - - //HtmlWindowTest(); - - UiThread.RunOnIdle(CheckOnPrinter); - - ApplicationController.Instance.IsLoading = false; - } - - private static void RunSetupIfRequired() - { - if (!ProfileManager.Instance.ActiveProfiles.Any()) - { - // Start the setup wizard if no profiles exist - UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage())); - } - } - - private static void CheckOnPrinter() - { - try - { - // TODO: UiThread should not be driving anything in Printer.Connection - ApplicationController.Instance.ActivePrinter.Connection.OnIdle(); - } - catch (Exception e) - { - Debug.Print(e.Message); - GuiWidget.BreakInDebugger(); -#if DEBUG - throw e; -#endif - } - UiThread.RunOnIdle(CheckOnPrinter); - } - + private static void AssertDebugNotDefined() { #if DEBUG diff --git a/Program.cs b/Program.cs index 5b6d9f0f1..1c0366d9c 100644 --- a/Program.cs +++ b/Program.cs @@ -20,13 +20,7 @@ namespace MatterHackers.MatterControl private static int raygunNotificationCount = 0; - private static string lastSection = ""; - private static RaygunClient _raygunClient = GetCorrectClient(); - private static Stopwatch timer; - private static ProgressBar progressBar; - private static TextWidget statusText; - private static FlowLayoutWidget progressPanel; /// /// The main entry point for the application. @@ -54,91 +48,11 @@ namespace MatterHackers.MatterControl AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); } - timer = Stopwatch.StartNew(); - // Get startup bounds from MatterControl and construct system window //var systemWindow = new DesktopMainWindow(400, 200) var (width, height) = DesktopRootSystemWindow.GetStartupBounds(); - var systemWindow = new DesktopRootSystemWindow(width, height) - { - BackgroundColor = Color.DarkGray - }; - - var overlay = new GuiWidget(); - overlay.AnchorAll(); - - systemWindow.AddChild(overlay); - - progressPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) - { - HAnchor = HAnchor.Center, - VAnchor = VAnchor.Center, - MinimumSize = new VectorMath.Vector2(400, 100), - }; - overlay.AddChild(progressPanel); - - progressPanel.AddChild(statusText = new TextWidget("", textColor: new Color("#bbb")) - { - MinimumSize = new VectorMath.Vector2(200, 30) - }); - - progressPanel.AddChild(progressBar = new ProgressBar() - { - FillColor = new Color("#3D4B72"), - BorderColor = new Color("#777"), - Height = 11, - Width = 300, - HAnchor = HAnchor.Absolute, - VAnchor = VAnchor.Absolute - }); - - AppContext.RootSystemWindow = systemWindow; - - // Hook SystemWindow load and spin up MatterControl once we've hit first draw - systemWindow.Load += (s, e) => - { - ReportStartupProgress(0.02, "First draw->RunOnIdle"); - - //UiThread.RunOnIdle(() => - Task.Run(() => - { - ReportStartupProgress(0.1, "Datastore"); - Datastore.Instance.Initialize(); - - ReportStartupProgress(0.15, "MatterControlApplication.Initialize"); - var mainView = MatterControlApplication.Initialize(systemWindow, (progress0To1, status) => - { - ReportStartupProgress(0.2 + progress0To1 * 0.7, status); - }); - - ReportStartupProgress(0.9, "AddChild->MainView"); - systemWindow.AddChild(mainView, 0); - - ReportStartupProgress(1, ""); - systemWindow.BackgroundColor = Color.Transparent; - overlay.Close(); - - // TODO: Still can't figure out the delay between concluding this block and the first actual render with MainView content. Current - // best guess is delays between widget construction and OpenGL texture creation - }); - }; - - // Block indefinitely - ReportStartupProgress(0, "ShowAsSystemWindow"); - systemWindow.ShowAsSystemWindow(); - } - - private static void ReportStartupProgress(double progress0To1, string section) - { - statusText.Text = section; - progressBar.RatioComplete = progress0To1; - progressPanel.Invalidate(); - - Console.WriteLine($"Time to '{lastSection}': {timer.ElapsedMilliseconds}"); - timer.Restart(); - - lastSection = section; + Application.LoadRootWindow(width, height); } private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) diff --git a/SetupWizard/AndroidNetworkTroubleshootingPage.cs b/SetupWizard/AndroidNetworkTroubleshootingPage.cs index cd5ff69de..709952fb5 100644 --- a/SetupWizard/AndroidNetworkTroubleshootingPage.cs +++ b/SetupWizard/AndroidNetworkTroubleshootingPage.cs @@ -46,7 +46,7 @@ namespace MatterHackers.MatterControl configureButton.Margin = new BorderDouble(0, 0, 10, 0); configureButton.Click += (s, e) => { - MatterControlApplication.Instance.ConfigureWifi(); + MatterControl.AppContext.Platform.ConfigureWifi(); UiThread.RunOnIdle(WizardWindow.Close, 1); // We could clear the failure count allowing the user to toggle wifi, then retry sign-in diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index e03d0344c..4a00055f6 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit e03d0344ceb98c59d24f916a9217c4a4fa0a32a1 +Subproject commit 4a00055f6ed13dc4649d13c4cb499f3b7e09b202