Android settings implementation.

This commit is contained in:
David Britch 2018-01-16 17:21:53 +00:00
parent a86a11694a
commit 648b1b3585
4 changed files with 154 additions and 49 deletions

View File

@ -9,7 +9,5 @@
bool AddOrUpdateValue(string key, string value); bool AddOrUpdateValue(string key, string value);
void Remove(string key); void Remove(string key);
void Clear();
bool Contains(string key);
} }
} }

View File

@ -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<T>(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<T>(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
}
}

View File

@ -226,6 +226,7 @@
<Compile Include="Effects\CircleEffect.cs" /> <Compile Include="Effects\CircleEffect.cs" />
<Compile Include="Effects\BaseContainerEffect.cs" /> <Compile Include="Effects\BaseContainerEffect.cs" />
<Compile Include="Activities\SplashActivity.cs" /> <Compile Include="Activities\SplashActivity.cs" />
<Compile Include="Services\SettingsServiceImplementation.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidAsset Include="..\CommonResources\Fonts\Montserrat-Bold.ttf"> <AndroidAsset Include="..\CommonResources\Fonts\Montserrat-Bold.ttf">
@ -379,6 +380,9 @@
<Name>eShopOnContainers.Core</Name> <Name>eShopOnContainers.Core</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Services\" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" /> <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Import Project="..\..\..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets')" /> <Import Project="..\..\..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets')" />
<Import Project="..\..\..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets')" /> <Import Project="..\..\..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets')" />

View File

@ -8,7 +8,7 @@ namespace eShopOnContainers.iOS.Services
{ {
public class SettingsServiceImplementation : ISettingsServiceImplementation public class SettingsServiceImplementation : ISettingsServiceImplementation
{ {
readonly object locker = new object(); readonly object _locker = new object();
NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults; NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults;
@ -27,7 +27,7 @@ namespace eShopOnContainers.iOS.Services
} }
var typeCode = Type.GetTypeCode(type); var typeCode = Type.GetTypeCode(type);
lock (locker) lock (_locker)
{ {
var defaults = GetUserDefaults(); var defaults = GetUserDefaults();
switch (typeCode) switch (typeCode)
@ -56,7 +56,7 @@ namespace eShopOnContainers.iOS.Services
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T)) T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))
{ {
lock (locker) lock (_locker)
{ {
var defaults = GetUserDefaults(); 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); public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);
@ -101,7 +101,7 @@ namespace eShopOnContainers.iOS.Services
public void Remove(string key) public void Remove(string key)
{ {
lock (locker) lock (_locker)
{ {
var defaults = GetUserDefaults(); var defaults = GetUserDefaults();
try 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 #endregion
} }
} }