diff --git a/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs b/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs index b5244bbc0085..4a6065efae59 100644 --- a/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs +++ b/src/settings-ui/Settings.UI.Library/UpdatingSettings.cs @@ -65,6 +65,16 @@ public string NewVersion } public string LastCheckedDateLocalized + { + get + { + var dt = LastCheckedDateTime; + return dt?.ToString(CultureInfo.CurrentCulture) ?? string.Empty; + } + } + + [JsonIgnore] + public DateTime? LastCheckedDateTime { get { @@ -72,18 +82,18 @@ public string LastCheckedDateLocalized { if (LastCheckedDate == null) { - return string.Empty; + return null; } long seconds = long.Parse(LastCheckedDate, CultureInfo.CurrentCulture); var date = DateTimeOffset.FromUnixTimeSeconds(seconds).UtcDateTime; - return date.ToLocalTime().ToString(CultureInfo.CurrentCulture); + return date.ToLocalTime(); } catch (Exception) { } - return string.Empty; + return null; } } diff --git a/src/settings-ui/Settings.UI/Helpers/FriendlyDateHelper.cs b/src/settings-ui/Settings.UI/Helpers/FriendlyDateHelper.cs new file mode 100644 index 000000000000..c3d0f3ef2dc9 --- /dev/null +++ b/src/settings-ui/Settings.UI/Helpers/FriendlyDateHelper.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Globalization; + +namespace Microsoft.PowerToys.Settings.UI.Helpers; + +public static class FriendlyDateHelper +{ + /// + /// Formats a as a friendly relative string. + /// Today → "Today at 1:22 PM", Yesterday → "Yesterday at 3:45 PM", + /// older dates fall back to the full culture-specific date/time format. + /// + public static string Format(DateTime? dateTime) + { + if (dateTime is not DateTime dt) + { + return string.Empty; + } + + var resourceLoader = ResourceLoaderInstance.ResourceLoader; + var today = DateTime.Now.Date; + var time = dt.ToString("t", CultureInfo.CurrentCulture); + + if (dt.Date == today) + { + var fmt = resourceLoader.GetString("General_LastCheckedDate_TodayAt"); + if (!string.IsNullOrEmpty(fmt)) + { + return string.Format(CultureInfo.CurrentCulture, fmt, time); + } + } + + if (dt.Date == today.AddDays(-1)) + { + var fmt = resourceLoader.GetString("General_LastCheckedDate_YesterdayAt"); + if (!string.IsNullOrEmpty(fmt)) + { + return string.Format(CultureInfo.CurrentCulture, fmt, time); + } + } + + return dt.ToString(CultureInfo.CurrentCulture); + } +} diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml index 971e151ea110..af019fc9ff46 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml @@ -72,7 +72,7 @@ - + diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs index 36a20fd34002..8ad96462157c 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs +++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/Dashboard/CheckUpdateControl.xaml.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Services; using Microsoft.PowerToys.Settings.UI.Views; @@ -15,11 +16,14 @@ public sealed partial class CheckUpdateControl : UserControl public UpdatingSettings UpdateSettingsConfig { get; set; } + public string LastCheckedDateFriendly { get; set; } + public CheckUpdateControl() { InitializeComponent(); UpdateSettingsConfig = UpdatingSettings.LoadSettings(); UpdateAvailable = UpdateSettingsConfig != null && (UpdateSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToInstall || UpdateSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToDownload); + LastCheckedDateFriendly = FriendlyDateHelper.Format(UpdateSettingsConfig?.LastCheckedDateTime); } private void SWVersionButtonClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) diff --git a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw index d8c15fa1c25e..f36127908583 100644 --- a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw +++ b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw @@ -1377,6 +1377,14 @@ opera.exe Last checked: + + Today at {0} + Friendly date format when the last update check was today. {0} is the localized short time, e.g. "Today at 1:22 PM". + + + Yesterday at {0} + Friendly date format when the last update check was yesterday. {0} is the localized short time, e.g. "Yesterday at 3:45 PM". + Created at: diff --git a/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs index 5ffc96d6a80a..1f0458a09878 100644 --- a/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs @@ -188,7 +188,7 @@ public GeneralViewModel(ISettingsRepository settingsRepository, _updatingState = UpdatingSettingsConfig.State; _newAvailableVersion = UpdatingSettingsConfig.NewVersion; _newAvailableVersionLink = UpdatingSettingsConfig.ReleasePageLink; - _updateCheckedDate = UpdatingSettingsConfig.LastCheckedDateLocalized; + _updateCheckedDate = FriendlyDateHelper.Format(UpdatingSettingsConfig.LastCheckedDateTime); _newUpdatesToastIsGpoDisabled = GPOWrapper.GetDisableNewUpdateToastValue() == GpoRuleConfigured.Enabled; _autoDownloadUpdatesIsGpoDisabled = GPOWrapper.GetDisableAutomaticUpdateDownloadValue() == GpoRuleConfigured.Enabled; @@ -1383,7 +1383,7 @@ public void RefreshUpdatingState() } else { - bool dateChanged = UpdateCheckedDate == UpdatingSettingsConfig.LastCheckedDateLocalized; + bool dateChanged = UpdateCheckedDate == FriendlyDateHelper.Format(UpdatingSettingsConfig.LastCheckedDateTime); bool fileDownloaded = string.IsNullOrEmpty(UpdatingSettingsConfig.DownloadedInstallerFilename); IsNewVersionDownloading = !(dateChanged || fileDownloaded); } @@ -1391,7 +1391,7 @@ public void RefreshUpdatingState() PowerToysUpdatingState = UpdatingSettingsConfig.State; PowerToysNewAvailableVersion = UpdatingSettingsConfig.NewVersion; PowerToysNewAvailableVersionLink = UpdatingSettingsConfig.ReleasePageLink; - UpdateCheckedDate = UpdatingSettingsConfig.LastCheckedDateLocalized; + UpdateCheckedDate = FriendlyDateHelper.Format(UpdatingSettingsConfig.LastCheckedDateTime); _isNoNetwork = PowerToysUpdatingState == UpdatingSettings.UpdatingState.NetworkError; NotifyPropertyChanged(nameof(IsNoNetwork));