From 648b1b35855e5625dac1a173748e4c2400c2b10b Mon Sep 17 00:00:00 2001 From: David Britch Date: Tue, 16 Jan 2018 17:21:53 +0000 Subject: [PATCH] Android settings implementation. --- .../ISettingsServiceImplementation.cs | 2 - .../Services/SettingsServiceImplementation.cs | 145 ++++++++++++++++++ .../eShopOnContainers.Droid.csproj | 4 + .../Services/SettingsServiceImplementation.cs | 52 +------ 4 files changed, 154 insertions(+), 49 deletions(-) create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs index cd880c2d4..ef9d14ed6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs @@ -9,7 +9,5 @@ bool AddOrUpdateValue(string key, string value); void Remove(string key); - void Clear(); - bool Contains(string key); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs new file mode 100644 index 000000000..020237d93 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs @@ -0,0 +1,145 @@ +using System; +using eShopOnContainers.Core.Services.Settings; +using Android.App; +using Android.Content; +using Android.Preferences; +using eShopOnContainers.Droid.Services; + +[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] +namespace eShopOnContainers.Droid.Services +{ + public class SettingsServiceImplementation : ISettingsServiceImplementation + { + readonly object _locker = new object(); + + ISharedPreferences GetSharedPreference() + { + return PreferenceManager.GetDefaultSharedPreferences(Application.Context); + } + + bool AddOrUpdateValueInternal(string key, T value) + { + if (Application.Context == null) + return false; + + if (value == null) + { + Remove(key); + return true; + } + + var type = typeof(T); + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + type = Nullable.GetUnderlyingType(type); + } + var typeCode = Type.GetTypeCode(type); + + lock (_locker) + { + using (var sharedPrefs = GetSharedPreference()) + { + using (var editor = sharedPrefs.Edit()) + { + switch (typeCode) + { + case TypeCode.Boolean: + editor.PutBoolean(key, Convert.ToBoolean(value)); + break; + case TypeCode.String: + editor.PutString(key, Convert.ToString(value)); + break; + default: + throw new ArgumentException($"Value of type {typeCode} is not supported."); + } + editor.Commit(); + } + } + } + return true; + } + + T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) + { + if (Application.Context == null) + return defaultValue; + + if (!Contains(key)) + return defaultValue; + + lock (_locker) + { + using (var sharedPrefs = GetSharedPreference()) + { + var type = typeof(T); + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + type = Nullable.GetUnderlyingType(type); + } + + object value = null; + var typeCode = Type.GetTypeCode(type); + switch (typeCode) + { + case TypeCode.Boolean: + value = sharedPrefs.GetBoolean(key, Convert.ToBoolean(defaultValue)); + break; + case TypeCode.String: + value = sharedPrefs.GetString(key, Convert.ToString(defaultValue)); + break; + default: + throw new ArgumentException($"Value of type {typeCode} is not supported."); + } + + return null != value ? (T)value : defaultValue; + } + } + } + + bool Contains(string key) + { + if (Application.Context == null) + return false; + + lock (_locker) + { + using (var sharedPrefs = GetSharedPreference()) + { + if (sharedPrefs == null) + return false; + return sharedPrefs.Contains(key); + } + } + } + + #region ISettingsServiceImplementation + + public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); + + public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value); + + public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue); + + public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue); + + public void Remove(string key) + { + if (Application.Context == null) + return; + + lock (_locker) + { + using (var sharedPrefs = GetSharedPreference()) + { + using (var editor = sharedPrefs.Edit()) + { + editor.Remove(key); + editor.Commit(); + } + } + } + } + + #endregion + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj index c4ded3bbf..18c325634 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj @@ -226,6 +226,7 @@ + @@ -379,6 +380,9 @@ eShopOnContainers.Core + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs index 429f367b7..88c3ad824 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs @@ -8,7 +8,7 @@ namespace eShopOnContainers.iOS.Services { public class SettingsServiceImplementation : ISettingsServiceImplementation { - readonly object locker = new object(); + readonly object _locker = new object(); NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults; @@ -27,7 +27,7 @@ namespace eShopOnContainers.iOS.Services } var typeCode = Type.GetTypeCode(type); - lock (locker) + lock (_locker) { var defaults = GetUserDefaults(); switch (typeCode) @@ -56,7 +56,7 @@ namespace eShopOnContainers.iOS.Services T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) { - lock (locker) + lock (_locker) { var defaults = GetUserDefaults(); @@ -89,7 +89,7 @@ namespace eShopOnContainers.iOS.Services } } - #region ISettingsService Implementation + #region ISettingsServiceImplementation public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); @@ -101,7 +101,7 @@ namespace eShopOnContainers.iOS.Services public void Remove(string key) { - lock (locker) + lock (_locker) { var defaults = GetUserDefaults(); try @@ -119,48 +119,6 @@ namespace eShopOnContainers.iOS.Services } } - public void Clear() - { - lock (locker) - { - var defaults = GetUserDefaults(); - try - { - var items = defaults.ToDictionary(); - foreach (var item in items.Keys) - { - if (item is NSString nsString) - { - defaults.RemoveObject(nsString); - } - } - defaults.Synchronize(); - } - catch (Exception ex) - { - Console.WriteLine("Unable to clear all defaults. Message: " + ex.Message); - } - } - } - - public bool Contains(string key) - { - lock (locker) - { - var defaults = GetUserDefaults(); - try - { - var setting = defaults[key]; - return setting != null; - } - catch (Exception ex) - { - Console.WriteLine("Unable to clear all defaults. Message: " + ex.Message); - } - return false; - } - } - #endregion } }