diff --git a/src/modules/poweraccent/PowerAccent.Core/Models/UsageInfoData.cs b/src/modules/poweraccent/PowerAccent.Core/Models/UsageInfoData.cs new file mode 100644 index 000000000000..322e4eae7925 --- /dev/null +++ b/src/modules/poweraccent/PowerAccent.Core/Models/UsageInfoData.cs @@ -0,0 +1,13 @@ +// 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. + +namespace PowerAccent.Core.Models +{ + public class UsageInfoData + { + public Dictionary CharacterUsageCounters { get; set; } = []; + + public Dictionary CharacterUsageTimestamp { get; set; } = []; + } +} diff --git a/src/modules/poweraccent/PowerAccent.Core/PowerAccent.cs b/src/modules/poweraccent/PowerAccent.Core/PowerAccent.cs index c2f0698f257a..fa020ee4fe55 100644 --- a/src/modules/poweraccent/PowerAccent.Core/PowerAccent.cs +++ b/src/modules/poweraccent/PowerAccent.Core/PowerAccent.cs @@ -117,8 +117,8 @@ private string[] GetCharacters(LetterKey letterKey) if (_settingService.SortByUsageFrequency) { characters = characters.OrderByDescending(character => _usageInfo.GetUsageFrequency(character)) - .ThenByDescending(character => _usageInfo.GetLastUsageTimestamp(character)). - ToArray(); + .ThenByDescending(character => _usageInfo.GetLastUsageTimestamp(character)) + .ToArray(); } else if (!_usageInfo.Empty()) { @@ -337,6 +337,14 @@ public Position GetToolbarPosition() return _settingService.Position; } + public void SaveUsageInfo() + { + if (_settingService.SortByUsageFrequency) + { + _usageInfo.Save(); + } + } + public void Dispose() { _keyboardListener.UnInitHook(); diff --git a/src/modules/poweraccent/PowerAccent.Core/SerializationContext/SourceGenerationContext.cs b/src/modules/poweraccent/PowerAccent.Core/SerializationContext/SourceGenerationContext.cs index e682aa7b63b6..55fdd144a1c7 100644 --- a/src/modules/poweraccent/PowerAccent.Core/SerializationContext/SourceGenerationContext.cs +++ b/src/modules/poweraccent/PowerAccent.Core/SerializationContext/SourceGenerationContext.cs @@ -3,12 +3,14 @@ // See the LICENSE file in the project root for more information. using System.Text.Json.Serialization; +using PowerAccent.Core.Models; using PowerAccent.Core.Services; namespace PowerAccent.Core.SerializationContext; [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(SettingsService))] +[JsonSerializable(typeof(UsageInfoData))] public partial class SourceGenerationContext : JsonSerializerContext { } diff --git a/src/modules/poweraccent/PowerAccent.Core/Tools/CharactersUsageInfo.cs b/src/modules/poweraccent/PowerAccent.Core/Tools/CharactersUsageInfo.cs index 07a448bbe081..5a1df2d1ff3e 100644 --- a/src/modules/poweraccent/PowerAccent.Core/Tools/CharactersUsageInfo.cs +++ b/src/modules/poweraccent/PowerAccent.Core/Tools/CharactersUsageInfo.cs @@ -2,12 +2,27 @@ // 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.IO; +using System.Text.Json; +using Microsoft.PowerToys.Settings.UI.Library; +using PowerAccent.Core.Models; +using PowerAccent.Core.SerializationContext; + namespace PowerAccent.Core.Tools { public class CharactersUsageInfo { - private Dictionary _characterUsageCounters = new Dictionary(); - private Dictionary _characterUsageTimestamp = new Dictionary(); + private readonly string _filePath; + private readonly Dictionary _characterUsageCounters; + private readonly Dictionary _characterUsageTimestamp; + + public CharactersUsageInfo() + { + _filePath = new SettingsUtils().GetSettingsFilePath(PowerAccentSettings.ModuleName, "UsageInfo.json"); + var data = GetUsageInfoData(); + _characterUsageCounters = data.CharacterUsageCounters; + _characterUsageTimestamp = data.CharacterUsageTimestamp; + } public bool Empty() { @@ -18,19 +33,18 @@ public void Clear() { _characterUsageCounters.Clear(); _characterUsageTimestamp.Clear(); + Delete(); } public uint GetUsageFrequency(string character) { _characterUsageCounters.TryGetValue(character, out uint frequency); - return frequency; } public long GetLastUsageTimestamp(string character) { _characterUsageTimestamp.TryGetValue(character, out long timestamp); - return timestamp; } @@ -47,5 +61,36 @@ public void IncrementUsageFrequency(string character) _characterUsageTimestamp[character] = DateTimeOffset.Now.ToUnixTimeSeconds(); } + + public void Save() + { + var data = new UsageInfoData + { + CharacterUsageCounters = _characterUsageCounters, + CharacterUsageTimestamp = _characterUsageTimestamp, + }; + + var json = JsonSerializer.Serialize(data, SourceGenerationContext.Default.UsageInfoData); + File.WriteAllText(_filePath, json); + } + + public void Delete() + { + if (File.Exists(_filePath)) + { + File.Delete(_filePath); + } + } + + private UsageInfoData GetUsageInfoData() + { + if (!File.Exists(_filePath)) + { + return new UsageInfoData(); + } + + var json = File.ReadAllText(_filePath); + return JsonSerializer.Deserialize(json, SourceGenerationContext.Default.UsageInfoData); + } } } diff --git a/src/modules/poweraccent/PowerAccent.UI/Selector.xaml.cs b/src/modules/poweraccent/PowerAccent.UI/Selector.xaml.cs index 529d4552e147..87bc11a91347 100644 --- a/src/modules/poweraccent/PowerAccent.UI/Selector.xaml.cs +++ b/src/modules/poweraccent/PowerAccent.UI/Selector.xaml.cs @@ -96,6 +96,7 @@ private void SetWindowPosition() protected override void OnClosed(EventArgs e) { + _powerAccent.SaveUsageInfo(); _powerAccent.Dispose(); base.OnClosed(e); }