From 576040b1da25fc0d6ea7e7460d39d5898dd7608e Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 5 Sep 2024 08:45:36 +0200 Subject: [PATCH] chore: Adjusting native vs application --- .../ApplicationDataContainer.cs | 4 ++- .../ApplicationDataContainerSettings.cs | 29 ++++++++++++------- .../Internal/INativeApplicationSettings.cs | 6 ++-- .../Internal/NativeApplicationSettings.cs | 15 +++++----- .../NativeApplicationSettings.skia.cs | 17 ++++------- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainer.cs b/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainer.cs index e21d36a26c48..063249e969e7 100644 --- a/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainer.cs +++ b/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainer.cs @@ -16,7 +16,7 @@ namespace Windows.Storage; /// public partial class ApplicationDataContainer : IDisposable { - private const string InternalSettingPrefix = "__"; + internal const string InternalSettingPrefix = "__"; private const string ContainerSeparator = "¬"; private const string ContainerListKey = InternalSettingPrefix + "UnoContainers"; @@ -42,6 +42,8 @@ internal ApplicationDataContainer(ApplicationDataContainer parent, string name) internal string ContainerPath => _parent is null ? "" : _parent.ContainerPath + InternalSettingPrefix + Name + ContainerSeparator; + internal string GetSettingKey(string key) => ContainerPath + key; + public ApplicationDataLocality Locality { get; } public string Name { get; } diff --git a/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainerSettings.cs b/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainerSettings.cs index e2fb34f760ed..f17580d236f8 100644 --- a/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainerSettings.cs +++ b/src/Uno.UWP/Storage/ApplicationData/ApplicationDataContainerSettings.cs @@ -1,6 +1,8 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; +using Uno.Extensions.Specialized; using Uno.Storage; using Windows.Foundation.Collections; @@ -36,8 +38,8 @@ internal ApplicationDataContainerSettings(ApplicationDataContainer container, Ap /// public object this[string key] { - get => _nativeApplicationSettings[key]; - set => _nativeApplicationSettings[key] = value; + get => _nativeApplicationSettings[_container.GetSettingKey(key)]; + set => _nativeApplicationSettings[_container.GetSettingKey(key)] = value; } /// @@ -49,19 +51,22 @@ public int Count { get { - throw new global::System.NotSupportedException(); + // Public settings count is equal to the total number of settings in the container excluding internal settings. + var allSettingsCount = _nativeApplicationSettings.GetKeysWithPrefix(_container.ContainerPath).Count(); + var internalSettingsPath = _container.GetSettingKey(ApplicationDataContainer.InternalSettingPrefix); + var internalSettingsCount = _nativeApplicationSettings.GetKeysWithPrefix(internalSettingsPath).Count(); + + return allSettingsCount - internalSettingsCount; } } public bool IsReadOnly => false; - public global::System.Collections.Generic.ICollection Keys - { - get - { - throw new global::System.NotSupportedException(); - } - } + public ICollection Keys => _nativeApplicationSettings + .GetKeysWithPrefix(_container.ContainerPath) + .Except( + _nativeApplicationSettings.GetKeysWithPrefix(_container.GetSettingKey(ApplicationDataContainer.InternalSettingPrefix)) + ); public global::System.Collections.Generic.ICollection Values { @@ -139,4 +144,8 @@ internal void ClearIncludingInternal() } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + private object DeserializeValue(string value) => DataTypeSerializer.Deserialize(value); + + private string SerializeValue(object value) => DataTypeSerializer.Serialize(value); } diff --git a/src/Uno.UWP/Storage/ApplicationData/Internal/INativeApplicationSettings.cs b/src/Uno.UWP/Storage/ApplicationData/Internal/INativeApplicationSettings.cs index f51912f4e978..f7e81e358ba8 100644 --- a/src/Uno.UWP/Storage/ApplicationData/Internal/INativeApplicationSettings.cs +++ b/src/Uno.UWP/Storage/ApplicationData/Internal/INativeApplicationSettings.cs @@ -9,6 +9,8 @@ namespace Uno.Storage; internal interface INativeApplicationSettings { object this[string key] { get; set; } - ICollection Keys { get; } - ICollection Values { get; } + + IEnumerable Keys { get; } + + } diff --git a/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.cs b/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.cs index 1a6a4bda1cb8..94403ef71fe5 100644 --- a/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.cs +++ b/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Linq; using Windows.Storage; @@ -45,7 +44,7 @@ public object? this[string key] { if (TryGetSetting(key, out var value)) { - return DataTypeSerializer.Deserialize(value); + return DeserializeValue(value); } return null; @@ -54,7 +53,7 @@ public object? this[string key] { if (value is not null) { - SetSetting(key, DataTypeSerializer.Serialize(value)); + SetSetting(key, SerializeValue(value)); } else { @@ -67,8 +66,10 @@ public object? this[string key] private partial bool TryGetSetting(string key, out string? value); - internal IEnumerable GetKeysWithPrefix(string prefix) - { - return Keys.Where(kvp => kvp.StartsWith(prefix, StringComparison.InvariantCulture)); - } + internal IEnumerable GetKeysWithPrefix(string prefix) => + Keys.Where(kvp => kvp.StartsWith(prefix, StringComparison.InvariantCulture)); + + private object? DeserializeValue(string? value) => DataTypeSerializer.Deserialize(value); + + private string SerializeValue(object value) => DataTypeSerializer.Serialize(value); } diff --git a/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.skia.cs b/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.skia.cs index 994340deb157..5877687a65d6 100644 --- a/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.skia.cs +++ b/src/Uno.UWP/Storage/ApplicationData/Internal/NativeApplicationSettings.skia.cs @@ -1,11 +1,11 @@ -using System; +#nullable enable + +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -#nullable enable - using Uno.Foundation.Logging; using Windows.Storage; @@ -16,8 +16,8 @@ partial class NativeApplicationSettings private static partial bool SupportsLocality() => true; private readonly Dictionary _values = new(); - private string _folderPath; - private string _filePath; + private string _folderPath = null!; + private string _filePath = null!; partial void InitializePlatform() { @@ -31,12 +31,6 @@ partial void InitializePlatform() public ICollection Keys => _values.Keys; - public ICollection Values - => _values.Values.Select(DataTypeSerializer.Deserialize).ToList(); - - public int Count - => _values.Count; - public void Add(string key, object value) { if (ContainsKey(key)) @@ -94,7 +88,6 @@ private void ReadFromFile() { try { - if (File.Exists(_filePath)) { using (var reader = new BinaryReader(File.OpenRead(_filePath)))