Browse Source

Android settings implementation.

pull/469/head
David Britch 7 years ago
parent
commit
648b1b3585
4 changed files with 154 additions and 49 deletions
  1. +0
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs
  2. +145
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs
  3. +4
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj
  4. +5
    -47
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs

+ 0
- 2
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs View File

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

+ 145
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs 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
}
}

+ 4
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj View File

@ -226,6 +226,7 @@
<Compile Include="Effects\CircleEffect.cs" />
<Compile Include="Effects\BaseContainerEffect.cs" />
<Compile Include="Activities\SplashActivity.cs" />
<Compile Include="Services\SettingsServiceImplementation.cs" />
</ItemGroup>
<ItemGroup>
<AndroidAsset Include="..\CommonResources\Fonts\Montserrat-Bold.ttf">
@ -379,6 +380,9 @@
<Name>eShopOnContainers.Core</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Services\" />
</ItemGroup>
<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.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')" />


+ 5
- 47
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs View File

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

Loading…
Cancel
Save