From e358099bcc18362dd862a25d74752a4252a1a57f Mon Sep 17 00:00:00 2001 From: David Britch Date: Tue, 16 Jan 2018 15:02:18 +0000 Subject: [PATCH 1/8] Work in progress. --- .../eShopOnContainers.Core/App.xaml.cs | 28 +-- .../Services/Basket/BasketService.cs | 14 +- .../Services/Catalog/CatalogService.cs | 33 ++-- .../Services/Dependency/DependencyService.cs | 10 + .../Services/Dependency/IDependencyService.cs | 7 + .../FixUri/FixUriService.cs} | 32 ++-- .../Services/FixUri/IFixUriService.cs | 14 ++ .../Services/Marketing/CampaignService.cs | 17 +- .../Services/Navigation/NavigationService.cs | 70 ++++--- .../Services/Settings/ISettingsService.cs | 14 ++ .../ISettingsServiceImplementation.cs | 15 ++ .../Settings/SettingsService.cs} | 58 +++--- .../ViewModels/Base/ViewModelBase.cs | 3 +- .../ViewModels/Base/ViewModelLocator.cs | 180 +++++++++--------- .../ViewModels/BasketViewModel.cs | 18 +- .../ViewModels/CampaignDetailsViewModel.cs | 17 +- .../ViewModels/CampaignViewModel.cs | 13 +- .../ViewModels/CheckoutViewModel.cs | 23 ++- .../ViewModels/LoginViewModel.cs | 51 ++--- .../ViewModels/OrderDetailViewModel.cs | 15 +- .../ViewModels/ProfileViewModel.cs | 11 +- .../ViewModels/SettingsViewModel.cs | 105 +++++----- .../eShopOnContainers.Core.csproj | 6 +- .../Helpers/Settings.cs | 44 ----- .../eShopOnContainers.Droid.csproj | 7 - .../eShopOnContainers.Droid/packages.config | 1 - .../Helpers/Settings.cs | 44 ----- .../eShopOnContainers.TestRunner.Droid.csproj | 7 - .../packages.config | 1 - .../Helpers/Settings.cs | 44 ----- .../eShopOnContainers.TestRunner.iOS.csproj | 7 - .../packages.config | 1 - .../eShopOnContainers.iOS/Helpers/Settings.cs | 44 ----- .../Services/SettingsServiceImplementation.cs | 164 ++++++++++++++++ .../eShopOnContainers.iOS.csproj | 11 +- .../eShopOnContainers.iOS/packages.config | 1 - 36 files changed, 585 insertions(+), 545 deletions(-) create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/DependencyService.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/IDependencyService.cs rename src/Mobile/eShopOnContainers/eShopOnContainers.Core/{Helpers/ServicesHelper.cs => Services/FixUri/FixUriService.cs} (76%) create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/IFixUriService.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs rename src/Mobile/eShopOnContainers/eShopOnContainers.Core/{Helpers/Settings.cs => Services/Settings/SettingsService.cs} (58%) delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Helpers/Settings.cs delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Helpers/Settings.cs delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Helpers/Settings.cs delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Helpers/Settings.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs index 61b51eb99..076ad16e5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs @@ -1,5 +1,4 @@ using System.Globalization; -using eShopOnContainers.Core.Helpers; using eShopOnContainers.Services; using eShopOnContainers.Core.ViewModels.Base; using System.Threading.Tasks; @@ -8,20 +7,21 @@ using eShopOnContainers.Core.Services.Location; using Plugin.Geolocator; using Xamarin.Forms; using Xamarin.Forms.Xaml; +using eShopOnContainers.Core.Services.Settings; [assembly: XamlCompilation(XamlCompilationOptions.Compile)] namespace eShopOnContainers { public partial class App : Application { - public bool UseMockServices { get; set; } + ISettingsService _settingsService; + bool _useMockServices; public App() { InitializeComponent(); InitApp(); - if (Device.RuntimePlatform == Device.UWP) { InitNavigation(); @@ -30,8 +30,9 @@ namespace eShopOnContainers private void InitApp() { - UseMockServices = Settings.UseMocks; - ViewModelLocator.RegisterDependencies(UseMockServices); + _useMockServices = true;//_settingsService.UseMocks; + ViewModelLocator.RegisterDependencies(_useMockServices); + _settingsService = ViewModelLocator.Resolve(); } private Task InitNavigation() @@ -49,12 +50,12 @@ namespace eShopOnContainers await InitNavigation(); } - if (Settings.AllowGpsLocation && !Settings.UseFakeLocation) + if (_settingsService.AllowGpsLocation && !_settingsService.UseFakeLocation) { await GetGpsLocation(); } - if (!Settings.UseMocks && !string.IsNullOrEmpty(Settings.AuthAccessToken)) + if (!_settingsService.UseMocks && !string.IsNullOrEmpty(_settingsService.AuthAccessToken)) { await SendCurrentLocation(); } @@ -78,12 +79,12 @@ namespace eShopOnContainers var position = await locator.GetPositionAsync(); - Settings.Latitude = position.Latitude.ToString(); - Settings.Longitude = position.Longitude.ToString(); + _settingsService.Latitude = position.Latitude.ToString(); + _settingsService.Longitude = position.Longitude.ToString(); } else { - Settings.AllowGpsLocation = false; + _settingsService.AllowGpsLocation = false; } } @@ -91,13 +92,12 @@ namespace eShopOnContainers { var location = new Location { - Latitude = double.Parse(Settings.Latitude, CultureInfo.InvariantCulture), - Longitude = double.Parse(Settings.Longitude, CultureInfo.InvariantCulture) + Latitude = double.Parse(_settingsService.Latitude, CultureInfo.InvariantCulture), + Longitude = double.Parse(_settingsService.Longitude, CultureInfo.InvariantCulture) }; var locationService = ViewModelLocator.Resolve(); - await locationService.UpdateUserLocation(location, - Settings.AuthAccessToken); + await locationService.UpdateUserLocation(location, _settingsService.AuthAccessToken); } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs index 1d41584c4..54f3a03bc 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs @@ -2,18 +2,21 @@ using System.Threading.Tasks; using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Models.Basket; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.FixUri; namespace eShopOnContainers.Core.Services.Basket { public class BasketService : IBasketService { private readonly IRequestProvider _requestProvider; + private readonly IFixUriService _fixUriService; + private const string ApiUrlBase = "api/v1/basket"; - public BasketService(IRequestProvider requestProvider) + public BasketService(IRequestProvider requestProvider, IFixUriService fixUriService) { _requestProvider = requestProvider; + _fixUriService = fixUriService; } public async Task GetBasketAsync(string guidUser, string token) @@ -28,8 +31,7 @@ namespace eShopOnContainers.Core.Services.Basket CustomerBasket basket = await _requestProvider.GetAsync(uri, token); - ServicesHelper.FixBasketItemPictureUri(basket?.Items); - + _fixUriService.FixBasketItemPictureUri(basket?.Items); return basket; } @@ -41,9 +43,7 @@ namespace eShopOnContainers.Core.Services.Basket }; var uri = builder.ToString(); - var result = await _requestProvider.PostAsync(uri, customerBasket, token); - return result; } @@ -55,7 +55,6 @@ namespace eShopOnContainers.Core.Services.Basket }; var uri = builder.ToString(); - await _requestProvider.PostAsync(uri, basketCheckout, token); } @@ -67,7 +66,6 @@ namespace eShopOnContainers.Core.Services.Basket }; var uri = builder.ToString(); - await _requestProvider.DeleteAsync(uri, token); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs index 40807b2f5..2e63e9516 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs @@ -5,29 +5,28 @@ using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Extensions; using System.Collections.Generic; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.FixUri; namespace eShopOnContainers.Core.Services.Catalog { public class CatalogService : ICatalogService { private readonly IRequestProvider _requestProvider; + private readonly IFixUriService _fixUriService; - public CatalogService(IRequestProvider requestProvider) + public CatalogService(IRequestProvider requestProvider, IFixUriService fixUriService) { _requestProvider = requestProvider; + _fixUriService = fixUriService; } public async Task> FilterAsync(int catalogBrandId, int catalogTypeId) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = string.Format("api/v1/catalog/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId); - string uri = builder.ToString(); - CatalogRoot catalog = - await _requestProvider.GetAsync(uri); + CatalogRoot catalog = await _requestProvider.GetAsync(uri); if (catalog?.Data != null) return catalog?.Data.ToObservableCollection(); @@ -38,34 +37,27 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogAsync() { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = "api/v1/catalog/items"; - string uri = builder.ToString(); - CatalogRoot catalog = - await _requestProvider.GetAsync(uri); + CatalogRoot catalog = await _requestProvider.GetAsync(uri); if (catalog?.Data != null) { - ServicesHelper.FixCatalogItemPictureUri(catalog?.Data); - + _fixUriService.FixCatalogItemPictureUri(catalog?.Data); return catalog?.Data.ToObservableCollection(); } else - return new ObservableCollection(); + return new ObservableCollection(); } public async Task> GetCatalogBrandAsync() { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = "api/v1/catalog/catalogbrands"; - string uri = builder.ToString(); - IEnumerable brands = - await _requestProvider.GetAsync>(uri); + IEnumerable brands = await _requestProvider.GetAsync>(uri); if (brands != null) return brands?.ToObservableCollection(); @@ -76,18 +68,15 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogTypeAsync() { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = "api/v1/catalog/catalogtypes"; - string uri = builder.ToString(); - IEnumerable types = - await _requestProvider.GetAsync>(uri); + IEnumerable types = await _requestProvider.GetAsync>(uri); if (types != null) return types.ToObservableCollection(); else - return new ObservableCollection(); + return new ObservableCollection(); } } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/DependencyService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/DependencyService.cs new file mode 100644 index 000000000..3076c8572 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/DependencyService.cs @@ -0,0 +1,10 @@ +namespace eShopOnContainers.Core.Services.Dependency +{ + public class DependencyService : IDependencyService + { + public T Get() where T : class + { + return Xamarin.Forms.DependencyService.Get(); + } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/IDependencyService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/IDependencyService.cs new file mode 100644 index 000000000..53c2ccb4e --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Dependency/IDependencyService.cs @@ -0,0 +1,7 @@ +namespace eShopOnContainers.Core.Services.Dependency +{ + public interface IDependencyService + { + T Get() where T : class; + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/FixUriService.cs similarity index 76% rename from src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs rename to src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/FixUriService.cs index 2d6a53b2c..06cfaeae3 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/FixUriService.cs @@ -6,14 +6,22 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Text.RegularExpressions; +using eShopOnContainers.Core.Services.Settings; -namespace eShopOnContainers.Core.Helpers +namespace eShopOnContainers.Core.Services.FixUri { - public static class ServicesHelper + public class FixUriService : IFixUriService { - private static Regex IpRegex = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); + private readonly ISettingsService _settingsService; - public static void FixCatalogItemPictureUri(IEnumerable catalogItems) + private Regex IpRegex = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); + + public FixUriService(ISettingsService settingsService) + { + _settingsService = settingsService; + } + + public void FixCatalogItemPictureUri(IEnumerable catalogItems) { if (catalogItems == null) { @@ -23,12 +31,12 @@ namespace eShopOnContainers.Core.Helpers try { if (!ViewModelLocator.UseMockService - && Settings.UrlBase != GlobalSetting.DefaultEndpoint) + && _settingsService.UrlBase != GlobalSetting.DefaultEndpoint) { foreach (var catalogItem in catalogItems) { MatchCollection serverResult = IpRegex.Matches(catalogItem.PictureUri); - MatchCollection localResult = IpRegex.Matches(Settings.UrlBase); + MatchCollection localResult = IpRegex.Matches(_settingsService.UrlBase); if (serverResult.Count != -1 && localResult.Count != -1) { @@ -46,7 +54,7 @@ namespace eShopOnContainers.Core.Helpers } } - public static void FixBasketItemPictureUri(IEnumerable basketItems) + public void FixBasketItemPictureUri(IEnumerable basketItems) { if (basketItems == null) { @@ -56,12 +64,12 @@ namespace eShopOnContainers.Core.Helpers try { if (!ViewModelLocator.UseMockService - && Settings.UrlBase != GlobalSetting.DefaultEndpoint) + && _settingsService.UrlBase != GlobalSetting.DefaultEndpoint) { foreach (var basketItem in basketItems) { MatchCollection serverResult = IpRegex.Matches(basketItem.PictureUrl); - MatchCollection localResult = IpRegex.Matches(Settings.UrlBase); + MatchCollection localResult = IpRegex.Matches(_settingsService.UrlBase); if (serverResult.Count != -1 && localResult.Count != -1) { @@ -78,7 +86,7 @@ namespace eShopOnContainers.Core.Helpers } } - public static void FixCampaignItemPictureUri(IEnumerable campaignItems) + public void FixCampaignItemPictureUri(IEnumerable campaignItems) { if (campaignItems == null) { @@ -88,12 +96,12 @@ namespace eShopOnContainers.Core.Helpers try { if (!ViewModelLocator.UseMockService - && Settings.UrlBase != GlobalSetting.DefaultEndpoint) + && _settingsService.UrlBase != GlobalSetting.DefaultEndpoint) { foreach (var campaignItem in campaignItems) { MatchCollection serverResult = IpRegex.Matches(campaignItem.PictureUri); - MatchCollection localResult = IpRegex.Matches(Settings.UrlBase); + MatchCollection localResult = IpRegex.Matches(_settingsService.UrlBase); if (serverResult.Count != -1 && localResult.Count != -1) { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/IFixUriService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/IFixUriService.cs new file mode 100644 index 000000000..901c7af86 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/FixUri/IFixUriService.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Models.Catalog; +using eShopOnContainers.Core.Models.Marketing; + +namespace eShopOnContainers.Core.Services.FixUri +{ + public interface IFixUriService + { + void FixCatalogItemPictureUri(IEnumerable catalogItems); + void FixBasketItemPictureUri(IEnumerable basketItems); + void FixCampaignItemPictureUri(IEnumerable campaignItems); + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs index 8d6cdeb6b..7c3ab859e 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs @@ -4,34 +4,32 @@ using System.Threading.Tasks; using eShopOnContainers.Core.Models.Marketing; using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Extensions; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.FixUri; namespace eShopOnContainers.Core.Services.Marketing { public class CampaignService : ICampaignService { private readonly IRequestProvider _requestProvider; + private readonly IFixUriService _fixUriService; - public CampaignService(IRequestProvider requestProvider) + public CampaignService(IRequestProvider requestProvider, IFixUriService fixUriService) { _requestProvider = requestProvider; + _fixUriService = fixUriService; } public async Task> GetAllCampaignsAsync(string token) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.MarketingEndpoint); - builder.Path = "api/v1/campaigns/user"; - string uri = builder.ToString(); - CampaignRoot campaign = - await _requestProvider.GetAsync(uri, token); + CampaignRoot campaign = await _requestProvider.GetAsync(uri, token); if (campaign?.Data != null) { - ServicesHelper.FixCampaignItemPictureUri(campaign?.Data); - + _fixUriService.FixCampaignItemPictureUri(campaign?.Data); return campaign?.Data.ToObservableCollection(); } @@ -41,11 +39,8 @@ namespace eShopOnContainers.Core.Services.Marketing public async Task GetCampaignByIdAsync(int campaignId, string token) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.MarketingEndpoint); - builder.Path = $"api/v1/campaigns/{campaignId}"; - string uri = builder.ToString(); - return await _requestProvider.GetAsync(uri, token); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs index d9ec0be89..d8308428a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs @@ -7,24 +7,32 @@ using System.Globalization; using System.Reflection; using System.Threading.Tasks; using Xamarin.Forms; +using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Services { public class NavigationService : INavigationService { - public ViewModelBase PreviousPageViewModel - { - get - { - var mainPage = Application.Current.MainPage as CustomNavigationView; - var viewModel = mainPage.Navigation.NavigationStack[mainPage.Navigation.NavigationStack.Count - 2].BindingContext; - return viewModel as ViewModelBase; - } - } + private readonly ISettingsService _settingsService; + + public ViewModelBase PreviousPageViewModel + { + get + { + var mainPage = Application.Current.MainPage as CustomNavigationView; + var viewModel = mainPage.Navigation.NavigationStack[mainPage.Navigation.NavigationStack.Count - 2].BindingContext; + return viewModel as ViewModelBase; + } + } + + public NavigationService(ISettingsService settingsService) + { + _settingsService = settingsService; + } public Task InitializeAsync() { - if(string.IsNullOrEmpty(Settings.AuthAccessToken)) + if (string.IsNullOrEmpty(_settingsService.AuthAccessToken)) return NavigateToAsync(); else return NavigateToAsync(); @@ -78,7 +86,7 @@ namespace eShopOnContainers.Services Application.Current.MainPage = new CustomNavigationView(page); } else - { + { var navigationPage = Application.Current.MainPage as CustomNavigationView; if (navigationPage != null) { @@ -93,25 +101,25 @@ namespace eShopOnContainers.Services await (page.BindingContext as ViewModelBase).InitializeAsync(parameter); } - private Type GetPageTypeForViewModel(Type viewModelType) - { - var viewName = viewModelType.FullName.Replace("Model", string.Empty); - var viewModelAssemblyName = viewModelType.GetTypeInfo().Assembly.FullName; - var viewAssemblyName = string.Format(CultureInfo.InvariantCulture, "{0}, {1}", viewName, viewModelAssemblyName); - var viewType = Type.GetType(viewAssemblyName); - return viewType; - } - - private Page CreatePage(Type viewModelType, object parameter) - { - Type pageType = GetPageTypeForViewModel(viewModelType); - if (pageType == null) - { - throw new Exception($"Cannot locate page type for {viewModelType}"); - } - - Page page = Activator.CreateInstance(pageType) as Page; - return page; - } + private Type GetPageTypeForViewModel(Type viewModelType) + { + var viewName = viewModelType.FullName.Replace("Model", string.Empty); + var viewModelAssemblyName = viewModelType.GetTypeInfo().Assembly.FullName; + var viewAssemblyName = string.Format(CultureInfo.InvariantCulture, "{0}, {1}", viewName, viewModelAssemblyName); + var viewType = Type.GetType(viewAssemblyName); + return viewType; + } + + private Page CreatePage(Type viewModelType, object parameter) + { + Type pageType = GetPageTypeForViewModel(viewModelType); + if (pageType == null) + { + throw new Exception($"Cannot locate page type for {viewModelType}"); + } + + Page page = Activator.CreateInstance(pageType) as Page; + return page; + } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs new file mode 100644 index 000000000..5e2732bf9 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs @@ -0,0 +1,14 @@ +namespace eShopOnContainers.Core.Services.Settings +{ + public interface ISettingsService + { + string AuthAccessToken { get; set; } + string AuthIdToken { get; set; } + bool UseMocks { get; set; } + string UrlBase { get; set; } + bool UseFakeLocation { get; set; } + string Latitude { get; set; } + string Longitude { get; set; } + bool AllowGpsLocation { get; set; } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs new file mode 100644 index 000000000..cd880c2d4 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs @@ -0,0 +1,15 @@ +namespace eShopOnContainers.Core.Services.Settings +{ + public interface ISettingsServiceImplementation + { + bool GetValueOrDefault(string key, bool defaultValue); + string GetValueOrDefault(string key, string defaultValue); + + bool AddOrUpdateValue(string key, bool value); + bool AddOrUpdateValue(string key, string value); + + void Remove(string key); + void Clear(); + bool Contains(string key); + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs similarity index 58% rename from src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs rename to src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs index 00f966a5a..a13f53187 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs @@ -1,21 +1,19 @@ -using Plugin.Settings; -using Plugin.Settings.Abstractions; +using eShopOnContainers.Core.Services.Dependency; -namespace eShopOnContainers.Core.Helpers +namespace eShopOnContainers.Core.Services.Settings { - /// - /// This is the Settings static class that can be used in your Core solution or in any - /// of your client applications. All settings are laid out the same exact way with getters - /// and setters. - /// - public static class Settings + public class SettingsService : ISettingsService { - private static ISettings AppSettings + private readonly ISettingsServiceImplementation _settingsService; + + ISettingsServiceImplementation AppSettings + { + get { return _settingsService; } + } + + public SettingsService(IDependencyService dependencyService) { - get - { - return CrossSettings.Current; - } + _settingsService = dependencyService.Get(); } #region Setting Constants @@ -28,60 +26,60 @@ namespace eShopOnContainers.Core.Helpers private const string IdLatitude = "latitude"; private const string IdLongitude = "longitude"; private const string IdAllowGpsLocation = "allow_gps_location"; - private static readonly string AccessTokenDefault = string.Empty; - private static readonly string IdTokenDefault = string.Empty; - private static readonly bool UseMocksDefault = true; - private static readonly bool UseFakeLocationDefault = false; - private static readonly bool AllowGpsLocationDefault = false; - private static readonly double FakeLatitudeDefault = 47.604610d; - private static readonly double FakeLongitudeDefault = -122.315752d; - private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint; + private readonly string AccessTokenDefault = string.Empty; + private readonly string IdTokenDefault = string.Empty; + private readonly bool UseMocksDefault = true; + private readonly bool UseFakeLocationDefault = false; + private readonly bool AllowGpsLocationDefault = false; + private readonly double FakeLatitudeDefault = 47.604610d; + private readonly double FakeLongitudeDefault = -122.315752d; + private readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint; #endregion - public static string AuthAccessToken + public string AuthAccessToken { get => AppSettings.GetValueOrDefault(AccessToken, AccessTokenDefault); set => AppSettings.AddOrUpdateValue(AccessToken, value); } - public static string AuthIdToken + public string AuthIdToken { get => AppSettings.GetValueOrDefault(IdToken, IdTokenDefault); set => AppSettings.AddOrUpdateValue(IdToken, value); } - public static bool UseMocks + public bool UseMocks { get => AppSettings.GetValueOrDefault(IdUseMocks, UseMocksDefault); set => AppSettings.AddOrUpdateValue(IdUseMocks, value); } - public static string UrlBase + public string UrlBase { get => AppSettings.GetValueOrDefault(IdUrlBase, UrlBaseDefault); set => AppSettings.AddOrUpdateValue(IdUrlBase, value); } - public static bool UseFakeLocation + public bool UseFakeLocation { get => AppSettings.GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault); set => AppSettings.AddOrUpdateValue(IdUseFakeLocation, value); } - public static string Latitude + public string Latitude { get => AppSettings.GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString()); set => AppSettings.AddOrUpdateValue(IdLatitude, value); } - public static string Longitude + public string Longitude { get => AppSettings.GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString()); set => AppSettings.AddOrUpdateValue(IdLongitude, value); } - public static bool AllowGpsLocation + public bool AllowGpsLocation { get => AppSettings.GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault); set => AppSettings.AddOrUpdateValue(IdAllowGpsLocation, value); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs index cd36fb3cc..3d2381ab1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs @@ -1,6 +1,7 @@ using eShopOnContainers.Core.Helpers; using eShopOnContainers.Services; using System.Threading.Tasks; +using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Core.ViewModels.Base { @@ -29,7 +30,7 @@ namespace eShopOnContainers.Core.ViewModels.Base { DialogService = ViewModelLocator.Resolve(); NavigationService = ViewModelLocator.Resolve(); - GlobalSetting.Instance.BaseEndpoint = Settings.UrlBase; + GlobalSetting.Instance.BaseEndpoint = ViewModelLocator.Resolve().UrlBase; } public virtual Task InitializeAsync(object navigationData) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index f30f2b18e..bb9482909 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -10,108 +10,114 @@ using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Identity; using eShopOnContainers.Core.Services.Order; using eShopOnContainers.Core.Services.User; -using Xamarin.Forms; using eShopOnContainers.Core.Services.Location; using eShopOnContainers.Core.Services.Marketing; +using eShopOnContainers.Core.Services.Dependency; +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.Services.FixUri; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels.Base { public static class ViewModelLocator { - private static IContainer _container; - - public static readonly BindableProperty AutoWireViewModelProperty = - BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged); - - public static bool GetAutoWireViewModel(BindableObject bindable) - { - return (bool)bindable.GetValue(ViewModelLocator.AutoWireViewModelProperty); - } - - public static void SetAutoWireViewModel(BindableObject bindable, bool value) - { - bindable.SetValue(ViewModelLocator.AutoWireViewModelProperty, value); - } - - public static bool UseMockService { get; set; } - - public static void RegisterDependencies(bool useMockServices) - { - var builder = new ContainerBuilder(); - - // View models - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); + private static IContainer _container; + + public static readonly BindableProperty AutoWireViewModelProperty = + BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged); + + public static bool GetAutoWireViewModel(BindableObject bindable) + { + return (bool)bindable.GetValue(ViewModelLocator.AutoWireViewModelProperty); + } + + public static void SetAutoWireViewModel(BindableObject bindable, bool value) + { + bindable.SetValue(ViewModelLocator.AutoWireViewModelProperty, value); + } + + public static bool UseMockService { get; set; } + + public static void RegisterDependencies(bool useMockServices) + { + var builder = new ContainerBuilder(); + + // View models + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); // Services builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As(); + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); if (useMockServices) - { - builder.RegisterInstance(new CatalogMockService()).As(); - builder.RegisterInstance(new BasketMockService()).As(); - builder.RegisterInstance(new OrderMockService()).As(); - builder.RegisterInstance(new UserMockService()).As(); - builder.RegisterInstance(new CampaignMockService()).As(); + { + builder.RegisterInstance(new CatalogMockService()).As(); + builder.RegisterInstance(new BasketMockService()).As(); + builder.RegisterInstance(new OrderMockService()).As(); + builder.RegisterInstance(new UserMockService()).As(); + builder.RegisterInstance(new CampaignMockService()).As(); UseMockService = true; - } - else - { - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); + } + else + { + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); UseMockService = false; - } - - if (_container != null) - { - _container.Dispose(); - } - _container = builder.Build(); - } - - public static T Resolve() - { - return _container.Resolve(); - } - - private static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue) - { - var view = bindable as Element; - if (view == null) - { - return; - } - - var viewType = view.GetType(); - var viewName = viewType.FullName.Replace(".Views.", ".ViewModels."); - var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; - var viewModelName = string.Format(CultureInfo.InvariantCulture, "{0}Model, {1}", viewName, viewAssemblyName); - - var viewModelType = Type.GetType(viewModelName); - if (viewModelType == null) - { - return; - } - var viewModel = _container.Resolve(viewModelType); - view.BindingContext = viewModel; - } - } + } + + if (_container != null) + { + _container.Dispose(); + } + _container = builder.Build(); + } + + public static T Resolve() + { + return _container.Resolve(); + } + + private static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue) + { + var view = bindable as Element; + if (view == null) + { + return; + } + + var viewType = view.GetType(); + var viewName = viewType.FullName.Replace(".Views.", ".ViewModels."); + var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; + var viewModelName = string.Format(CultureInfo.InvariantCulture, "{0}Model, {1}", viewName, viewAssemblyName); + + var viewModelType = Type.GetType(viewModelName); + if (viewModelType == null) + { + return; + } + var viewModel = _container.Resolve(viewModelType); + view.BindingContext = viewModel; + } + } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs index a7d659815..3d23adb6f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -1,4 +1,4 @@ -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Models.Basket; using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.Basket; @@ -18,13 +18,16 @@ namespace eShopOnContainers.Core.ViewModels private ObservableCollection _basketItems; private decimal _total; + private ISettingsService _settingsService; private IBasketService _basketService; private IUserService _userService; public BasketViewModel( + ISettingsService settingsService, IBasketService basketService, IUserService userService) { + _settingsService = settingsService; _basketService = basketService; _userService = userService; } @@ -48,7 +51,7 @@ namespace eShopOnContainers.Core.ViewModels RaisePropertyChanged(() => BasketItems); } } - + public decimal Total { get { return _total; } @@ -68,7 +71,7 @@ namespace eShopOnContainers.Core.ViewModels if (BasketItems == null) BasketItems = new ObservableCollection(); - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; var userInfo = await _userService.GetUserInfoAsync(authToken); // Update Basket @@ -93,7 +96,7 @@ namespace eShopOnContainers.Core.ViewModels await AddCatalogItemAsync(arg); }); - + await base.InitializeAsync(navigationData); } @@ -114,16 +117,13 @@ namespace eShopOnContainers.Core.ViewModels private async Task AddItemAsync(BasketItem item) { BadgeCount++; - await AddBasketItemAsync(item); - RaisePropertyChanged(() => BasketItems); } private async Task AddBasketItemAsync(BasketItem item) { BasketItems.Add(item); - await ReCalculateTotalAsync(); } @@ -141,12 +141,12 @@ namespace eShopOnContainers.Core.ViewModels Total += (orderItem.Quantity * orderItem.UnitPrice); } - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; var userInfo = await _userService.GetUserInfoAsync(authToken); await _basketService.UpdateBasketAsync(new CustomerBasket { - BuyerId = userInfo.UserId, + BuyerId = userInfo.UserId, Items = BasketItems.ToList() }, authToken); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs index 4a74187ee..d24e2f6cf 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs @@ -2,7 +2,7 @@ using System.Windows.Input; using Xamarin.Forms; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Models.Marketing; using eShopOnContainers.Core.Services.Marketing; @@ -10,12 +10,17 @@ namespace eShopOnContainers.Core.ViewModels { public class CampaignDetailsViewModel : ViewModelBase { + private readonly ISettingsService _settingsService; + private readonly ICampaignService _campaignService; + private CampaignItem _campaign; private bool _isDetailsSite; - private readonly ICampaignService _campaignService; - public CampaignDetailsViewModel(ICampaignService campaignService) + public ICommand EnableDetailsSiteCommand => new Command(EnableDetailsSite); + + public CampaignDetailsViewModel(ISettingsService settingsService, ICampaignService campaignService) { + _settingsService = settingsService; _campaignService = campaignService; } @@ -44,16 +49,12 @@ namespace eShopOnContainers.Core.ViewModels if (navigationData is int) { IsBusy = true; - // Get campaign by id - Campaign = await _campaignService.GetCampaignByIdAsync((int)navigationData, Settings.AuthAccessToken); - + Campaign = await _campaignService.GetCampaignByIdAsync((int)navigationData, _settingsService.AuthAccessToken); IsBusy = false; } } - public ICommand EnableDetailsSiteCommand => new Command(EnableDetailsSite); - private void EnableDetailsSite() { IsDetailsSite = true; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs index 9351ec414..ee79136f5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs @@ -5,17 +5,20 @@ using System.Collections.ObjectModel; using eShopOnContainers.Core.Models.Marketing; using eShopOnContainers.Core.Services.Marketing; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Core.ViewModels { public class CampaignViewModel : ViewModelBase { - private ObservableCollection _campaigns; + private readonly ISettingsService _settingsService; private readonly ICampaignService _campaignService; - public CampaignViewModel(ICampaignService campaignService) + private ObservableCollection _campaigns; + + public CampaignViewModel(ISettingsService settingsService, ICampaignService campaignService) { + _settingsService = settingsService; _campaignService = campaignService; } @@ -34,10 +37,8 @@ namespace eShopOnContainers.Core.ViewModels public override async Task InitializeAsync(object navigationData) { IsBusy = true; - // Get campaigns by user - Campaigns = await _campaignService.GetAllCampaignsAsync(Settings.AuthAccessToken); - + Campaigns = await _campaignService.GetAllCampaignsAsync(_settingsService.AuthAccessToken); IsBusy = false; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs index 0113202bf..f9ed8c05d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs @@ -10,7 +10,7 @@ using eShopOnContainers.Core.Models.Basket; using System.Collections.Generic; using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Order; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.Models.User; @@ -20,17 +20,20 @@ namespace eShopOnContainers.Core.ViewModels { private ObservableCollection _orderItems; private Order _order; - private Address _shippingAddress; + private Address _shippingAddress; + private ISettingsService _settingsService; private IBasketService _basketService; private IOrderService _orderService; private IUserService _userService; public CheckoutViewModel( + ISettingsService settingsService, IBasketService basketService, IOrderService orderService, IUserService userService) { + _settingsService = settingsService; _basketService = basketService; _orderService = orderService; _userService = userService; @@ -79,7 +82,7 @@ namespace eShopOnContainers.Core.ViewModels OrderItems = orderItems; - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; var userInfo = await _userService.GetUserInfoAsync(authToken); // Create Shipping Address @@ -98,7 +101,7 @@ namespace eShopOnContainers.Core.ViewModels { CardNumber = userInfo?.CardNumber, CardHolderName = userInfo?.CardHolder, - CardType = new CardType { Id = 3, Name = "MasterCard" }, + CardType = new CardType { Id = 3, Name = "MasterCard" }, SecurityNumber = userInfo?.CardSecurityNumber }; @@ -117,12 +120,12 @@ namespace eShopOnContainers.Core.ViewModels ShippingState = _shippingAddress.State, ShippingCountry = _shippingAddress.Country, ShippingStreet = _shippingAddress.Street, - ShippingCity = _shippingAddress.City, + ShippingCity = _shippingAddress.City, ShippingZipCode = _shippingAddress.ZipCode, Total = CalculateTotal(CreateOrderItems(orderItems)) }; - if (Settings.UseMocks) + if (_settingsService.UseMocks) { // Get number of orders var orders = await _orderService.GetOrdersAsync(authToken); @@ -140,7 +143,7 @@ namespace eShopOnContainers.Core.ViewModels { try { - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; var basket = _orderService.MapOrderToBasket(Order); basket.RequestId = Guid.NewGuid(); @@ -148,7 +151,7 @@ namespace eShopOnContainers.Core.ViewModels // Create basket checkout await _basketService.CheckoutAsync(basket, authToken); - if (Settings.UseMocks) + if (_settingsService.UseMocks) { await _orderService.CreateOrderAsync(Order, authToken); } @@ -195,13 +198,13 @@ namespace eShopOnContainers.Core.ViewModels } return orderItems; - } + } private decimal CalculateTotal(List orderItems) { decimal total = 0; - foreach(var orderItem in orderItems) + foreach (var orderItem in orderItems) { total += (orderItem.Quantity * orderItem.UnitPrice); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs index d77dec9bd..5f6630159 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs @@ -1,4 +1,4 @@ -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Identity; using eShopOnContainers.Core.Services.OpenUrl; @@ -22,13 +22,16 @@ namespace eShopOnContainers.Core.ViewModels private bool _isLogin; private string _authUrl; + private ISettingsService _settingsService; private IOpenUrlService _openUrlService; private IIdentityService _identityService; public LoginViewModel( + ISettingsService settingsService, IOpenUrlService openUrlService, IIdentityService identityService) { + _settingsService = settingsService; _openUrlService = openUrlService; _identityService = identityService; @@ -127,13 +130,13 @@ namespace eShopOnContainers.Core.ViewModels public ICommand SettingsCommand => new Command(async () => await SettingsAsync()); - public ICommand ValidateUserNameCommand => new Command(() => ValidateUserName()); + public ICommand ValidateUserNameCommand => new Command(() => ValidateUserName()); - public ICommand ValidatePasswordCommand => new Command(() => ValidatePassword()); + public ICommand ValidatePasswordCommand => new Command(() => ValidatePassword()); public override Task InitializeAsync(object navigationData) { - if(navigationData is LogoutParameter) + if (navigationData is LogoutParameter) { var logoutParameter = (LogoutParameter)navigationData; @@ -173,7 +176,7 @@ namespace eShopOnContainers.Core.ViewModels if (isAuthenticated) { - Settings.AuthAccessToken = GlobalSetting.Instance.AuthToken; + _settingsService.AuthAccessToken = GlobalSetting.Instance.AuthToken; await NavigationService.NavigateToAsync(); await NavigationService.RemoveLastFromBackStackAsync(); @@ -202,7 +205,7 @@ namespace eShopOnContainers.Core.ViewModels private void Logout() { - var authIdToken = Settings.AuthIdToken; + var authIdToken = _settingsService.AuthIdToken; var logoutRequest = _identityService.CreateLogoutRequest(authIdToken); if (!string.IsNullOrEmpty(logoutRequest)) @@ -211,13 +214,13 @@ namespace eShopOnContainers.Core.ViewModels LoginUrl = logoutRequest; } - if (Settings.UseMocks) + if (_settingsService.UseMocks) { - Settings.AuthAccessToken = string.Empty; - Settings.AuthIdToken = string.Empty; + _settingsService.AuthAccessToken = string.Empty; + _settingsService.AuthIdToken = string.Empty; } - Settings.UseFakeLocation = false; + _settingsService.UseFakeLocation = false; } private async Task NavigateAsync(string url) @@ -226,8 +229,8 @@ namespace eShopOnContainers.Core.ViewModels if (unescapedUrl.Equals(GlobalSetting.Instance.LogoutCallback)) { - Settings.AuthAccessToken = string.Empty; - Settings.AuthIdToken = string.Empty; + _settingsService.AuthAccessToken = string.Empty; + _settingsService.AuthIdToken = string.Empty; IsLogin = false; LoginUrl = _identityService.CreateAuthorizationRequest(); } @@ -241,8 +244,8 @@ namespace eShopOnContainers.Core.ViewModels if (!string.IsNullOrWhiteSpace(accessToken)) { - Settings.AuthAccessToken = accessToken; - Settings.AuthIdToken = authResponse.IdentityToken; + _settingsService.AuthAccessToken = accessToken; + _settingsService.AuthIdToken = authResponse.IdentityToken; await NavigationService.NavigateToAsync(); await NavigationService.RemoveLastFromBackStackAsync(); } @@ -257,21 +260,21 @@ namespace eShopOnContainers.Core.ViewModels private bool Validate() { - bool isValidUser = ValidateUserName(); + bool isValidUser = ValidateUserName(); bool isValidPassword = ValidatePassword(); return isValidUser && isValidPassword; } - private bool ValidateUserName() - { - return _userName.Validate(); - } + private bool ValidateUserName() + { + return _userName.Validate(); + } - private bool ValidatePassword() - { - return _password.Validate(); - } + private bool ValidatePassword() + { + return _password.Validate(); + } private void AddValidations() { @@ -281,7 +284,7 @@ namespace eShopOnContainers.Core.ViewModels public void InvalidateMock() { - IsMock = Settings.UseMocks; + IsMock = _settingsService.UseMocks; } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs index 71d6ac6e1..416183935 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs @@ -4,20 +4,23 @@ using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Services.Order; using System; using System.Windows.Input; -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { public class OrderDetailViewModel : ViewModelBase { + private readonly ISettingsService _settingsService; private readonly IOrderService _ordersService; - private Order _order; + + private Order _order; private bool _isSubmittedOrder; private string _orderStatusText; - public OrderDetailViewModel(IOrderService ordersService) + public OrderDetailViewModel(ISettingsService settingsService, IOrderService ordersService) { + _settingsService = settingsService; _ordersService = ordersService; } @@ -63,7 +66,7 @@ namespace eShopOnContainers.Core.ViewModels var order = navigationData as Order; // Get order detail info - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; Order = await _ordersService.GetOrderAsync(order.OrderNumber, authToken); IsSubmittedOrder = Order.OrderStatus == OrderStatus.Submitted; OrderStatusText = Order.OrderStatus.ToString().ToUpper(); @@ -74,13 +77,13 @@ namespace eShopOnContainers.Core.ViewModels private async Task ToggleCancelOrderAsync() { - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; var result = await _ordersService.CancelOrderAsync(_order.OrderNumber, authToken); if (result) { - OrderStatusText = OrderStatus.Cancelled.ToString().ToUpper(); + OrderStatusText = OrderStatus.Cancelled.ToString().ToUpper(); } else { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs index 2cc1ab9d9..327bdb8d2 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs @@ -1,5 +1,4 @@ using eShopOnContainers.Core.Extensions; -using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Order; @@ -8,17 +7,19 @@ using System.Collections.ObjectModel; using System.Threading.Tasks; using System.Windows.Input; using Xamarin.Forms; +using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Core.ViewModels { public class ProfileViewModel : ViewModelBase { + private readonly ISettingsService _settingsService; + private readonly IOrderService _orderService; private ObservableCollection _orders; - private IOrderService _orderService; - - public ProfileViewModel(IOrderService orderService) + public ProfileViewModel(ISettingsService settingsService, IOrderService orderService) { + _settingsService = settingsService; _orderService = orderService; } @@ -41,7 +42,7 @@ namespace eShopOnContainers.Core.ViewModels IsBusy = true; // Get orders - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; var orders = await _orderService.GetOrdersAsync(authToken); Orders = orders.ToObservableCollection(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs index e6e32393f..0b7f78a6d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs @@ -1,17 +1,16 @@ using System.Globalization; +using System.Windows.Input; +using Xamarin.Forms; +using System.Threading.Tasks; +using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Core.Models.Location; +using eShopOnContainers.Core.Services.Location; +using Plugin.Geolocator; +using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Core.ViewModels { - using System.Windows.Input; - using Xamarin.Forms; - using System.Threading.Tasks; - using Helpers; - using Models.User; - using Base; - using Models.Location; - using Services.Location; - using Plugin.Geolocator; - public class SettingsViewModel : ViewModelBase { private string _titleUseAzureServices; @@ -28,18 +27,20 @@ namespace eShopOnContainers.Core.ViewModels private double _longitude; private string _gpsWarningMessage; + private readonly ISettingsService _settingsService; private readonly ILocationService _locationService; - public SettingsViewModel(ILocationService locationService) + public SettingsViewModel(ISettingsService settingsService, ILocationService locationService) { + _settingsService = settingsService; _locationService = locationService; - _useAzureServices = !Settings.UseMocks; - _endpoint = Settings.UrlBase; - _latitude = double.Parse(Settings.Latitude, CultureInfo.CurrentCulture); - _longitude = double.Parse(Settings.Longitude, CultureInfo.CurrentCulture); - _useFakeLocation = Settings.UseFakeLocation; - _allowGpsLocation = Settings.AllowGpsLocation; + _useAzureServices = _settingsService.UseMocks; + _endpoint = _settingsService.UrlBase; + _latitude = double.Parse(_settingsService.Latitude, CultureInfo.CurrentCulture); + _longitude = double.Parse(_settingsService.Longitude, CultureInfo.CurrentCulture); + _useFakeLocation = _settingsService.UseFakeLocation; + _allowGpsLocation = _settingsService.AllowGpsLocation; _gpsWarningMessage = string.Empty; } @@ -71,7 +72,7 @@ namespace eShopOnContainers.Core.ViewModels _useAzureServices = value; UpdateUseAzureServices(); - + RaisePropertyChanged(() => UseAzureServices); } } @@ -146,7 +147,7 @@ namespace eShopOnContainers.Core.ViewModels { _endpoint = value; - if(!string.IsNullOrEmpty(_endpoint)) + if (!string.IsNullOrEmpty(_endpoint)) { UpdateEndpoint(); } @@ -194,7 +195,7 @@ namespace eShopOnContainers.Core.ViewModels } } - public bool UserIsLogged => !string.IsNullOrEmpty(Settings.AuthAccessToken); + public bool UserIsLogged => !string.IsNullOrEmpty(_settingsService.AuthAccessToken); public ICommand ToggleMockServicesCommand => new Command(async () => await ToggleMockServicesAsync()); @@ -213,28 +214,28 @@ namespace eShopOnContainers.Core.ViewModels return base.InitializeAsync(navigationData); } - private async Task ToggleMockServicesAsync() - { - ViewModelLocator.RegisterDependencies(!UseAzureServices); - UpdateInfoUseAzureServices(); - - var previousPageViewModel = NavigationService.PreviousPageViewModel; - if (previousPageViewModel != null) - { - if (previousPageViewModel is MainViewModel) - { - // Slight delay so that page navigation isn't instantaneous - await Task.Delay(1000); - if (UseAzureServices) - { - Settings.AuthAccessToken = string.Empty; - Settings.AuthIdToken = string.Empty; - await NavigationService.NavigateToAsync(new LogoutParameter { Logout = true }); - await NavigationService.RemoveBackStackAsync(); - } - } - } - } + private async Task ToggleMockServicesAsync() + { + ViewModelLocator.RegisterDependencies(!UseAzureServices); + UpdateInfoUseAzureServices(); + + var previousPageViewModel = NavigationService.PreviousPageViewModel; + if (previousPageViewModel != null) + { + if (previousPageViewModel is MainViewModel) + { + // Slight delay so that page navigation isn't instantaneous + await Task.Delay(1000); + if (UseAzureServices) + { + _settingsService.AuthAccessToken = string.Empty; + _settingsService.AuthIdToken = string.Empty; + await NavigationService.NavigateToAsync(new LogoutParameter { Logout = true }); + await NavigationService.RemoveBackStackAsync(); + } + } + } + } private void ToggleFakeLocationAsync() { @@ -244,17 +245,17 @@ namespace eShopOnContainers.Core.ViewModels private async Task ToggleSendLocationAsync() { - if (!Settings.UseMocks) + if (!_settingsService.UseMocks) { var locationRequest = new Location { Latitude = _latitude, Longitude = _longitude }; - var authToken = Settings.AuthAccessToken; + var authToken = _settingsService.AuthAccessToken; await _locationService.UpdateUserLocation(locationRequest, authToken); - } + } } private void ToggleAllowGpsLocation() @@ -310,30 +311,30 @@ namespace eShopOnContainers.Core.ViewModels private void UpdateUseAzureServices() { // Save use mocks services to local storage - Settings.UseMocks = !_useAzureServices; + _settingsService.UseMocks = !_useAzureServices; } private void UpdateEndpoint() { // Update remote endpoint (save to local storage) - GlobalSetting.Instance.BaseEndpoint = Settings.UrlBase = _endpoint; + GlobalSetting.Instance.BaseEndpoint = _settingsService.UrlBase = _endpoint; } private void UpdateFakeLocation() { - Settings.UseFakeLocation = _useFakeLocation; + _settingsService.UseFakeLocation = _useFakeLocation; } private void UpdateLatitude() { // Update fake latitude (save to local storage) - Settings.Latitude = _latitude.ToString(); + _settingsService.Latitude = _latitude.ToString(); } private void UpdateLongitude() { // Update fake longitude (save to local storage) - Settings.Longitude = _longitude.ToString(); + _settingsService.Longitude = _longitude.ToString(); } private void UpdateAllowGpsLocation() @@ -348,13 +349,13 @@ namespace eShopOnContainers.Core.ViewModels } else { - Settings.AllowGpsLocation = _allowGpsLocation; + _settingsService.AllowGpsLocation = _allowGpsLocation; GpsWarningMessage = string.Empty; } } else { - Settings.AllowGpsLocation = _allowGpsLocation; + _settingsService.AllowGpsLocation = _allowGpsLocation; } } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj index bc631506d..aa23dc5ed 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj @@ -5,7 +5,6 @@ - @@ -17,4 +16,9 @@ + + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Helpers/Settings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Helpers/Settings.cs deleted file mode 100644 index bde99859e..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Helpers/Settings.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* -// Helpers/Settings.cs This file was automatically added when you installed the Settings Plugin. If you are not using a PCL then comment this file back in to use it. -using Plugin.Settings; -using Plugin.Settings.Abstractions; - -namespace eShopOnContainers.Droid.Helpers -{ - /// - /// This is the Settings static class that can be used in your Core solution or in any - /// of your client applications. All settings are laid out the same exact way with getters - /// and setters. - /// - public static class Settings - { - private static ISettings AppSettings - { - get - { - return CrossSettings.Current; - } - } - - #region Setting Constants - - private const string SettingsKey = "settings_key"; - private static readonly string SettingsDefault = string.Empty; - - #endregion - - - public static string GeneralSettings - { - get - { - return AppSettings.GetValueOrDefault(SettingsKey, SettingsDefault); - } - set - { - AppSettings.AddOrUpdateValue(SettingsKey, value); - } - } - - } -}*/ \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj index a8c8db3b7..03cd3b275 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj @@ -166,12 +166,6 @@ ..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\MonoAndroid10\Plugin.Geolocator.dll - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\MonoAndroid10\Plugin.Settings.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\MonoAndroid10\Plugin.Settings.dll - ..\..\..\..\packages\Microsoft.Net.Http.2.2.28\lib\monoandroid\System.Net.Http.Extensions.dll @@ -235,7 +229,6 @@ - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config index 8de7bc189..0c253350d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config @@ -71,7 +71,6 @@ - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Helpers/Settings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Helpers/Settings.cs deleted file mode 100644 index cb5487236..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Helpers/Settings.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* -// Helpers/Settings.cs This file was automatically added when you installed the Settings Plugin. If you are not using a PCL then comment this file back in to use it. -using Plugin.Settings; -using Plugin.Settings.Abstractions; - -namespace eShopOnContainers.TestRunner.Droid.Helpers -{ - /// - /// This is the Settings static class that can be used in your Core solution or in any - /// of your client applications. All settings are laid out the same exact way with getters - /// and setters. - /// - public static class Settings - { - private static ISettings AppSettings - { - get - { - return CrossSettings.Current; - } - } - - #region Setting Constants - - private const string SettingsKey = "settings_key"; - private static readonly string SettingsDefault = string.Empty; - - #endregion - - - public static string GeneralSettings - { - get - { - return AppSettings.GetValueOrDefault(SettingsKey, SettingsDefault); - } - set - { - AppSettings.AddOrUpdateValue(SettingsKey, value); - } - } - - } -}*/ \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj index b3a87f24e..e59fe0521 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj @@ -154,12 +154,6 @@ ..\..\..\..\packages\Autofac.4.6.2\lib\netstandard1.1\Autofac.dll - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\MonoAndroid10\Plugin.Settings.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\MonoAndroid10\Plugin.Settings.dll - ..\..\..\..\packages\Plugin.CurrentActivity.1.0.1\lib\MonoAndroid10\Plugin.CurrentActivity.dll @@ -234,7 +228,6 @@ - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config index 250b32aa3..4bd89b9e2 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config @@ -68,7 +68,6 @@ - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Helpers/Settings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Helpers/Settings.cs deleted file mode 100644 index c33056594..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Helpers/Settings.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* -// Helpers/Settings.cs This file was automatically added when you installed the Settings Plugin. If you are not using a PCL then comment this file back in to use it. -using Plugin.Settings; -using Plugin.Settings.Abstractions; - -namespace eShopOnContainers.TestRunner.iOS.Helpers -{ - /// - /// This is the Settings static class that can be used in your Core solution or in any - /// of your client applications. All settings are laid out the same exact way with getters - /// and setters. - /// - public static class Settings - { - private static ISettings AppSettings - { - get - { - return CrossSettings.Current; - } - } - - #region Setting Constants - - private const string SettingsKey = "settings_key"; - private static readonly string SettingsDefault = string.Empty; - - #endregion - - - public static string GeneralSettings - { - get - { - return AppSettings.GetValueOrDefault(SettingsKey, SettingsDefault); - } - set - { - AppSettings.AddOrUpdateValue(SettingsKey, value); - } - } - - } -}*/ \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj index 9db0b441c..16f1f622d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj @@ -105,7 +105,6 @@ - @@ -151,12 +150,6 @@ ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config index 2fb682a30..4f7503cc1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config @@ -53,7 +53,6 @@ - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Helpers/Settings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Helpers/Settings.cs deleted file mode 100644 index bdd0e4308..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Helpers/Settings.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* -// Helpers/Settings.cs This file was automatically added when you installed the Settings Plugin. If you are not using a PCL then comment this file back in to use it. -using Plugin.Settings; -using Plugin.Settings.Abstractions; - -namespace eShopOnContainers.iOS.Helpers -{ - /// - /// This is the Settings static class that can be used in your Core solution or in any - /// of your client applications. All settings are laid out the same exact way with getters - /// and setters. - /// - public static class Settings - { - private static ISettings AppSettings - { - get - { - return CrossSettings.Current; - } - } - - #region Setting Constants - - private const string SettingsKey = "settings_key"; - private static readonly string SettingsDefault = string.Empty; - - #endregion - - - public static string GeneralSettings - { - get - { - return AppSettings.GetValueOrDefault(SettingsKey, SettingsDefault); - } - set - { - AppSettings.AddOrUpdateValue(SettingsKey, value); - } - } - - } -}*/ \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs new file mode 100644 index 000000000..259074c24 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs @@ -0,0 +1,164 @@ +using System; +using Foundation; +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.iOS.Services; +using System.Globalization; + +[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] +namespace eShopOnContainers.iOS.Services +{ + public class SettingsServiceImplementation : ISettingsServiceImplementation + { + readonly object locker = new object(); + + NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults; + + bool AddOrUpdateValueInternal(string key, T value) + { + 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) + { + var defaults = GetUserDefaults(); + switch (typeCode) + { + case TypeCode.Boolean: + defaults.SetString(Convert.ToString(value, CultureInfo.InvariantCulture), key); + break; + case TypeCode.String: + defaults.SetString(Convert.ToString(value), key); + break; + default: + throw new ArgumentException($"Value of type {typeCode} is unsupported."); + } + + try + { + defaults.Synchronize(); + } + catch (Exception ex) + { + Console.WriteLine("Unable to save: " + key, " Message: " + ex.Message); + } + } + return true; + } + + T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) + { + var defaults = GetUserDefaults(); + + if (defaults[key] == null) + { + return defaultValue; + } + + 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 = defaults.BoolForKey(key); + break; + case TypeCode.String: + value = defaults.StringForKey(key); + break; + default: + throw new ArgumentException($"Value of type {typeCode} is unsupported."); + } + + return null != value ? (T)value : defaultValue; + } + + #region ISettingsService Implementation + + 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) + { + lock (locker) + { + var defaults = GetUserDefaults(); + try + { + if (defaults[key] != null) + { + defaults.RemoveObject(key); + defaults.Synchronize(); + } + } + catch (Exception ex) + { + Console.WriteLine("Unable to remove: " + key, " Message: " + ex.Message); + } + } + } + + 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 + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj index ebc355be7..973fe5a0d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj @@ -125,7 +125,7 @@ - + @@ -176,12 +176,6 @@ ..\..\..\..\packages\Autofac.4.6.2\lib\netstandard1.1\Autofac.dll - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll @@ -399,6 +393,9 @@ eShopOnContainers.Core + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config index 03a3b7bea..36295053f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config @@ -60,7 +60,6 @@ - From a86a11694a49f6fa98d139fb68cba304ea1c89de Mon Sep 17 00:00:00 2001 From: David Britch Date: Tue, 16 Jan 2018 16:00:25 +0000 Subject: [PATCH 2/8] SettingsService works on iOS. --- .../eShopOnContainers.Core/App.xaml.cs | 5 +- .../ViewModels/Base/ViewModelLocator.cs | 3 ++ .../ViewModels/SettingsViewModel.cs | 2 +- .../Services/SettingsServiceImplementation.cs | 54 ++++++++++--------- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs index 076ad16e5..a1178fbef 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs @@ -15,7 +15,6 @@ namespace eShopOnContainers public partial class App : Application { ISettingsService _settingsService; - bool _useMockServices; public App() { @@ -30,9 +29,9 @@ namespace eShopOnContainers private void InitApp() { - _useMockServices = true;//_settingsService.UseMocks; - ViewModelLocator.RegisterDependencies(_useMockServices); _settingsService = ViewModelLocator.Resolve(); + if (!_settingsService.UseMocks) + ViewModelLocator.UpdateDependencies(_settingsService.UseMocks); } private Task InitNavigation() diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index 59b1f62a8..b7721017b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -60,6 +60,9 @@ namespace eShopOnContainers.Core.ViewModels.Base _container.Register(); _container.Register(); _container.Register(); + _container.Register(); + _container.Register().AsSingleton(); + _container.Register().AsSingleton(); _container.Register().AsSingleton(); _container.Register().AsSingleton(); _container.Register().AsSingleton(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs index e2258ecc6..060d2ce69 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs @@ -35,7 +35,7 @@ namespace eShopOnContainers.Core.ViewModels _settingsService = settingsService; _locationService = locationService; - _useAzureServices = _settingsService.UseMocks; + _useAzureServices = !_settingsService.UseMocks; _endpoint = _settingsService.UrlBase; _latitude = double.Parse(_settingsService.Latitude, CultureInfo.CurrentCulture); _longitude = double.Parse(_settingsService.Longitude, CultureInfo.CurrentCulture); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs index 259074c24..429f367b7 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs @@ -2,7 +2,6 @@ using Foundation; using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.iOS.Services; -using System.Globalization; [assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] namespace eShopOnContainers.iOS.Services @@ -34,7 +33,7 @@ namespace eShopOnContainers.iOS.Services switch (typeCode) { case TypeCode.Boolean: - defaults.SetString(Convert.ToString(value, CultureInfo.InvariantCulture), key); + defaults.SetBool(Convert.ToBoolean(value), key); break; case TypeCode.String: defaults.SetString(Convert.ToString(value), key); @@ -57,34 +56,37 @@ namespace eShopOnContainers.iOS.Services T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) { - var defaults = GetUserDefaults(); - - if (defaults[key] == null) + lock (locker) { - return defaultValue; - } + var defaults = GetUserDefaults(); - var type = typeof(T); - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = Nullable.GetUnderlyingType(type); - } + if (defaults[key] == null) + { + return defaultValue; + } - object value = null; - var typeCode = Type.GetTypeCode(type); - switch (typeCode) - { - case TypeCode.Boolean: - value = defaults.BoolForKey(key); - break; - case TypeCode.String: - value = defaults.StringForKey(key); - break; - default: - throw new ArgumentException($"Value of type {typeCode} is unsupported."); - } + var type = typeof(T); + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + type = Nullable.GetUnderlyingType(type); + } - return null != value ? (T)value : defaultValue; + object value = null; + var typeCode = Type.GetTypeCode(type); + switch (typeCode) + { + case TypeCode.Boolean: + value = defaults.BoolForKey(key); + break; + case TypeCode.String: + value = defaults.StringForKey(key); + break; + default: + throw new ArgumentException($"Value of type {typeCode} is unsupported."); + } + + return null != value ? (T)value : defaultValue; + } } #region ISettingsService Implementation From 648b1b35855e5625dac1a173748e4c2400c2b10b Mon Sep 17 00:00:00 2001 From: David Britch Date: Tue, 16 Jan 2018 17:21:53 +0000 Subject: [PATCH 3/8] 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 } } From 473c38e643731217c379a50ed5fe0560d3db45b9 Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 17 Jan 2018 11:07:03 +0000 Subject: [PATCH 4/8] Unit tests fixed. --- .../ViewModels/Base/ViewModelLocator.cs | 5 + .../Helpers/PropertyChangeTracker.cs | 50 ---------- .../Mocks/MockSettingsService.cs | 65 +++++++++++++ .../Services/MarketingServiceTests.cs | 13 ++- .../ViewModels/CatalogViewModelTests.cs | 3 + .../ViewModels/MainViewModelTests.cs | 81 ++++++++-------- .../ViewModels/MarketingViewModelTests.cs | 32 ++++--- .../ViewModels/MockViewModelTests.cs | 12 +-- .../ViewModels/OrderViewModelTests.cs | 96 ++++++++++--------- .../eShopOnContainers.UnitTests.csproj | 3 - 10 files changed, 194 insertions(+), 166 deletions(-) delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Helpers/PropertyChangeTracker.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index b7721017b..a27d27796 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -96,6 +96,11 @@ namespace eShopOnContainers.Core.ViewModels.Base } } + public static void RegisterSingleton() where TInterface : class where T : class, TInterface + { + _container.Register().AsSingleton(); + } + public static T Resolve() where T : class { return _container.Resolve(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Helpers/PropertyChangeTracker.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Helpers/PropertyChangeTracker.cs deleted file mode 100644 index 347a3a707..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Helpers/PropertyChangeTracker.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; - -namespace eShopOnContainers.UnitTests.Helpers -{ - public class PropertyChangeTracker - { - List _notifications = new List(); - - public PropertyChangeTracker(INotifyPropertyChanged changer) - { - changer.PropertyChanged += (sender, e) => _notifications.Add(e.PropertyName + ".Value"); - } - - //public string[] ChangedProperties - //{ - // get { return _notifications.ToArray(); } - //} - - public bool WaitForChange(string propertyName, int maxWaitMilliSeconds) - { - var startTime = DateTime.UtcNow; - while (!_notifications.Contains(propertyName)) - { - if (startTime.AddMilliseconds(maxWaitMilliSeconds) < DateTime.UtcNow) - return false; - - } - return true; - } - - public bool WaitForChange(string propertyName, TimeSpan maxWait) - { - var startTime = DateTime.UtcNow; - while (!_notifications.Contains(propertyName)) - { - if (startTime + maxWait < DateTime.UtcNow) - return false; - - } - return true; - } - - public void Reset() - { - _notifications.Clear(); - } - } -} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs new file mode 100644 index 000000000..c47c4e262 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs @@ -0,0 +1,65 @@ +using System; +using eShopOnContainers.Core.Services.Settings; + +namespace eShopOnContainers.UnitTests.Mocks +{ + public class MockSettingsService : ISettingsService + { + string _accessTokenDefault = string.Empty; + string _idTokenDefault = string.Empty; + bool _useMocksDefault = true; + string _urlBaseDefault = "https://13.88.8.119"; + bool _useFakeLocationDefault = false; + bool _allowGpsLocationDefault = false; + double _fakeLatitudeDefault = 47.604610d; + double _fakeLongitudeDefault = -122.315752d; + + public string AuthAccessToken + { + get { return _accessTokenDefault; } + set { _accessTokenDefault = value; } + } + + public string AuthIdToken + { + get { return _idTokenDefault; } + set { _idTokenDefault = value; } + } + + public bool UseMocks + { + get { return _useMocksDefault; } + set { _useMocksDefault = value; } + } + + public string UrlBase + { + get { return _urlBaseDefault; } + set { _urlBaseDefault = value; } + } + + public bool UseFakeLocation + { + get { return _useFakeLocationDefault; } + set { _useFakeLocationDefault = value; } + } + + public string Latitude + { + get { return _fakeLatitudeDefault.ToString(); } + set { _fakeLatitudeDefault = Convert.ToDouble(value); } + } + + public string Longitude + { + get { return _fakeLongitudeDefault.ToString(); } + set { _fakeLongitudeDefault = Convert.ToDouble(value); } + } + + public bool AllowGpsLocation + { + get { return _allowGpsLocationDefault; } + set { _allowGpsLocationDefault = value; } + } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs index 052c5a4a8..32091eaa4 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs @@ -1,11 +1,10 @@ -namespace eShopOnContainers.UnitTests.Services -{ - using System.Threading.Tasks; - using Core; - using Core.Helpers; - using Core.Services.Marketing; - using Xunit; +using System.Threading.Tasks; +using eShopOnContainers.Core; +using eShopOnContainers.Core.Services.Marketing; +using Xunit; +namespace eShopOnContainers.UnitTests.Services +{ public class MarketingServiceTests { [Fact] diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs index 60a2ded03..2da535d10 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs @@ -5,6 +5,8 @@ using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.Models.Catalog; using System.Threading.Tasks; using System.Linq; +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.UnitTests.Mocks; namespace eShopOnContainers.UnitTests { @@ -13,6 +15,7 @@ namespace eShopOnContainers.UnitTests public CatalogViewModelTests() { ViewModelLocator.UpdateDependencies(true); + ViewModelLocator.RegisterSingleton(); } [Fact] diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs index ca768fc6d..94e0dabfc 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs @@ -2,53 +2,56 @@ using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Models.Navigation; +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.UnitTests.Mocks; using System.Threading.Tasks; namespace eShopOnContainers.UnitTests { - public class MainViewModelTests - { - public MainViewModelTests() - { - ViewModelLocator.UpdateDependencies(true); - } + public class MainViewModelTests + { + public MainViewModelTests() + { + ViewModelLocator.UpdateDependencies(true); + ViewModelLocator.RegisterSingleton(); + } - [Fact] - public void SettingsCommandIsNotNullWhenViewModelInstantiatedTest() - { - var mainViewModel = new MainViewModel(); - Assert.NotNull(mainViewModel.SettingsCommand); - } + [Fact] + public void SettingsCommandIsNotNullWhenViewModelInstantiatedTest() + { + var mainViewModel = new MainViewModel(); + Assert.NotNull(mainViewModel.SettingsCommand); + } - [Fact] - public async Task ViewModelInitializationSendsChangeTabMessageTest() - { - bool messageReceived = false; - var mainViewModel = new MainViewModel(); - var tabParam = new TabParameter { TabIndex = 2 }; + [Fact] + public async Task ViewModelInitializationSendsChangeTabMessageTest() + { + bool messageReceived = false; + var mainViewModel = new MainViewModel(); + var tabParam = new TabParameter { TabIndex = 2 }; - Xamarin.Forms.MessagingCenter.Subscribe(this, MessageKeys.ChangeTab, (sender, arg) => - { - messageReceived = true; - }); - await mainViewModel.InitializeAsync(tabParam); + Xamarin.Forms.MessagingCenter.Subscribe(this, MessageKeys.ChangeTab, (sender, arg) => + { + messageReceived = true; + }); + await mainViewModel.InitializeAsync(tabParam); - Assert.True(messageReceived); - } + Assert.True(messageReceived); + } - [Fact] - public void IsBusyPropertyIsFalseWhenViewModelInstantiatedTest() - { - var mainViewModel = new MainViewModel(); - Assert.False(mainViewModel.IsBusy); - } + [Fact] + public void IsBusyPropertyIsFalseWhenViewModelInstantiatedTest() + { + var mainViewModel = new MainViewModel(); + Assert.False(mainViewModel.IsBusy); + } - [Fact] - public async Task IsBusyPropertyIsTrueAfterViewModelInitializationTest() - { - var mainViewModel = new MainViewModel(); - await mainViewModel.InitializeAsync(null); - Assert.True(mainViewModel.IsBusy); - } - } + [Fact] + public async Task IsBusyPropertyIsTrueAfterViewModelInitializationTest() + { + var mainViewModel = new MainViewModel(); + await mainViewModel.InitializeAsync(null); + Assert.True(mainViewModel.IsBusy); + } + } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs index 8c58e67eb..c05520535 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs @@ -1,31 +1,36 @@ -namespace eShopOnContainers.UnitTests.ViewModels -{ - using System.Threading.Tasks; - using Xunit; - using Core.ViewModels.Base; - using Core.Services.Marketing; - using Core.ViewModels; +using System.Threading.Tasks; +using Xunit; +using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Core.Services.Marketing; +using eShopOnContainers.Core.ViewModels; +using eShopOnContainers.UnitTests.Mocks; +using eShopOnContainers.Core.Services.Settings; +namespace eShopOnContainers.UnitTests.ViewModels +{ public class MarketingViewModelTests { public MarketingViewModelTests() { ViewModelLocator.UpdateDependencies(true); + ViewModelLocator.RegisterSingleton(); } [Fact] public void GetCampaignsIsNullTest() { + var settingsService = new MockSettingsService(); var campaignService = new CampaignMockService(); - var campaignViewModel = new CampaignViewModel(campaignService); + var campaignViewModel = new CampaignViewModel(settingsService, campaignService); Assert.Null(campaignViewModel.Campaigns); } [Fact] public async Task GetCampaignsIsNotNullTest() { + var settingsService = new MockSettingsService(); var campaignService = new CampaignMockService(); - var campaignViewModel = new CampaignViewModel(campaignService); + var campaignViewModel = new CampaignViewModel(settingsService, campaignService); await campaignViewModel.InitializeAsync(null); @@ -35,24 +40,27 @@ [Fact] public void GetCampaignDetailsCommandIsNotNullTest() { + var settingsService = new MockSettingsService(); var campaignService = new CampaignMockService(); - var campaignViewModel = new CampaignViewModel(campaignService); + var campaignViewModel = new CampaignViewModel(settingsService, campaignService); Assert.NotNull(campaignViewModel.GetCampaignDetailsCommand); } [Fact] public void GetCampaignDetailsByIdIsNullTest() { + var settingsService = new MockSettingsService(); var campaignService = new CampaignMockService(); - var campaignViewModel = new CampaignDetailsViewModel(campaignService); + var campaignViewModel = new CampaignDetailsViewModel(settingsService, campaignService); Assert.Null(campaignViewModel.Campaign); } [Fact] public async Task GetCampaignDetailsByIdIsNotNullTest() { + var settingsService = new MockSettingsService(); var campaignService = new CampaignMockService(); - var campaignDetailsViewModel = new CampaignDetailsViewModel(campaignService); + var campaignDetailsViewModel = new CampaignDetailsViewModel(settingsService, campaignService); await campaignDetailsViewModel.InitializeAsync(1); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs index 0821f4d98..84a11ed53 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs @@ -1,7 +1,5 @@ using Xunit; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.UnitTests.Helpers; -using System.ComponentModel; namespace eShopOnContainers.UnitTests { @@ -86,15 +84,12 @@ namespace eShopOnContainers.UnitTests bool invoked = false; var mockViewModel = new MockViewModel(); - PropertyChangedEventHandler handler = (sender, e) => + mockViewModel.Forename.PropertyChanged += (sender, e) => { if (e.PropertyName.Equals("Value")) invoked = true; }; - - mockViewModel.Forename.PropertyChanged += handler; mockViewModel.Forename.Value = "John"; - mockViewModel.Forename.PropertyChanged -= handler; Assert.True(invoked); } @@ -105,15 +100,12 @@ namespace eShopOnContainers.UnitTests bool invoked = false; var mockViewModel = new MockViewModel(); - PropertyChangedEventHandler handler = (sender, e) => + mockViewModel.Surname.PropertyChanged += (sender, e) => { if (e.PropertyName.Equals("Value")) invoked = true; }; - - mockViewModel.Surname.PropertyChanged += handler; mockViewModel.Surname.Value = "Smith"; - mockViewModel.Surname.PropertyChanged -= handler; Assert.True(invoked); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs index 41e05ebc0..ddd86720b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs @@ -4,52 +4,58 @@ using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Services.Order; using System.Threading.Tasks; +using eShopOnContainers.UnitTests.Mocks; +using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.UnitTests { - public class OrderViewModelTests - { - public OrderViewModelTests() - { - ViewModelLocator.UpdateDependencies(true); - } - - [Fact] - public void OrderPropertyIsNullWhenViewModelInstantiatedTest() - { - var orderService = new OrderMockService(); - var orderViewModel = new OrderDetailViewModel(orderService); - Assert.Null(orderViewModel.Order); - } - - [Fact] - public async Task OrderPropertyIsNotNullAfterViewModelInitializationTest() - { - var orderService = new OrderMockService(); - var orderViewModel = new OrderDetailViewModel(orderService); - - var order = await orderService.GetOrderAsync(1, GlobalSetting.Instance.AuthToken); - await orderViewModel.InitializeAsync(order); - - Assert.NotNull(orderViewModel.Order); - } - - [Fact] - public async Task SettingOrderPropertyShouldRaisePropertyChanged() - { - bool invoked = false; - var orderService = new OrderMockService(); - var orderViewModel = new OrderDetailViewModel(orderService); - - orderViewModel.PropertyChanged += (sender, e) => - { - if (e.PropertyName.Equals("Order")) - invoked = true; - }; - var order = await orderService.GetOrderAsync(1, GlobalSetting.Instance.AuthToken); - await orderViewModel.InitializeAsync(order); - - Assert.True(invoked); - } - } + public class OrderViewModelTests + { + public OrderViewModelTests() + { + ViewModelLocator.UpdateDependencies(true); + ViewModelLocator.RegisterSingleton(); + } + + [Fact] + public void OrderPropertyIsNullWhenViewModelInstantiatedTest() + { + var settingsService = new MockSettingsService(); + var orderService = new OrderMockService(); + var orderViewModel = new OrderDetailViewModel(settingsService, orderService); + Assert.Null(orderViewModel.Order); + } + + [Fact] + public async Task OrderPropertyIsNotNullAfterViewModelInitializationTest() + { + var settingsService = new MockSettingsService(); + var orderService = new OrderMockService(); + var orderViewModel = new OrderDetailViewModel(settingsService, orderService); + + var order = await orderService.GetOrderAsync(1, GlobalSetting.Instance.AuthToken); + await orderViewModel.InitializeAsync(order); + + Assert.NotNull(orderViewModel.Order); + } + + [Fact] + public async Task SettingOrderPropertyShouldRaisePropertyChanged() + { + bool invoked = false; + var settingsService = new MockSettingsService(); + var orderService = new OrderMockService(); + var orderViewModel = new OrderDetailViewModel(settingsService, orderService); + + orderViewModel.PropertyChanged += (sender, e) => + { + if (e.PropertyName.Equals("Order")) + invoked = true; + }; + var order = await orderService.GetOrderAsync(1, GlobalSetting.Instance.AuthToken); + await orderViewModel.InitializeAsync(order); + + Assert.True(invoked); + } + } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj index 7366ac97a..74e0d0c29 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj @@ -9,9 +9,6 @@ - - - From 89769133c81773c9bf20cba1d713e45d184e0d3a Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 17 Jan 2018 12:35:57 +0000 Subject: [PATCH 5/8] Organised using statements. --- .../eShopOnContainers.Core/App.xaml.cs | 12 +++++----- .../Behaviors/LineColorBehavior.cs | 4 ++-- .../Controls/ToggleButton.cs | 6 +---- .../Models/Marketing/Campaign.cs | 6 ++--- .../Models/Marketing/CampaignItem.cs | 6 ++--- .../Models/Marketing/CampaignRoot.cs | 6 ++--- .../Models/Orders/Order.cs | 4 ++-- .../Services/Location/ILocationService.cs | 11 ++++----- .../Services/Location/LocationService.cs | 13 +++++----- .../Services/Marketing/CampaignMockService.cs | 6 ++--- .../Services/Marketing/CampaignService.cs | 10 ++++---- .../Services/Marketing/ICampaignService.cs | 4 ++-- .../Services/Navigation/NavigationService.cs | 5 ++-- .../Services/Order/IOrderService.cs | 1 - .../Services/Order/OrderService.cs | 3 +-- .../RequestProvider/HttpRequestExceptionEx.cs | 4 ---- .../RequestProvider/RequestProvider.cs | 2 +- .../Services/User/UserMockService.cs | 5 ++-- .../Services/User/UserService.cs | 10 +++----- .../ViewModels/Base/ViewModelBase.cs | 3 +-- .../ViewModels/Base/ViewModelLocator.cs | 24 +++++++++---------- .../ViewModels/BasketViewModel.cs | 4 ++-- .../ViewModels/CampaignDetailsViewModel.cs | 10 ++++---- .../ViewModels/CampaignViewModel.cs | 12 +++++----- .../ViewModels/CatalogViewModel.cs | 8 +++---- .../ViewModels/CheckoutViewModel.cs | 20 ++++++++-------- .../ViewModels/LoginViewModel.cs | 4 ++-- .../ViewModels/MainViewModel.cs | 6 ++--- .../ViewModels/OrderDetailViewModel.cs | 9 ++++--- .../ViewModels/ProfileViewModel.cs | 2 +- .../ViewModels/SettingsViewModel.cs | 14 +++++------ .../Views/CatalogView.xaml.cs | 6 ++--- .../Activities/MainActivity.cs | 14 +++++------ .../Effects/CircleEffect.cs | 8 +++---- .../Effects/EntryLineColorEffect.cs | 11 ++++----- .../MainApplication.cs | 2 +- .../Renderers/BadgeView.cs | 10 ++++---- .../Renderers/CustomTabbedPageRenderer.cs | 18 +++++++------- .../Renderers/SlideDownMenuPageRenderer.cs | 2 +- .../Services/SettingsServiceImplementation.cs | 6 ++--- .../MainApplication.cs | 5 ++-- .../App.xaml.cs | 3 +-- .../Behaviors/EventToCommandBehaviorTests.cs | 8 +++---- .../Mocks/MockSettingsService.cs | 4 ++-- .../Mocks/MockViewModel.cs | 6 ++--- .../Services/MarketingServiceTests.cs | 4 ++-- .../ViewModels/CatalogViewModelTests.cs | 12 +++++----- .../ViewModels/MainViewModelTests.cs | 6 ++--- .../ViewModels/MarketingViewModelTests.cs | 10 ++++---- .../ViewModels/MockViewModelTests.cs | 4 ++-- .../ViewModels/OrderViewModelTests.cs | 10 ++++---- .../Effects/EntryLineColorEffect.cs | 14 +++++------ .../Effects/CircleEffect.cs | 8 +++---- .../Renderers/SlideDownMenuPageRenderer.cs | 6 ++--- .../Services/SettingsServiceImplementation.cs | 6 ++--- 55 files changed, 197 insertions(+), 220 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs index a1178fbef..0270bb961 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs @@ -1,13 +1,13 @@ -using System.Globalization; -using eShopOnContainers.Services; -using eShopOnContainers.Core.ViewModels.Base; -using System.Threading.Tasks; -using eShopOnContainers.Core.Models.Location; +using eShopOnContainers.Core.Models.Location; using eShopOnContainers.Core.Services.Location; +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Services; using Plugin.Geolocator; +using System.Globalization; +using System.Threading.Tasks; using Xamarin.Forms; using Xamarin.Forms.Xaml; -using eShopOnContainers.Core.Services.Settings; [assembly: XamlCompilation(XamlCompilationOptions.Compile)] namespace eShopOnContainers diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Behaviors/LineColorBehavior.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Behaviors/LineColorBehavior.cs index 6ec5defaa..1a4ee4a72 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Behaviors/LineColorBehavior.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Behaviors/LineColorBehavior.cs @@ -1,6 +1,6 @@ -using System.Linq; +using eShopOnContainers.Core.Effects; +using System.Linq; using Xamarin.Forms; -using eShopOnContainers.Core.Effects; namespace eShopOnContainers.Core.Behaviors { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/ToggleButton.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/ToggleButton.cs index 3ef454bf4..735a60fa9 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/ToggleButton.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/ToggleButton.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; using System.Windows.Input; using Xamarin.Forms; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/Campaign.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/Campaign.cs index 5e04eae33..29c53264b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/Campaign.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/Campaign.cs @@ -1,7 +1,7 @@ -namespace eShopOnContainers.Core.Models.Marketing -{ - using System; +using System; +namespace eShopOnContainers.Core.Models.Marketing +{ public class Campaign { public int Id { get; set; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignItem.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignItem.cs index 70c5b24d1..c60c97fb2 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignItem.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignItem.cs @@ -1,7 +1,7 @@ -namespace eShopOnContainers.Core.Models.Marketing -{ - using System; +using System; +namespace eShopOnContainers.Core.Models.Marketing +{ public class CampaignItem { public int Id { get; set; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignRoot.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignRoot.cs index a4632ec64..70573dccc 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignRoot.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Marketing/CampaignRoot.cs @@ -1,7 +1,7 @@ -namespace eShopOnContainers.Core.Models.Marketing -{ - using System.Collections.Generic; +using System.Collections.Generic; +namespace eShopOnContainers.Core.Models.Marketing +{ public class CampaignRoot { public int PageIndex { get; set; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs index c9adfff14..0232e70ad 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/Order.cs @@ -1,6 +1,6 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; -using Newtonsoft.Json; namespace eShopOnContainers.Core.Models.Orders { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/ILocationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/ILocationService.cs index 8c4f6c2a6..31e990122 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/ILocationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/ILocationService.cs @@ -1,10 +1,9 @@ -namespace eShopOnContainers.Core.Services.Location -{ - using System.Threading.Tasks; - using Models.Location; - +using System.Threading.Tasks; + +namespace eShopOnContainers.Core.Services.Location +{ public interface ILocationService { - Task UpdateUserLocation(Location newLocReq, string token); + Task UpdateUserLocation(eShopOnContainers.Core.Models.Location.Location newLocReq, string token); } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs index ddb0606c0..deaa60936 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs @@ -1,10 +1,9 @@ -namespace eShopOnContainers.Core.Services.Location -{ - using System; - using System.Threading.Tasks; - using Models.Location; - using RequestProvider; +using System; +using System.Threading.Tasks; +using eShopOnContainers.Core.Services.RequestProvider; +namespace eShopOnContainers.Core.Services.Location +{ public class LocationService : ILocationService { private readonly IRequestProvider _requestProvider; @@ -14,7 +13,7 @@ _requestProvider = requestProvider; } - public async Task UpdateUserLocation(Location newLocReq, string token) + public async Task UpdateUserLocation(eShopOnContainers.Core.Models.Location.Location newLocReq, string token) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.LocationEndpoint); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs index edfde78fa..e24405b53 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs @@ -1,9 +1,9 @@ -using System; +using eShopOnContainers.Core.Models.Marketing; +using System; using System.Collections.ObjectModel; -using System.Threading.Tasks; using System.Linq; +using System.Threading.Tasks; using Xamarin.Forms; -using eShopOnContainers.Core.Models.Marketing; namespace eShopOnContainers.Core.Services.Marketing { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs index 7c3ab859e..cb74f11b0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs @@ -1,10 +1,10 @@ -using System; -using System.Collections.ObjectModel; -using System.Threading.Tasks; +using eShopOnContainers.Core.Extensions; using eShopOnContainers.Core.Models.Marketing; -using eShopOnContainers.Core.Services.RequestProvider; -using eShopOnContainers.Core.Extensions; using eShopOnContainers.Core.Services.FixUri; +using eShopOnContainers.Core.Services.RequestProvider; +using System; +using System.Collections.ObjectModel; +using System.Threading.Tasks; namespace eShopOnContainers.Core.Services.Marketing { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/ICampaignService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/ICampaignService.cs index d89ac0616..ec1b821ef 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/ICampaignService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/ICampaignService.cs @@ -1,6 +1,6 @@ -using System.Collections.ObjectModel; +using eShopOnContainers.Core.Models.Marketing; +using System.Collections.ObjectModel; using System.Threading.Tasks; -using eShopOnContainers.Core.Models.Marketing; namespace eShopOnContainers.Core.Services.Marketing { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs index d8308428a..3481cccf5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs @@ -1,13 +1,12 @@ -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.ViewModels; -using eShopOnContainers.Core.Views; using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Core.Views; using System; using System.Globalization; using System.Reflection; using System.Threading.Tasks; using Xamarin.Forms; -using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Services { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/IOrderService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/IOrderService.cs index 3503f7c2b..eb975180c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/IOrderService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/IOrderService.cs @@ -2,7 +2,6 @@ using System.Collections.ObjectModel; using System.Threading.Tasks; - namespace eShopOnContainers.Core.Services.Order { public interface IOrderService diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs index fc6a03a7e..f242971fb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs @@ -1,10 +1,9 @@ using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.Core.Services.RequestProvider; using System; using System.Collections.ObjectModel; -using System.Net.Http; using System.Threading.Tasks; -using eShopOnContainers.Core.Models.Orders; namespace eShopOnContainers.Core.Services.Order { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/HttpRequestExceptionEx.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/HttpRequestExceptionEx.cs index e88e74cc6..4ab0d27e6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/HttpRequestExceptionEx.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/HttpRequestExceptionEx.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Net.Http; -using System.Text; -using System.Threading.Tasks; namespace eShopOnContainers.Core.Services.RequestProvider { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs index 29afc24fd..f7d914beb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs @@ -2,11 +2,11 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; +using System; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; -using System; namespace eShopOnContainers.Core.Services.RequestProvider { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs index 69837c475..5b32bc296 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs @@ -1,5 +1,5 @@ -using System; -using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.Models.User; +using System; using System.Threading.Tasks; namespace eShopOnContainers.Core.Services.User @@ -29,7 +29,6 @@ namespace eShopOnContainers.Core.Services.User public async Task GetUserInfoAsync(string authToken) { await Task.Delay(500); - return MockUserInfo; } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs index d2e9728cc..e52d24489 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs @@ -1,7 +1,7 @@ -using eShopOnContainers.Core.Services.RequestProvider; +using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.Services.RequestProvider; using System; using System.Threading.Tasks; -using eShopOnContainers.Core.Models.User; namespace eShopOnContainers.Core.Services.User { @@ -17,12 +17,8 @@ namespace eShopOnContainers.Core.Services.User public async Task GetUserInfoAsync(string authToken) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.UserInfoEndpoint); - string uri = builder.ToString(); - - var userInfo = - await _requestProvider.GetAsync(uri, authToken); - + var userInfo = await _requestProvider.GetAsync(uri, authToken); return userInfo; } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs index 3d2381ab1..acb5e6636 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelBase.cs @@ -1,7 +1,6 @@ -using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Services; using System.Threading.Tasks; -using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Core.ViewModels.Base { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index a27d27796..22b8bc99d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -1,21 +1,21 @@ -using eShopOnContainers.Services; -using System; -using System.Globalization; -using System.Reflection; +using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Catalog; -using eShopOnContainers.Core.Services.OpenUrl; -using eShopOnContainers.Core.Services.RequestProvider; -using eShopOnContainers.Core.Services.Basket; +using eShopOnContainers.Core.Services.Dependency; +using eShopOnContainers.Core.Services.FixUri; using eShopOnContainers.Core.Services.Identity; -using eShopOnContainers.Core.Services.Order; -using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.Services.Location; using eShopOnContainers.Core.Services.Marketing; -using eShopOnContainers.Core.Services.Dependency; +using eShopOnContainers.Core.Services.OpenUrl; +using eShopOnContainers.Core.Services.Order; +using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.Core.Services.FixUri; -using Xamarin.Forms; +using eShopOnContainers.Core.Services.User; +using eShopOnContainers.Services; +using System; +using System.Globalization; +using System.Reflection; using TinyIoC; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels.Base { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs index 3d23adb6f..7350ee1b6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -1,7 +1,7 @@ -using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Models.Basket; using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.Basket; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.ViewModels.Base; using System.Collections.ObjectModel; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs index d24e2f6cf..2e0275f8b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignDetailsViewModel.cs @@ -1,10 +1,10 @@ -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Marketing; +using eShopOnContainers.Core.Services.Marketing; +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.ViewModels.Base; +using System.Threading.Tasks; using System.Windows.Input; using Xamarin.Forms; -using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.Core.Models.Marketing; -using eShopOnContainers.Core.Services.Marketing; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs index ee79136f5..53f7cb847 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CampaignViewModel.cs @@ -1,11 +1,11 @@ -using System.Threading.Tasks; -using System.Windows.Input; -using Xamarin.Forms; -using System.Collections.ObjectModel; -using eShopOnContainers.Core.Models.Marketing; +using eShopOnContainers.Core.Models.Marketing; using eShopOnContainers.Core.Services.Marketing; -using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.ViewModels.Base; +using System.Collections.ObjectModel; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs index 0a4f52139..1554f7fb0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs @@ -1,10 +1,10 @@ -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Catalog; +using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.ViewModels.Base; using System.Collections.ObjectModel; -using Xamarin.Forms; -using eShopOnContainers.Core.Models.Catalog; -using eShopOnContainers.Core.Services.Catalog; +using System.Threading.Tasks; using System.Windows.Input; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs index f9ed8c05d..4eb9010a3 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs @@ -1,18 +1,18 @@ -using eShopOnContainers.Core.Models.Navigation; -using eShopOnContainers.Core.ViewModels.Base; -using System.Windows.Input; -using Xamarin.Forms; -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Models.Navigation; using eShopOnContainers.Core.Models.Orders; -using System; -using System.Collections.ObjectModel; -using eShopOnContainers.Core.Models.Basket; -using System.Collections.Generic; +using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Order; using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Services.User; -using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.ViewModels.Base; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs index 5f6630159..02711fb39 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs @@ -1,7 +1,7 @@ -using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Identity; using eShopOnContainers.Core.Services.OpenUrl; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.Validations; using eShopOnContainers.Core.ViewModels.Base; using IdentityModel.Client; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs index 592d6b831..77ecf16c9 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs @@ -1,8 +1,8 @@ -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Navigation; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Models.Navigation; -using Xamarin.Forms; +using System.Threading.Tasks; using System.Windows.Input; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs index 416183935..07ad7fffd 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs @@ -1,10 +1,9 @@ -using System.Threading.Tasks; -using eShopOnContainers.Core.Models.Orders; -using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.Core.Services.Order; -using System; -using System.Windows.Input; using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.ViewModels.Base; +using System.Threading.Tasks; +using System.Windows.Input; using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs index 327bdb8d2..b54814a15 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs @@ -2,12 +2,12 @@ using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Order; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.ViewModels.Base; using System.Collections.ObjectModel; using System.Threading.Tasks; using System.Windows.Input; using Xamarin.Forms; -using eShopOnContainers.Core.Services.Settings; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs index 060d2ce69..1e478b85c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs @@ -1,13 +1,13 @@ -using System.Globalization; -using System.Windows.Input; -using Xamarin.Forms; -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Location; using eShopOnContainers.Core.Models.User; -using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Models.Location; using eShopOnContainers.Core.Services.Location; -using Plugin.Geolocator; using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.ViewModels.Base; +using Plugin.Geolocator; +using System.Globalization; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs index 792b93b5c..32c6b82c1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml.cs @@ -1,8 +1,8 @@ -using System; +using eShopOnContainers.Core.ViewModels; +using eShopOnContainers.Core.ViewModels.Base; using SlideOverKit; +using System; using Xamarin.Forms; -using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.ViewModels; namespace eShopOnContainers.Core.Views { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs index d1dacc488..d72898f40 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs @@ -1,15 +1,15 @@ -using Android.App; -using Android.OS; -using Android.Content.PM; -using Android.Views; -using Xamarin.Forms.Platform.Android; -using FFImageLoading.Forms.Droid; using Acr.UserDialogs; +using Android.App; using Android.Content; +using Android.Content.PM; +using Android.OS; using Android.Runtime; +using Android.Views; using FFImageLoading; -using System; +using FFImageLoading.Forms.Droid; using Plugin.Permissions; +using System; +using Xamarin.Forms.Platform.Android; namespace eShopOnContainers.Droid.Activities { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/CircleEffect.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/CircleEffect.cs index c1ed78cb3..a8bbd3f18 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/CircleEffect.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/CircleEffect.cs @@ -1,8 +1,8 @@ -using System; -using Xamarin.Forms; -using eShopOnContainers.Droid.Effects; +using Android.Graphics; using Android.Views; -using Android.Graphics; +using eShopOnContainers.Droid.Effects; +using System; +using Xamarin.Forms; [assembly: ExportEffect(typeof(CircleEffect), "CircleEffect")] namespace eShopOnContainers.Droid.Effects diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/EntryLineColorEffect.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/EntryLineColorEffect.cs index 0d539bcbc..36a31951b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/EntryLineColorEffect.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/EntryLineColorEffect.cs @@ -1,11 +1,10 @@ -using Xamarin.Forms; -using eShopOnContainers.Droid.Effects; -using Xamarin.Forms.Platform.Android; -using System; using Android.Widget; using eShopOnContainers.Core.Behaviors; +using eShopOnContainers.Droid.Effects; +using System; using System.ComponentModel; -using System.Diagnostics; +using Xamarin.Forms; +using Xamarin.Forms.Platform.Android; [assembly: ResolutionGroupName("eShopOnContainers")] [assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")] @@ -52,7 +51,7 @@ namespace eShopOnContainers.Droid.Effects } catch (Exception ex) { - Debug.WriteLine(ex.Message); + Console.WriteLine(ex.Message); } } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/MainApplication.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/MainApplication.cs index ee3f128e8..74e5a3883 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/MainApplication.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/MainApplication.cs @@ -1,8 +1,8 @@ -using System; using Android.App; using Android.OS; using Android.Runtime; using Plugin.CurrentActivity; +using System; namespace eShopOnContainers.Droid { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/BadgeView.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/BadgeView.cs index 86e739693..e824c3f36 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/BadgeView.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/BadgeView.cs @@ -1,12 +1,12 @@ -using System; using Android.Content; -using Android.Views; -using Android.Widget; +using Android.Graphics; using Android.Graphics.Drawables; -using Android.Views.Animations; using Android.Graphics.Drawables.Shapes; using Android.Util; -using Android.Graphics; +using Android.Views; +using Android.Views.Animations; +using Android.Widget; +using System; namespace eShopOnContainers.Droid.Renderers { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/CustomTabbedPageRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/CustomTabbedPageRenderer.cs index 525cfcedc..2191c2247 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/CustomTabbedPageRenderer.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/CustomTabbedPageRenderer.cs @@ -1,18 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Xamarin.Forms.Platform.Android.AppCompat; -using Xamarin.Forms; using Android.Content; +using Android.Graphics; using Android.Support.Design.Widget; +using Android.Support.V4.View; using Android.Views; using Android.Widget; -using Xamarin.Forms.Platform.Android; -using eShopOnContainers.Droid.Extensions; using eShopOnContainers.Core.Controls; +using eShopOnContainers.Droid.Extensions; using eShopOnContainers.Droid.Renderers; -using Android.Support.V4.View; -using Android.Graphics; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Xamarin.Forms; +using Xamarin.Forms.Platform.Android; +using Xamarin.Forms.Platform.Android.AppCompat; [assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))] namespace eShopOnContainers.Droid.Renderers diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/SlideDownMenuPageRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/SlideDownMenuPageRenderer.cs index 714a86c9b..1a95a68f6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/SlideDownMenuPageRenderer.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/SlideDownMenuPageRenderer.cs @@ -1,7 +1,7 @@ using Android.Content; -using SlideOverKit.Droid; using eShopOnContainers.Core.Views; using eShopOnContainers.Droid.Renderers; +using SlideOverKit.Droid; using System; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs index 020237d93..c5323c7b9 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs @@ -1,9 +1,9 @@ -using System; -using eShopOnContainers.Core.Services.Settings; -using Android.App; +using Android.App; using Android.Content; using Android.Preferences; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Droid.Services; +using System; [assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] namespace eShopOnContainers.Droid.Services diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/MainApplication.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/MainApplication.cs index 770fedc82..f950dba1f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/MainApplication.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/MainApplication.cs @@ -1,13 +1,12 @@ -using System; - using Android.App; using Android.OS; using Android.Runtime; using Plugin.CurrentActivity; +using System; namespace eShopOnContainers.TestRunner.Droid { - //You can specify additional application information in this attribute + //You can specify additional application information in this attribute [Application] public class MainApplication : Application, Application.IActivityLifecycleCallbacks { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/App.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/App.xaml.cs index 632e51fa8..0d3fc41d7 100755 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/App.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/App.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Reflection; +using System.Reflection; using Windows.ApplicationModel.Activation; using Xunit.Runners.UI; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Behaviors/EventToCommandBehaviorTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Behaviors/EventToCommandBehaviorTests.cs index ce6ce8f96..85ef11b7a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Behaviors/EventToCommandBehaviorTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Behaviors/EventToCommandBehaviorTests.cs @@ -1,11 +1,11 @@ -using Xunit; -using Xamarin.Forms; -using System; +using System; using System.Globalization; +using Xamarin.Forms; +using Xunit; namespace eShopOnContainers.UnitTests { - public class EventToCommandBehaviorTests + public class EventToCommandBehaviorTests { [Fact] public void InvalidEventNameShouldThrowArgumentExceptionText() diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs index c47c4e262..23e1cedc5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs @@ -1,5 +1,5 @@ -using System; -using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.Services.Settings; +using System; namespace eShopOnContainers.UnitTests.Mocks { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockViewModel.cs index 64acab458..784be1952 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockViewModel.cs @@ -1,9 +1,9 @@ -using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Validations; +using eShopOnContainers.Core.Validations; +using eShopOnContainers.Core.ViewModels.Base; namespace eShopOnContainers.UnitTests { - public class MockViewModel : ViewModelBase + public class MockViewModel : ViewModelBase { private ValidatableObject _forename; private ValidatableObject _surname; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs index 32091eaa4..3de1e3706 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Services/MarketingServiceTests.cs @@ -1,6 +1,6 @@ -using System.Threading.Tasks; -using eShopOnContainers.Core; +using eShopOnContainers.Core; using eShopOnContainers.Core.Services.Marketing; +using System.Threading.Tasks; using Xunit; namespace eShopOnContainers.UnitTests.Services diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs index 2da535d10..dc9c421eb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/CatalogViewModelTests.cs @@ -1,12 +1,12 @@ -using Xunit; -using eShopOnContainers.Core.ViewModels; -using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.Catalog; -using eShopOnContainers.Core.Models.Catalog; -using System.Threading.Tasks; -using System.Linq; using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.ViewModels; +using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.UnitTests.Mocks; +using System.Linq; +using System.Threading.Tasks; +using Xunit; namespace eShopOnContainers.UnitTests { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs index 94e0dabfc..bdf9430db 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MainViewModelTests.cs @@ -1,10 +1,10 @@ -using Xunit; +using eShopOnContainers.Core.Models.Navigation; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Models.Navigation; -using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.UnitTests.Mocks; using System.Threading.Tasks; +using Xunit; namespace eShopOnContainers.UnitTests { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs index c05520535..884aa2a2d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MarketingViewModelTests.cs @@ -1,10 +1,10 @@ -using System.Threading.Tasks; -using Xunit; -using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Services.Marketing; +using eShopOnContainers.Core.Services.Marketing; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.ViewModels; +using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.UnitTests.Mocks; -using eShopOnContainers.Core.Services.Settings; +using System.Threading.Tasks; +using Xunit; namespace eShopOnContainers.UnitTests.ViewModels { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs index 84a11ed53..71ff88bed 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/MockViewModelTests.cs @@ -1,5 +1,5 @@ -using Xunit; -using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.Core.ViewModels.Base; +using Xunit; namespace eShopOnContainers.UnitTests { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs index ddd86720b..832f0bc5f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/ViewModels/OrderViewModelTests.cs @@ -1,11 +1,11 @@ -using Xunit; -using eShopOnContainers.Core; +using eShopOnContainers.Core; +using eShopOnContainers.Core.Services.Order; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.Core.Services.Order; -using System.Threading.Tasks; using eShopOnContainers.UnitTests.Mocks; -using eShopOnContainers.Core.Services.Settings; +using System.Threading.Tasks; +using Xunit; namespace eShopOnContainers.UnitTests { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Effects/EntryLineColorEffect.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Effects/EntryLineColorEffect.cs index 5dfbce19e..c7979b12e 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Effects/EntryLineColorEffect.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Effects/EntryLineColorEffect.cs @@ -1,14 +1,14 @@ -using System; +using eShopOnContainers.Core.Behaviors; +using eShopOnContainers.Windows.Effects; +using System; using System.ComponentModel; using System.Diagnostics; -using UI = Windows.UI; -using Xaml = Windows.UI.Xaml; -using Media = Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Controls; using Xamarin.Forms; using Xamarin.Forms.Platform.UWP; -using Windows.UI.Xaml.Controls; -using eShopOnContainers.Windows.Effects; -using eShopOnContainers.Core.Behaviors; +using Media = Windows.UI.Xaml.Media; +using UI = Windows.UI; +using Xaml = Windows.UI.Xaml; [assembly: ResolutionGroupName("eShopOnContainers")] [assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")] diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Effects/CircleEffect.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Effects/CircleEffect.cs index 307227e1c..293c9fd41 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Effects/CircleEffect.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Effects/CircleEffect.cs @@ -1,9 +1,9 @@ -using System; +using CoreAnimation; +using CoreGraphics; +using eShopOnContainers.iOS.Effects; +using System; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; -using eShopOnContainers.iOS.Effects; -using CoreGraphics; -using CoreAnimation; [assembly: ExportEffect(typeof(CircleEffect), "CircleEffect")] namespace eShopOnContainers.iOS.Effects diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/SlideDownMenuPageRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/SlideDownMenuPageRenderer.cs index 61539fa66..4a08777e9 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/SlideDownMenuPageRenderer.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/SlideDownMenuPageRenderer.cs @@ -1,8 +1,8 @@ -using System; -using CoreGraphics; +using CoreGraphics; using eShopOnContainers.Core.Views; using eShopOnContainers.iOS; using SlideOverKit.iOS; +using System; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; @@ -10,7 +10,7 @@ using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(CatalogView), typeof(SlideDownMenuPageRenderer))] namespace eShopOnContainers.iOS { - public class SlideDownMenuPageRenderer : PageRenderer, ISlideOverKitPageRendereriOS + public class SlideDownMenuPageRenderer : PageRenderer, ISlideOverKitPageRendereriOS { public Action ViewDidAppearEvent { get; set; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs index 88c3ad824..b04b49b01 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs @@ -1,7 +1,7 @@ -using System; -using Foundation; -using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Core.Services.Settings; using eShopOnContainers.iOS.Services; +using Foundation; +using System; [assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] namespace eShopOnContainers.iOS.Services From 4d0d69b5502bc4053a14de0f0f392fc32020e8d6 Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 17 Jan 2018 12:55:38 +0000 Subject: [PATCH 6/8] Added settings implementation to Windows project. --- .../Services/SettingsServiceImplementation.cs | 99 +++++++++++++++++++ .../eShopOnContainers.Windows.csproj | 1 + 2 files changed, 100 insertions(+) create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs new file mode 100644 index 000000000..e13fafd9f --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs @@ -0,0 +1,99 @@ +using eShopOnContainers.Core.Services.Settings; +using eShopOnContainers.Windows.Services; +using Windows.Storage; + +[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] +namespace eShopOnContainers.Windows.Services +{ + public class SettingsServiceImplementation : ISettingsServiceImplementation + { + #region Internal Implementation + + readonly object _locker = new object(); + + ApplicationDataContainer GetAppSettings() + { + return ApplicationData.Current.LocalSettings; + } + + bool AddOrUpdateValueInternal(string key, T value) + { + bool valueChanged = false; + + if (value == null) + { + Remove(key); + return true; + } + + lock (_locker) + { + var settings = GetAppSettings(); + if (settings.Values.ContainsKey(key)) + { + if (settings.Values[key] != (object)value) + { + settings.Values[key] = value; + valueChanged = true; + } + } + else + { + settings.Values[key] = value; + valueChanged = true; + } + } + + return valueChanged; + } + + T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) + { + object value; + + lock (_locker) + { + var settings = GetAppSettings(); + if (settings.Values.ContainsKey(key)) + { + var tempValue = settings.Values[key]; + if (tempValue != null) + value = (T)tempValue; + else + value = defaultValue; + } + else + { + value = defaultValue; + } + } + return null != value ? (T)value : defaultValue; + } + + #endregion + + #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) + { + lock (_locker) + { + var settings = GetAppSettings(); + if (settings.Values.ContainsKey(key)) + { + settings.Values.Remove(key); + } + } + } + + #endregion + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj index 79d4d6572..ae5286efb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj @@ -121,6 +121,7 @@ + From 3cbd0b6430eda685844564fdcd5b80b9a816d051 Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 17 Jan 2018 13:01:16 +0000 Subject: [PATCH 7/8] Removed unnecessary .csproj items. --- .../eShopOnContainers.Core/eShopOnContainers.Core.csproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj index d73b2b76a..06de19f11 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj @@ -15,10 +15,4 @@ - - - - - - From 940ddd529754f7d8483e4c359ce2c1be82dba905 Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 17 Jan 2018 13:07:17 +0000 Subject: [PATCH 8/8] Regions added. --- .../Services/SettingsServiceImplementation.cs | 4 ++++ .../Services/SettingsServiceImplementation.cs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs index c5323c7b9..7cdce4555 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs @@ -10,6 +10,8 @@ namespace eShopOnContainers.Droid.Services { public class SettingsServiceImplementation : ISettingsServiceImplementation { + #region Internal Implementation + readonly object _locker = new object(); ISharedPreferences GetSharedPreference() @@ -112,6 +114,8 @@ namespace eShopOnContainers.Droid.Services } } + #endregion + #region ISettingsServiceImplementation public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs index b04b49b01..ee17b8ff7 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs @@ -8,6 +8,8 @@ namespace eShopOnContainers.iOS.Services { public class SettingsServiceImplementation : ISettingsServiceImplementation { + #region Internal Implementation + readonly object _locker = new object(); NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults; @@ -89,6 +91,8 @@ namespace eShopOnContainers.iOS.Services } } + #endregion + #region ISettingsServiceImplementation public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value);