From 7d55e943fb95321d216d7281cf976ac94b04e8b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez=20Ruiz?= Date: Mon, 21 Nov 2016 16:24:38 +0100 Subject: [PATCH] Finished UWP tab renderer (Badges) Change dynamically services (DI) --- .../eShopOnContainers.Core/GlobalSettings.cs | 2 +- .../Models/Catalog/CatalogRoot.cs | 12 + .../Services/Catalog/CatalogService.cs | 37 +- .../RequestProvider/RequestProvider.cs | 3 +- .../ViewModels/Base/ViewModelLocator.cs | 29 ++ .../ViewModels/SettingsViewModel.cs | 26 +- .../Views/SettingsView.xaml | 4 +- .../eShopOnContainers.Core/app.config | 2 +- .../eShopOnContainers.Core.csproj | 5 +- .../eShopOnContainers.Core/packages.config | 2 +- .../eShopOnContainers.Droid/app.config | 2 +- .../eShopOnContainers.Droid.csproj | 5 +- .../eShopOnContainers.Droid/packages.config | 25 +- .../app.config | 8 + .../Entitlements.plist | 3 +- .../app.config | 2 +- .../eShopOnContainers.UnitTests/app.config | 11 + .../eShopOnContainers.UnitTests.csproj | 1 + .../eShopOnContainers.Windows/App.xaml | 24 +- .../Controls/TabItem.xaml | 29 +- .../Controls/TabItem.xaml.cs | 9 +- .../Converters/TabBadgeColorConverter.cs | 31 ++ .../Converters/TabBadgeTextConverter.cs | 27 ++ .../Converters/TabIconConverter.cs | 24 ++ .../Extensions/VisualTreeExtensions.cs | 375 ++++++++++++++++++ .../Helpers/ColorHelper.cs | 16 + .../eShopOnContainers.Windows/MainPage.xaml | 1 - .../Renderers/CustomTabbedPageRenderer.cs | 52 ++- .../Renderers/SlideDownMenuPageRenderer.cs | 1 - .../eShopOnContainers.Windows.csproj | 5 + .../eShopOnContainers.Windows/project.json | 1 + .../eShopOnContainers.iOS/app.config | 2 +- .../eShopOnContainers.iOS.csproj | 4 +- .../eShopOnContainers.iOS/packages.config | 2 +- 34 files changed, 734 insertions(+), 48 deletions(-) create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogRoot.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/app.config create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeColorConverter.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeTextConverter.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabIconConverter.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Extensions/VisualTreeExtensions.cs create mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Helpers/ColorHelper.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 85743a571..551e94c96 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -4,6 +4,6 @@ { public const string RegisterWebsite = "http://104.40.62.65/Account/Register"; - public const string CatalogEndpoint = "http://104.40.62.65:5101/api/v1/catalog"; + public const string CatalogEndpoint = "http://104.40.62.65:5101/"; } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogRoot.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogRoot.cs new file mode 100644 index 000000000..eef40f88b --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogRoot.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace eShopOnContainers.Core.Models.Catalog +{ + public class CatalogRoot + { + public int PageIndex { get; set; } + public int PageSize { get; set; } + public int Count { get; set; } + public List Data { get; set; } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs index 03cc0bb4c..a629cdb58 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs @@ -3,7 +3,6 @@ using System.Collections.ObjectModel; using System.Threading.Tasks; using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.RequestProvider; -using System.Collections.Generic; using eShopOnContainers.Core.Extensions; namespace eShopOnContainers.Core.Services.Catalog @@ -12,6 +11,18 @@ namespace eShopOnContainers.Core.Services.Catalog { private readonly IRequestProvider _requestProvider; + private ObservableCollection MockCatalogBrand = new ObservableCollection + { + new CatalogBrand { CatalogBrandId = 1, Name = "Azure" }, + new CatalogBrand { CatalogBrandId = 2, Name = "Visual Studio" } + }; + + private ObservableCollection MockCatalogType = new ObservableCollection + { + new CatalogType { CatalogTypeId = 1, Name = "Mug" }, + new CatalogType { CatalogTypeId = 2, Name = "T-Shirt" } + }; + public CatalogService(IRequestProvider requestProvider) { _requestProvider = requestProvider; @@ -26,29 +37,35 @@ namespace eShopOnContainers.Core.Services.Catalog { UriBuilder builder = new UriBuilder(GlobalSetting.CatalogEndpoint); - builder.Path = "/items"; + builder.Path = "api/v1/catalog/items"; string uri = builder.ToString(); - IEnumerable catalogItems = - await _requestProvider.GetAsync>(uri); + System.Diagnostics.Debug.WriteLine(uri); + + CatalogRoot catalog = + await _requestProvider.GetAsync(uri); - return catalogItems.ToObservableCollection(); + return catalog?.Data?.ToObservableCollection(); } - public Task> GetCatalogBrandAsync() + public Task GetCatalogItemAsync(string id) { throw new NotImplementedException(); } - public Task GetCatalogItemAsync(string id) + public async Task> GetCatalogBrandAsync() { - throw new NotImplementedException(); + await Task.Delay(500); + + return MockCatalogBrand; } - public Task> GetCatalogTypeAsync() + public async Task> GetCatalogTypeAsync() { - throw new NotImplementedException(); + await Task.Delay(500); + + return MockCatalogType; } } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs index 06fb1aadb..75a92ad12 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs @@ -34,7 +34,8 @@ namespace eShopOnContainers.Core.Services.RequestProvider await HandleResponse(response); string serialized = await response.Content.ReadAsStringAsync(); - TResult result = await Task.Run(() => JsonConvert.DeserializeObject(serialized, _serializerSettings)); + TResult result = await Task.Run(() => + JsonConvert.DeserializeObject(serialized, _serializerSettings)); return result; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index b30ac27a6..46b01ba55 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -6,11 +6,13 @@ using System; using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.Services.OpenUrl; using eShopOnContainers.Core.Services.User; +using eShopOnContainers.Core.Services.RequestProvider; namespace eShopOnContainers.ViewModels.Base { public class ViewModelLocator { + private bool _useMockService; private readonly IUnityContainer _unityContainer; private static readonly ViewModelLocator _instance = new ViewModelLocator(); @@ -20,6 +22,12 @@ namespace eShopOnContainers.ViewModels.Base get { return _instance; } } + public bool UseMockService + { + get { return _useMockService; } + set { _useMockService = value; ; } + } + protected ViewModelLocator() { _unityContainer = new UnityContainer(); @@ -28,6 +36,7 @@ namespace eShopOnContainers.ViewModels.Base _unityContainer.RegisterType(); RegisterSingleton(); _unityContainer.RegisterType(); + _unityContainer.RegisterType(); _unityContainer.RegisterType(); _unityContainer.RegisterType(); @@ -44,6 +53,26 @@ namespace eShopOnContainers.ViewModels.Base _unityContainer.RegisterType(); } + public void UpdateServices(bool useMockServices) + { + if (!useMockServices) + { + _unityContainer.RegisterInstance(new CatalogMockService()); + _unityContainer.RegisterInstance(new OrdersMockService()); + _unityContainer.RegisterInstance(new UserMockService()); + + UseMockService = false; + } + else + { + var requestProvider = Resolve(); + _unityContainer.RegisterInstance(new CatalogService(requestProvider)); + + UseMockService = true; + } + } + + public T Resolve() { return _unityContainer.Resolve(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs index 659a921c8..e1fea8416 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs @@ -1,9 +1,33 @@ using eShopOnContainers.ViewModels.Base; +using System.Windows.Input; +using Xamarin.Forms; namespace eShopOnContainers.Core.ViewModels { public class SettingsViewModel : ViewModelBase { + private bool _useMockServices; + public SettingsViewModel() + { + UseMockServices = ViewModelLocator.Instance.UseMockService; + } + + public bool UseMockServices + { + get { return _useMockServices; } + set + { + _useMockServices = value; + RaisePropertyChanged(() => UseMockServices); + } + } + + public ICommand MockServicesCommand => new Command(MockServices); + + private void MockServices() + { + ViewModelLocator.Instance.UpdateServices(UseMockServices); + } } -} +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml index 07940ff25..f1e431a31 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml @@ -77,7 +77,9 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj index bca73f49f..c0ff005dd 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj @@ -65,6 +65,7 @@ + @@ -193,8 +194,8 @@ ..\..\packages\modernhttpclient.2.4.2\lib\Portable-Net45+WinRT45+WP8+WPA81\ModernHttpClient.dll True - - ..\..\packages\Newtonsoft.Json.8.0.3\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll True diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/packages.config index f6105022e..74cc37be9 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/packages.config @@ -6,7 +6,7 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/app.config b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/app.config index 056e15e6f..9f0d092be 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/app.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/app.config @@ -16,7 +16,7 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj index 36e22dc99..ab4f318a0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj @@ -93,6 +93,7 @@ ..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\FormsViewGroup.dll True + ..\..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll True @@ -107,8 +108,8 @@ - - ..\..\packages\Newtonsoft.Json.8.0.3\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.9.0.2-beta1\lib\netstandard1.1\Newtonsoft.Json.dll True diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config index e3796dd6d..361673552 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config @@ -4,11 +4,34 @@ + - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/app.config b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/app.config index 5aab6c784..67aad9568 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/app.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/app.config @@ -6,6 +6,14 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Entitlements.plist b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Entitlements.plist index 24c310368..0c67376eb 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Entitlements.plist +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/Entitlements.plist @@ -1,6 +1,5 @@ - - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/app.config b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/app.config index 34e9089b4..0cfd7f7d6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/app.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/app.config @@ -8,7 +8,7 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/app.config b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/app.config new file mode 100644 index 000000000..8460dd432 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ 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 c21ad9366..dc309254a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj @@ -58,6 +58,7 @@ + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml index 74b399cba..18dd6df8e 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/App.xaml @@ -3,12 +3,22 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:eShopOnContainers.UWP" + xmlns:converters="using:eShopOnContainers.Windows.Converters" + xmlns:controls="using:eShopOnContainers.Windows.Controls" RequestedTheme="Light"> + #00A69C + #83D01B + + + + + + + + + + + + + + - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml index 3b961b46e..125ef87d1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml @@ -1,4 +1,5 @@  + +