diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index db969cf4..b2a7281b 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -222,6 +222,7 @@ public class App : Application // logging is init'd here AppScaffolding.LibationScaffolding.RunPostMigrationScaffolding(AppScaffolding.Variety.Chardonnay, config); + Program.LoggingEnabled = true; } private static void ShowMainWindow(IClassicDesktopStyleApplicationLifetime desktop) diff --git a/Source/LibationAvalonia/Controls/Settings/Important.axaml b/Source/LibationAvalonia/Controls/Settings/Important.axaml index 7745a507..f5e0799e 100644 --- a/Source/LibationAvalonia/Controls/Settings/Important.axaml +++ b/Source/LibationAvalonia/Controls/Settings/Important.axaml @@ -8,7 +8,7 @@ x:DataType="vm:ImportantSettingsVM" x:Class="LibationAvalonia.Controls.Settings.Important"> - + + + + + diff --git a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs index 65c1404b..00a56041 100644 --- a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs +++ b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs @@ -28,7 +28,7 @@ namespace LibationAvalonia.Dialogs.Login { try { - if (await BrowserLoginAsync(choiceIn.LoginUrl) is ChoiceOut external) + if (Configuration.Instance.UseWebView && await BrowserLoginAsync(choiceIn.LoginUrl) is ChoiceOut external) return external; } catch (Exception ex) diff --git a/Source/LibationAvalonia/Program.cs b/Source/LibationAvalonia/Program.cs index c437fb36..ff5c7709 100644 --- a/Source/LibationAvalonia/Program.cs +++ b/Source/LibationAvalonia/Program.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using ApplicationServices; using AppScaffolding; using Avalonia; +using Avalonia.Controls; using ReactiveUI.Avalonia; using LibationFileManager; using LibationAvalonia.Dialogs; @@ -18,7 +19,7 @@ namespace LibationAvalonia static class Program { private static System.Threading.Lock SetupLock { get; } = new(); - private static bool LoggingEnabled { get; set; } + internal static bool LoggingEnabled { get; set; } [STAThread] static void Main(string[] args) { @@ -64,6 +65,13 @@ namespace LibationAvalonia } catch (Exception ex) { + if (new StackTrace(ex).GetFrames().Any(f => f.GetMethod()?.DeclaringType == typeof(NativeWebDialog))) + { + //Many of the NativeWebDialog exceptions cannot be handled by user code, + //so a webview failure is a fatal error. Disable webview usage and rely + //on the external browser login method instead. + Configuration.Instance.UseWebView = false; + } LogAndShowCrashMessage(ex); } } diff --git a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs index 22bf08ee..f651640b 100644 --- a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs +++ b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs @@ -25,6 +25,7 @@ namespace LibationAvalonia.ViewModels.Settings OverwriteExisting = config.OverwriteExisting; CreationTime = DateTimeSources.SingleOrDefault(v => v.Value == config.CreationTime) ?? DateTimeSources[0]; LastWriteTime = DateTimeSources.SingleOrDefault(v => v.Value == config.LastWriteTime) ?? DateTimeSources[0]; + UseWebView = config.UseWebView; LoggingLevel = config.LogLevel; GridScaleFactor = scaleFactorToLinearRange(config.GridScaleFactor); GridFontScaleFactor = scaleFactorToLinearRange(config.GridFontScaleFactor); @@ -41,6 +42,7 @@ namespace LibationAvalonia.ViewModels.Settings config.OverwriteExisting = OverwriteExisting; config.CreationTime = CreationTime.Value; config.LastWriteTime = LastWriteTime.Value; + config.UseWebView = UseWebView; config.LogLevel = LoggingLevel; } @@ -83,6 +85,8 @@ namespace LibationAvalonia.ViewModels.Settings = Enum.GetValues() .Select(v => new EnumDisplay(v)) .ToArray(); + + public string UseWebViewText { get; } = Configuration.GetDescription(nameof(Configuration.UseWebView)); public Serilog.Events.LogEventLevel[] LoggingLevels { get; } = Enum.GetValues(); public string GridScaleFactorText { get; } = Configuration.GetDescription(nameof(Configuration.GridScaleFactor)); public string GridFontScaleFactorText { get; } = Configuration.GetDescription(nameof(Configuration.GridFontScaleFactor)); @@ -96,6 +100,7 @@ namespace LibationAvalonia.ViewModels.Settings public float GridFontScaleFactor { get; set; } public EnumDisplay CreationTime { get; set; } public EnumDisplay LastWriteTime { get; set; } + public bool UseWebView { get; set; } public Serilog.Events.LogEventLevel LoggingLevel { get; set; } public string ThemeVariant diff --git a/Source/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs index a4425ff9..5d758cdb 100644 --- a/Source/LibationFileManager/Configuration.PersistentSettings.cs +++ b/Source/LibationFileManager/Configuration.PersistentSettings.cs @@ -326,6 +326,9 @@ namespace LibationFileManager [Description("Automatically run periodic scans in the background?")] public bool AutoScan { get => GetNonString(defaultValue: true); set => SetNonString(value); } + [Description("Use Libation's buit-in web broswer to log into Audible?")] + public bool UseWebView { get => GetNonString(defaultValue: true); set => SetNonString(value); } + [Description("Auto download books? After scan, download new books in 'checked' accounts.")] // poorly named setting. Should just be 'AutoDownload'. It is NOT episode specific public bool AutoDownloadEpisodes { get => GetNonString(defaultValue: false); set => SetNonString(value); }