Files
LanMountainDesktop/LanMountainDesktop/ViewModels/PrivacySettingsPageViewModel.cs

138 lines
4.6 KiB
C#
Raw Normal View History

2026-03-16 09:50:48 +08:00
using System;
2026-03-15 17:08:07 +08:00
using CommunityToolkit.Mvvm.ComponentModel;
2026-03-16 09:50:48 +08:00
using CommunityToolkit.Mvvm.Input;
using LanMountainDesktop.Models;
2026-03-15 17:08:07 +08:00
using LanMountainDesktop.Services;
using LanMountainDesktop.Services.Settings;
2026-03-16 09:50:48 +08:00
using LanMountainDesktop.PluginSdk;
2026-03-15 17:08:07 +08:00
namespace LanMountainDesktop.ViewModels;
public sealed partial class PrivacySettingsPageViewModel : ViewModelBase
{
private readonly ISettingsFacadeService _settingsFacade;
private readonly LocalizationService _localizationService = new();
private readonly string _languageCode;
private bool _isInitializing;
public PrivacySettingsPageViewModel(ISettingsFacadeService settingsFacade)
{
_settingsFacade = settingsFacade;
_languageCode = _localizationService.NormalizeLanguageCode(_settingsFacade.Region.Get().LanguageCode);
RefreshLocalizedText();
_isInitializing = true;
Load();
_isInitializing = false;
}
[ObservableProperty]
private bool _uploadAnonymousCrashData;
[ObservableProperty]
private bool _uploadAnonymousUsageData;
2026-03-16 09:50:48 +08:00
[ObservableProperty]
private string _deviceId = string.Empty;
2026-03-15 17:08:07 +08:00
[ObservableProperty]
private string _privacyHeader = string.Empty;
[ObservableProperty]
private string _crashUploadHeader = string.Empty;
[ObservableProperty]
private string _crashUploadDescription = string.Empty;
[ObservableProperty]
private string _usageUploadHeader = string.Empty;
[ObservableProperty]
private string _usageUploadDescription = string.Empty;
2026-03-16 09:50:48 +08:00
[ObservableProperty]
private string _deviceIdHeader = string.Empty;
[ObservableProperty]
private string _deviceIdDescription = string.Empty;
[ObservableProperty]
private string _refreshDeviceIdText = string.Empty;
2026-03-15 17:08:07 +08:00
public void Load()
{
var state = _settingsFacade.Privacy.Get();
UploadAnonymousCrashData = state.UploadAnonymousCrashData;
UploadAnonymousUsageData = state.UploadAnonymousUsageData;
2026-03-16 09:50:48 +08:00
DeviceId = DeviceIdService.Instance.DeviceId;
}
[RelayCommand]
private void RefreshDeviceId()
{
try
{
var deviceInfo = $"{Environment.MachineName}|{Environment.ProcessorCount}|{Environment.OSVersion}|{Environment.UserName}|{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
using var sha = System.Security.Cryptography.SHA256.Create();
var hash = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(deviceInfo));
var newDeviceId = Convert.ToHexString(hash)[..32].ToLower();
var snapshot = _settingsFacade.Settings.LoadSnapshot<Models.AppSettingsSnapshot>(SettingsScope.App);
snapshot.DeviceId = newDeviceId;
_settingsFacade.Settings.SaveSnapshot(
SettingsScope.App,
snapshot,
changedKeys: [nameof(Models.AppSettingsSnapshot.DeviceId)]);
DeviceId = newDeviceId;
AppLogger.Info("PrivacySettings", $"Device ID refreshed: {newDeviceId}");
}
catch (Exception ex)
{
AppLogger.Warn("PrivacySettings", "Failed to refresh device ID.", ex);
}
2026-03-15 17:08:07 +08:00
}
partial void OnUploadAnonymousCrashDataChanged(bool value)
{
if (_isInitializing)
{
return;
}
Save();
}
partial void OnUploadAnonymousUsageDataChanged(bool value)
{
if (_isInitializing)
{
return;
}
Save();
}
private void Save()
{
_settingsFacade.Privacy.Save(new PrivacySettingsState(
UploadAnonymousCrashData,
UploadAnonymousUsageData));
}
private void RefreshLocalizedText()
{
PrivacyHeader = L("settings.privacy.title", "Privacy");
CrashUploadHeader = L("settings.privacy.crash_upload_title", "Anonymous crash data uploads");
CrashUploadDescription = L("settings.privacy.crash_upload_description", "Help us improve application stability.");
UsageUploadHeader = L("settings.privacy.usage_upload_title", "Anonymous usage data uploads");
UsageUploadDescription = L("settings.privacy.usage_upload_description", "Help us improve application features.");
2026-03-16 09:50:48 +08:00
DeviceIdHeader = L("settings.privacy.device_id_title", "Device ID");
DeviceIdDescription = L("settings.privacy.device_id_description", "Unique identifier for this device. Click refresh to regenerate.");
RefreshDeviceIdText = L("settings.privacy.refresh_device_id", "Refresh");
2026-03-15 17:08:07 +08:00
}
private string L(string key, string fallback)
=> _localizationService.GetString(_languageCode, key, fallback);
}