using System; using System.Diagnostics; using System.Reflection; using Microsoft.Maui.ApplicationModel; namespace Microsoft.Maui.Platform.Linux.Services; public class AppInfoService : IAppInfo { private static readonly Lazy _instance = new Lazy(() => new AppInfoService()); private readonly Assembly _entryAssembly; private readonly string _packageName; private readonly string _name; private readonly string _versionString; private readonly Version _version; private readonly string _buildString; public static AppInfoService Instance => _instance.Value; public string PackageName => _packageName; public string Name => _name; public string VersionString => _versionString; public Version Version => _version; public string BuildString => _buildString; public LayoutDirection RequestedLayoutDirection => LayoutDirection.LeftToRight; public AppTheme RequestedTheme { get { // Use SystemThemeService for consistent theme detection across the platform return SystemThemeService.Instance.CurrentTheme switch { SystemTheme.Dark => AppTheme.Dark, SystemTheme.Light => AppTheme.Light, _ => AppTheme.Unspecified }; } } public AppPackagingModel PackagingModel { get { if (Environment.GetEnvironmentVariable("FLATPAK_ID") != null) { return AppPackagingModel.Packaged; } if (Environment.GetEnvironmentVariable("SNAP") != null) { return AppPackagingModel.Packaged; } if (Environment.GetEnvironmentVariable("APPIMAGE") != null) { return AppPackagingModel.Packaged; } return AppPackagingModel.Unpackaged; } } public AppInfoService() { _entryAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly(); _packageName = _entryAssembly.GetName().Name ?? "Unknown"; _name = _entryAssembly.GetCustomAttribute()?.Title ?? _packageName; _versionString = (_version = _entryAssembly.GetName().Version ?? new Version(1, 0)).ToString(); _buildString = _entryAssembly.GetCustomAttribute()?.InformationalVersion ?? _versionString; } public void ShowSettingsUI() { try { Process.Start(new ProcessStartInfo { FileName = "gnome-control-center", UseShellExecute = true }); } catch { try { Process.Start(new ProcessStartInfo { FileName = "xdg-open", Arguments = "x-settings:", UseShellExecute = true }); } catch (Exception ex) { DiagnosticLog.Debug("AppInfoService", "Settings launch fallback failed", ex); } } } }