diff --git a/Source/LibationAvalonia/Controls/Settings/Important.axaml b/Source/LibationAvalonia/Controls/Settings/Important.axaml
index f5e0799e..25519460 100644
--- a/Source/LibationAvalonia/Controls/Settings/Important.axaml
+++ b/Source/LibationAvalonia/Controls/Settings/Important.axaml
@@ -72,10 +72,18 @@
-
-
-
+
+
+
+
+
BrowserLoginAsync(ChoiceIn shoiceIn)
+ {
+ try
+ {
+ return await BrowserLoginAsyncCore(shoiceIn);
+ }
+ catch (Exception ex)
+ {
+ Serilog.Log.Logger.Warning(ex, "In-app browser failed; falling back to external browser");
+ return null;
+ }
+ }
+
+ private async Task BrowserLoginAsyncCore(ChoiceIn shoiceIn)
{
TaskCompletionSource tcs = new();
diff --git a/Source/LibationAvalonia/Program.cs b/Source/LibationAvalonia/Program.cs
index 5cd62b49..1862045e 100644
--- a/Source/LibationAvalonia/Program.cs
+++ b/Source/LibationAvalonia/Program.cs
@@ -52,6 +52,7 @@ static class Program
if (config.LibationFiles.SettingsAreValid)
{
App.RunMigrations(config);
+ // When running inside Snap, UseWebView getter returns false to avoid portal/sandbox crashes (e.g. github ticket #1664).
//Start loading the library before loading the main form
App.LibraryTask = Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true));
}
diff --git a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs
index b77ac518..82c4be85 100644
--- a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs
+++ b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs
@@ -1,4 +1,4 @@
-using Dinah.Core;
+using Dinah.Core;
using FileManager;
using LibationFileManager;
using LibationUiBase;
@@ -83,6 +83,9 @@ public class ImportantSettingsVM : ViewModelBase
.ToArray();
public string UseWebViewText { get; } = Configuration.GetDescription(nameof(Configuration.UseWebView));
+ /// When true, the Use WebView setting is disabled (e.g. when running in Snap to avoid portal/sandbox crashes).
+ public bool UseWebViewSettingDisabled => Configuration.IsRunningUnderSnap;
+ public string UseWebViewSnapMessage { get; } = Configuration.IsRunningUnderSnap ? "Disabled when running in Snap (avoids login crash). Use external browser instead." : "";
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));
diff --git a/Source/LibationFileManager/Configuration.Environment.cs b/Source/LibationFileManager/Configuration.Environment.cs
index bf0443f5..b0091b39 100644
--- a/Source/LibationFileManager/Configuration.Environment.cs
+++ b/Source/LibationFileManager/Configuration.Environment.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
namespace LibationFileManager;
@@ -24,6 +24,10 @@ public partial class Configuration
public static bool IsWindows { get; } = OperatingSystem.IsWindows();
public static bool IsLinux { get; } = OperatingSystem.IsLinux();
public static bool IsMacOs { get; } = OperatingSystem.IsMacOS();
+
+ /// True when running inside a (Linux) Snap sandbox (e.g. snap run libation). WebView login is disabled in this environment to avoid portal/sandbox crashes.
+ public static bool IsRunningUnderSnap { get; } = IsLinux && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("SNAP"));
+
public static Version? LibationVersion { get; private set; }
public static void SetLibationVersion(Version? version) => LibationVersion = version;
diff --git a/Source/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs
index b4912def..3e9d03f5 100644
--- a/Source/LibationFileManager/Configuration.PersistentSettings.cs
+++ b/Source/LibationFileManager/Configuration.PersistentSettings.cs
@@ -1,4 +1,4 @@
-using FileManager;
+using FileManager;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
@@ -344,7 +344,11 @@ public partial class Configuration
public bool AutoScan { get => GetNonString(defaultValue: false); set => SetNonString(value); }
[Description("Use Libation's built-in web browser to log into Audible?")]
- public bool UseWebView { get => GetNonString(defaultValue: true); set => SetNonString(value); }
+ public bool UseWebView
+ {
+ get => Configuration.IsRunningUnderSnap ? false : GetNonString(defaultValue: true);
+ set { if (!Configuration.IsRunningUnderSnap) 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
diff --git a/global.json b/global.json
deleted file mode 100644
index 6168d70b..00000000
--- a/global.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/global.json",
- "sdk": {
- "version": "10.0.101"
- },
- "test": {
- "runner": "Microsoft.Testing.Platform"
- }
-}
\ No newline at end of file