diff --git a/eShopOnContainers.sln b/eShopOnContainers.sln
index 5fe74cfe3..f8d0a28df 100644
--- a/eShopOnContainers.sln
+++ b/eShopOnContainers.sln
@@ -60,6 +60,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Targets", "Targets", "{9CC7
EndProject
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "eShopOnContainers.WebSPA", "src\Web\WebSPA\eShopOnContainers.WebSPA\eShopOnContainers.WebSPA.xproj", "{9842DB3A-1391-48C7-A49C-2FABD0A18AC2}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile Apps", "Mobile Apps", "{B7B1D395-4E06-4036-BE86-C216756B9367}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UnitTests", "src\Mobile\eShopOnContainers\eShopOnContainers.UnitTests\eShopOnContainers.UnitTests.csproj", "{F7B6A162-BC4D-4924-B16A-713F9B0344E7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Droid", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Droid\eShopOnContainers.TestRunner.Droid.csproj", "{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Windows", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.Windows\eShopOnContainers.TestRunner.Windows.csproj", "{02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.iOS", "src\Mobile\eShopOnContainers\eShopOnContainers.TestRunner.iOS\eShopOnContainers.TestRunner.iOS.csproj", "{B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -556,6 +566,218 @@ Global
{9842DB3A-1391-48C7-A49C-2FABD0A18AC2}.Release|x64.Build.0 = Release|Any CPU
{9842DB3A-1391-48C7-A49C-2FABD0A18AC2}.Release|x86.ActiveCfg = Release|Any CPU
{9842DB3A-1391-48C7-A49C-2FABD0A18AC2}.Release|x86.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|ARM.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x64.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x86.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|ARM.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x64.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x86.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|ARM.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|ARM.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhone.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x64.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x64.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x86.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|ARM.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|ARM.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhone.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x64.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x64.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x86.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|ARM.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x64.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x86.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|ARM.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|ARM.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|ARM.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhone.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x64.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x64.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x64.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x86.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x86.Deploy.0 = Release|Any CPU
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|Any CPU.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|Any CPU.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|Any CPU.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|ARM.Build.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|ARM.Deploy.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhone.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhone.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhone.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x64.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x64.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x64.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x86.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x86.Build.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x86.Deploy.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|Any CPU.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|Any CPU.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|Any CPU.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|ARM.ActiveCfg = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|ARM.Build.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|ARM.Deploy.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhone.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhone.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhone.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhoneSimulator.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhoneSimulator.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhoneSimulator.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x64.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x64.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x64.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x86.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x86.Build.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x86.Deploy.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|ARM.Build.0 = Debug|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|ARM.Deploy.0 = Debug|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|iPhone.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x64.ActiveCfg = Debug|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x64.Build.0 = Debug|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x64.Deploy.0 = Debug|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x86.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x86.Build.0 = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x86.Deploy.0 = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|Any CPU.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|ARM.ActiveCfg = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|ARM.Build.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|ARM.Deploy.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|iPhone.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x64.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x64.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x64.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x86.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x86.Build.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x86.Deploy.0 = Release|x86
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|ARM.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|x64.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|x86.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|Any CPU.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhone.Build.0 = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|x64.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|x86.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|ARM.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhone.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhone.Build.0 = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|x64.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|x86.ActiveCfg = Release|iPhone
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -584,5 +806,10 @@ Global
{778289CA-31F7-4464-8C2A-612EE846F8A7} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
{9CC7814B-72A6-465B-A61C-57B512DEE303} = {F61357CE-1CC2-410E-8776-B16EEBC98EB8}
{9842DB3A-1391-48C7-A49C-2FABD0A18AC2} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04}
+ {B7B1D395-4E06-4036-BE86-C216756B9367} = {A857AD10-40FF-4303-BEC2-FF1C58D5735E}
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7} = {B7B1D395-4E06-4036-BE86-C216756B9367}
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1} = {B7B1D395-4E06-4036-BE86-C216756B9367}
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F} = {B7B1D395-4E06-4036-BE86-C216756B9367}
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} = {B7B1D395-4E06-4036-BE86-C216756B9367}
EndGlobalSection
EndGlobal
diff --git a/src/Mobile/eShopOnContainers.Xamarin.sln b/src/Mobile/eShopOnContainers.Xamarin.sln
index 7082291a3..242b4a36e 100644
--- a/src/Mobile/eShopOnContainers.Xamarin.sln
+++ b/src/Mobile/eShopOnContainers.Xamarin.sln
@@ -15,6 +15,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared Code", "Shared Code"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Targets", "Targets", "{8F848898-6B21-4905-AE2E-B3ABDEDA1963}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{71D6317D-AF0F-46FE-91DA-B0556911FC4B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UnitTests", "eShopOnContainers\eShopOnContainers.UnitTests\eShopOnContainers.UnitTests.csproj", "{F7B6A162-BC4D-4924-B16A-713F9B0344E7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Droid", "eShopOnContainers\eShopOnContainers.TestRunner.Droid\eShopOnContainers.TestRunner.Droid.csproj", "{A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.iOS", "eShopOnContainers\eShopOnContainers.TestRunner.iOS\eShopOnContainers.TestRunner.iOS.csproj", "{B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.TestRunner.Windows", "eShopOnContainers\eShopOnContainers.TestRunner.Windows\eShopOnContainers.TestRunner.Windows.csproj", "{02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -260,6 +270,220 @@ Global
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.ActiveCfg = Release|x86
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.Build.0 = Release|x86
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B}.Release|x86.Deploy.0 = Release|x86
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|ARM.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x64.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.AppStore|x86.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|ARM.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x64.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Debug|x86.Build.0 = Debug|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|ARM.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|ARM.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhone.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x64.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x64.Build.0 = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x86.ActiveCfg = Release|Any CPU
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7}.Release|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|ARM.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|ARM.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhone.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x64.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x64.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.AppStore|x86.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|ARM.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x64.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x86.Build.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|ARM.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|ARM.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|ARM.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhone.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x64.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x64.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x64.Deploy.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x86.ActiveCfg = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x86.Build.0 = Release|Any CPU
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1}.Release|x86.Deploy.0 = Release|Any CPU
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|ARM.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|x64.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.AppStore|x86.ActiveCfg = AppStore|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|Any CPU.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhone.Build.0 = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|x64.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Debug|x86.ActiveCfg = Debug|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|ARM.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhone.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhone.Build.0 = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|x64.ActiveCfg = Release|iPhone
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3}.Release|x86.ActiveCfg = Release|iPhone
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|Any CPU.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|Any CPU.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|Any CPU.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|ARM.Build.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|ARM.Deploy.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhone.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhone.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhone.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x64.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x64.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x64.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x86.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x86.Build.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Ad-Hoc|x86.Deploy.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|Any CPU.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|Any CPU.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|Any CPU.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|ARM.ActiveCfg = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|ARM.Build.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|ARM.Deploy.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhone.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhone.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhone.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhoneSimulator.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhoneSimulator.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|iPhoneSimulator.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x64.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x64.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x64.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x86.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x86.Build.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.AppStore|x86.Deploy.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|ARM.Build.0 = Debug|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|ARM.Deploy.0 = Debug|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|iPhone.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|iPhoneSimulator.Build.0 = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x64.ActiveCfg = Debug|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x64.Build.0 = Debug|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x64.Deploy.0 = Debug|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x86.ActiveCfg = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x86.Build.0 = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Debug|x86.Deploy.0 = Debug|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|Any CPU.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|ARM.ActiveCfg = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|ARM.Build.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|ARM.Deploy.0 = Release|ARM
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|iPhone.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x64.ActiveCfg = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x64.Build.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x64.Deploy.0 = Release|x64
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x86.ActiveCfg = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x86.Build.0 = Release|x86
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -269,5 +493,9 @@ Global
{6EEB23DC-7063-4444-9AF8-90DF24F549C0} = {8F848898-6B21-4905-AE2E-B3ABDEDA1963}
{65116D1C-145B-4693-ABDA-F0FB6F425191} = {65D002E7-E869-491C-ABA8-9650CEAF677A}
{C3C1E2CF-B1F7-4654-BBDC-50143DB22E0B} = {8F848898-6B21-4905-AE2E-B3ABDEDA1963}
+ {F7B6A162-BC4D-4924-B16A-713F9B0344E7} = {71D6317D-AF0F-46FE-91DA-B0556911FC4B}
+ {A289A7F0-ACD8-42AE-87B6-AB1AFD310BF1} = {71D6317D-AF0F-46FE-91DA-B0556911FC4B}
+ {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} = {71D6317D-AF0F-46FE-91DA-B0556911FC4B}
+ {02680C26-CA1D-4D9D-A7E3-D66AF5BE6F2F} = {71D6317D-AF0F-46FE-91DA-B0556911FC4B}
EndGlobalSection
EndGlobal
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml
index 9ef10872e..74c5c9c79 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml
@@ -126,7 +126,7 @@
+ Value="{StaticResource BlackColor}" />
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -60,20 +92,34 @@
-
-
+ Animate="True"
+ Checked="{Binding UseMockServices, Mode=TwoWay}"
+ Command="{Binding MockServicesCommand}"
+ Style="{StaticResource SettingsToggleButtonStyle}">
+
+
+
+
+
+
+
+ Margin="12,0,0,0">
+
+
+
+
+ Margin="12,0,0,0">
+
+
+
+
+ Aspect="AspectFill">
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/app_settings.png b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/app_settings.png
new file mode 100644
index 000000000..f4595ffe8
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/app_settings.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/noimage.png b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/noimage.png
new file mode 100644
index 000000000..ec4ff8cdb
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/noimage.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/switchOff.png b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/switchOff.png
new file mode 100644
index 000000000..8e60f6dee
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/switchOff.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/switchOn.png b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/switchOn.png
new file mode 100644
index 000000000..94f49dd38
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Assets/switchOn.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml
new file mode 100644
index 000000000..125ef87d1
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml.cs
new file mode 100644
index 000000000..ae4a103f9
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Controls/TabItem.xaml.cs
@@ -0,0 +1,50 @@
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Media;
+
+namespace eShopOnContainers.Windows.Controls
+{
+ public sealed partial class TabItem : UserControl
+ {
+ public static readonly DependencyProperty IconProperty =
+ DependencyProperty.Register("Icon", typeof(string), typeof(TabItem), null);
+
+ public string Icon
+ {
+ get { return GetValue(IconProperty) as string; }
+ set { SetValue(IconProperty, value); }
+ }
+
+ public static readonly DependencyProperty LabelProperty =
+ DependencyProperty.Register("Label", typeof(string), typeof(TabItem), null);
+
+ public string BadgeText
+ {
+ get { return GetValue(BadgeTextProperty) as string; }
+ set { SetValue(BadgeTextProperty, value); }
+ }
+
+ public static readonly DependencyProperty BadgeTextProperty =
+ DependencyProperty.Register("BadgeText", typeof(string), typeof(TabItem), null);
+
+ public SolidColorBrush BadgeColor
+ {
+ get { return GetValue(BadgeColorProperty) as SolidColorBrush; }
+ set { SetValue(BadgeColorProperty, value); }
+ }
+
+ public static readonly DependencyProperty BadgeColorProperty =
+ DependencyProperty.Register("BadgeColor", typeof(SolidColorBrush), typeof(TabItem), null);
+
+ public string Label
+ {
+ get { return GetValue(LabelProperty) as string; }
+ set { SetValue(LabelProperty, value); }
+ }
+
+ public TabItem()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeColorConverter.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeColorConverter.cs
new file mode 100644
index 000000000..0fb4cd0b8
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeColorConverter.cs
@@ -0,0 +1,31 @@
+using eShopOnContainers.Core.Controls;
+using eShopOnContainers.Windows.Helpers;
+using System;
+using Windows.UI.Xaml.Media;
+using Xamarin.Forms;
+using UI = Windows.UI;
+
+namespace eShopOnContainers.Windows.Converters
+{
+ public class TabBadgeColorConverter : UI.Xaml.Data.IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ if (value is Page)
+ {
+ var badgeColor = CustomTabbedPage.GetBadgeColor((Page)value);
+
+ var color = ColorHelper.XamarinFormColorToWindowsColor(badgeColor);
+
+ return new SolidColorBrush(color);
+ }
+
+ return null;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ return null;
+ }
+ }
+}
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeTextConverter.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeTextConverter.cs
new file mode 100644
index 000000000..3dc93b833
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabBadgeTextConverter.cs
@@ -0,0 +1,27 @@
+using eShopOnContainers.Core.Controls;
+using System;
+using Xamarin.Forms;
+using UI = Windows.UI;
+
+namespace eShopOnContainers.Windows.Converters
+{
+ public class TabBadgeTextConverter : UI.Xaml.Data.IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ if (value is Page)
+ {
+ var badgeText = CustomTabbedPage.GetBadgeText((Page)value);
+
+ return badgeText;
+ }
+
+ return string.Empty;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ return null;
+ }
+ }
+}
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabIconConverter.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabIconConverter.cs
new file mode 100644
index 000000000..0e46fb566
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Converters/TabIconConverter.cs
@@ -0,0 +1,24 @@
+using System;
+using Xamarin.Forms;
+using UI = Windows.UI;
+
+namespace eShopOnContainers.Windows.Converters
+{
+ public class TabIconConverter : UI.Xaml.Data.IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ if (value is FileImageSource)
+ {
+ return string.Format("ms-appx:///{0}", ((FileImageSource)value).File);
+ }
+
+ return value;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Extensions/VisualTreeExtensions.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Extensions/VisualTreeExtensions.cs
new file mode 100644
index 000000000..a909e3d14
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Extensions/VisualTreeExtensions.cs
@@ -0,0 +1,375 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using Windows.ApplicationModel;
+using Windows.Foundation;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Media;
+
+namespace eShopOnContainers.Windows.Extensions
+{
+ public static class VisualTreeExtensions
+ {
+ internal static IEnumerable GetVisualChildren(this DependencyObject parent)
+ {
+ Debug.Assert(parent != null, "The parent cannot be null!");
+ var childCount = VisualTreeHelper.GetChildrenCount(parent);
+ for (int counter = 0; counter < childCount; counter++)
+ {
+ yield return VisualTreeHelper.GetChild(parent, counter);
+ }
+ }
+
+ internal static IEnumerable GetLogicalChildrenBreathFirst(this FrameworkElement parent)
+ {
+ Debug.Assert(parent != null, "The parent cannot be null!");
+ var queue =
+ new Queue(parent.GetVisualChildren().OfType());
+ while (queue.Count > 0)
+ {
+ var element = queue.Dequeue();
+ yield return element;
+ foreach (var visualChild in element.GetVisualChildren().OfType())
+ {
+ queue.Enqueue(visualChild);
+ }
+ }
+ }
+
+ internal static IEnumerable GetVisualAncestors(this FrameworkElement node)
+ {
+ var parent = node.GetVisualParent();
+ while (parent != null)
+ {
+ yield return parent;
+ parent = parent.GetVisualParent();
+ }
+ }
+
+ internal static FrameworkElement GetVisualParent(this FrameworkElement node)
+ {
+ return VisualTreeHelper.GetParent(node) as FrameworkElement;
+ }
+
+ internal static T GetParentByType(this DependencyObject element)
+ where T : FrameworkElement
+ {
+ Debug.Assert(element != null, "The element cannot be null!");
+ var parent = VisualTreeHelper.GetParent(element);
+ while (parent != null)
+ {
+ var result = parent as T;
+ if (result != null)
+ {
+ return result;
+ }
+ parent = VisualTreeHelper.GetParent(parent);
+ }
+ return null;
+ }
+
+ public static T GetFirstDescendantOfType(this DependencyObject start) where T : DependencyObject
+ {
+ return start.GetDescendantsOfType().FirstOrDefault();
+ }
+
+ public static IEnumerable GetDescendantsOfType(this DependencyObject start) where T : DependencyObject
+ {
+ return start.GetDescendants().OfType();
+ }
+
+ public static IEnumerable GetDescendants(this DependencyObject start)
+ {
+ if (start == null)
+ {
+ yield break;
+ }
+
+ var queue = new Queue();
+
+ var popup = start as Popup;
+
+ if (popup != null)
+ {
+ if (popup.Child != null)
+ {
+ queue.Enqueue(popup.Child);
+ yield return popup.Child;
+ }
+ }
+ else
+ {
+ var count = VisualTreeHelper.GetChildrenCount(start);
+
+ for (int i = 0; i < count; i++)
+ {
+ var child = VisualTreeHelper.GetChild(start, i);
+ queue.Enqueue(child);
+ yield return child;
+ }
+ }
+
+ while (queue.Count > 0)
+ {
+ var parent = queue.Dequeue();
+
+ popup = parent as Popup;
+
+ if (popup != null)
+ {
+ if (popup.Child != null)
+ {
+ queue.Enqueue(popup.Child);
+ yield return popup.Child;
+ }
+ }
+ else
+ {
+ var count = VisualTreeHelper.GetChildrenCount(parent);
+
+ for (int i = 0; i < count; i++)
+ {
+ var child = VisualTreeHelper.GetChild(parent, i);
+ yield return child;
+ queue.Enqueue(child);
+ }
+ }
+ }
+ }
+
+ public static IEnumerable GetChildren(this DependencyObject parent)
+ {
+ var popup = parent as Popup;
+
+ if (popup?.Child != null)
+ {
+ yield return popup.Child;
+ yield break;
+ }
+
+ var count = VisualTreeHelper.GetChildrenCount(parent);
+
+ for (int i = 0; i < count; i++)
+ {
+ var child = VisualTreeHelper.GetChild(parent, i);
+ yield return child;
+ }
+ }
+
+ public static IEnumerable GetChildrenByZIndex(
+ this DependencyObject parent)
+ {
+ int i = 0;
+ var indexedChildren =
+ parent.GetChildren().Cast().Select(
+ child => new { Index = i++, ZIndex = Canvas.GetZIndex(child), Child = child });
+
+ return
+ from indexedChild in indexedChildren
+ orderby indexedChild.ZIndex, indexedChild.Index
+ select indexedChild.Child;
+ }
+
+ public static T GetFirstAncestorOfType(this DependencyObject start) where T : DependencyObject
+ {
+ return start.GetAncestorsOfType().FirstOrDefault();
+ }
+
+ public static IEnumerable GetAncestorsOfType(this DependencyObject start) where T : DependencyObject
+ {
+ return start.GetAncestors().OfType();
+ }
+
+ public static IEnumerable GetAncestors(this DependencyObject start)
+ {
+ var parent = VisualTreeHelper.GetParent(start);
+
+ while (parent != null)
+ {
+ yield return parent;
+ parent = VisualTreeHelper.GetParent(parent);
+ }
+ }
+
+ public static IEnumerable GetSiblings(this DependencyObject start)
+ {
+ var parent = VisualTreeHelper.GetParent(start);
+
+ if (parent == null)
+ {
+ yield return start;
+ }
+ else
+ {
+ var count = VisualTreeHelper.GetChildrenCount(parent);
+
+ for (int i = 0; i < count; i++)
+ {
+ var child = VisualTreeHelper.GetChild(parent, i);
+ yield return child;
+ }
+ }
+ }
+
+ public static bool IsInVisualTree(this DependencyObject dob)
+ {
+ if (DesignMode.DesignModeEnabled)
+ {
+ return false;
+ }
+
+ //TODO: consider making it work with Popups too.
+ if (Window.Current == null)
+ {
+ // This may happen when a picker or CameraCaptureUI etc. is open.
+ return false;
+ }
+
+ return Window.Current.Content != null && dob.GetAncestors().Contains(Window.Current.Content);
+ }
+
+ public static Point GetPosition(this FrameworkElement dob, Point origin = new Point(), FrameworkElement relativeTo = null)
+ {
+ if (DesignMode.DesignModeEnabled)
+ {
+ return new Point();
+ }
+
+ if (relativeTo == null)
+ {
+ relativeTo = Window.Current.Content as FrameworkElement;
+ }
+
+ if (relativeTo == null)
+ {
+ throw new InvalidOperationException("Element not in visual tree.");
+ }
+
+ var absoluteOrigin = new Point(relativeTo.ActualWidth * origin.X, relativeTo.ActualHeight * origin.X);
+
+ if (dob == relativeTo)
+ {
+ return absoluteOrigin;
+ }
+
+ var ancestors = dob.GetAncestors().ToArray();
+
+ if (!ancestors.Contains(relativeTo))
+ {
+ throw new InvalidOperationException("Element not in visual tree.");
+ }
+
+ return
+ dob
+ .TransformToVisual(relativeTo)
+ .TransformPoint(absoluteOrigin);
+ }
+
+ public static Rect GetBoundingRect(this FrameworkElement dob, FrameworkElement relativeTo = null)
+ {
+ if (DesignMode.DesignModeEnabled)
+ {
+ return Rect.Empty;
+ }
+
+ if (relativeTo == null)
+ {
+ relativeTo = Window.Current.Content as FrameworkElement;
+ }
+
+ if (relativeTo == null)
+ {
+ throw new InvalidOperationException("Element not in visual tree.");
+ }
+
+ if (dob == relativeTo)
+ {
+ return new Rect(0, 0, relativeTo.ActualWidth, relativeTo.ActualHeight);
+ }
+
+ var ancestors = dob.GetAncestors().ToArray();
+
+ if (!ancestors.Contains(relativeTo))
+ {
+ throw new InvalidOperationException("Element not in visual tree.");
+ }
+
+ var topLeft =
+ dob
+ .TransformToVisual(relativeTo)
+ .TransformPoint(new Point());
+ var topRight =
+ dob
+ .TransformToVisual(relativeTo)
+ .TransformPoint(
+ new Point(
+ dob.ActualWidth,
+ 0));
+ var bottomLeft =
+ dob
+ .TransformToVisual(relativeTo)
+ .TransformPoint(
+ new Point(
+ 0,
+ dob.ActualHeight));
+ var bottomRight =
+ dob
+ .TransformToVisual(relativeTo)
+ .TransformPoint(
+ new Point(
+ dob.ActualWidth,
+ dob.ActualHeight));
+
+ var minX = new[] { topLeft.X, topRight.X, bottomLeft.X, bottomRight.X }.Min();
+ var maxX = new[] { topLeft.X, topRight.X, bottomLeft.X, bottomRight.X }.Max();
+ var minY = new[] { topLeft.Y, topRight.Y, bottomLeft.Y, bottomRight.Y }.Min();
+ var maxY = new[] { topLeft.Y, topRight.Y, bottomLeft.Y, bottomRight.Y }.Max();
+
+ return new Rect(minX, minY, maxX - minX, maxY - minY);
+ }
+
+ private static void ExploreTree(List list, DependencyObject obj)
+ {
+ if (list != null && obj != null)
+ {
+ int childrens = VisualTreeHelper.GetChildrenCount(obj);
+ for (int x = 0; x < childrens; x++)
+ {
+ DependencyObject tmp = VisualTreeHelper.GetChild(obj, x);
+ list.Add(tmp);
+ ExploreTree(list, tmp);
+ }
+ }
+ }
+
+ public static List GetVisualTree(DependencyObject obj)
+ {
+ var tmp = new List();
+ ExploreTree(tmp, obj);
+ return tmp;
+ }
+
+ public static T FindNameInVisualTree(DependencyObject root, string name)
+ {
+ T res = default(T);
+ List tree = null;
+ tree = GetVisualTree(root);
+ for (int x = 0; x < tree.Count; x++)
+ {
+ if (tree[x] is FrameworkElement)
+ {
+ if (((FrameworkElement)tree[x]).Name == name)
+ {
+ res = (T)((object)tree[x]);
+ break;
+ }
+ }
+ }
+
+ return res;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Helpers/ColorHelper.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Helpers/ColorHelper.cs
new file mode 100644
index 000000000..b0b4e83be
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Helpers/ColorHelper.cs
@@ -0,0 +1,16 @@
+using Xamarin.Forms;
+using UI = Windows.UI;
+
+namespace eShopOnContainers.Windows.Helpers
+{
+ public static class ColorHelper
+ {
+ public static UI.Color XamarinFormColorToWindowsColor(Color xamarinColor)
+ {
+ return UI.Color.FromArgb((byte)(xamarinColor.A * 255),
+ (byte)(xamarinColor.R * 255),
+ (byte)(xamarinColor.G * 255),
+ (byte)(xamarinColor.B * 255));
+ }
+ }
+}
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/MainPage.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/MainPage.xaml
index 6264bb6e9..0087ee35e 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/MainPage.xaml
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/MainPage.xaml
@@ -8,7 +8,6 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
-
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomSwitchRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomSwitchRenderer.cs
deleted file mode 100644
index 76379eefd..000000000
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomSwitchRenderer.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using eShopOnContainers.Core.Controls;
-using eShopOnContainers.Windows.Renderers;
-using Windows.UI.Xaml.Controls;
-using Xamarin.Forms;
-using Xamarin.Forms.Platform.UWP;
-
-[assembly: ExportRenderer(typeof(CustomSwitch), typeof(CustomSwitchRenderer))]
-namespace eShopOnContainers.Windows.Renderers
-{
- public class CustomSwitchRenderer : ViewRenderer
- {
- protected override void OnElementChanged(ElementChangedEventArgs e)
- {
- base.OnElementChanged(e);
-
- if (this.Element == null)
- {
- return;
- }
-
- if (e.OldElement != null)
- {
- this.Element.Toggled -= ElementToggled;
- return;
- }
-
- var toggleSwitchControl = new ToggleSwitch
- {
- OnContent = this.Element.TextOn,
- OffContent = this.Element.TextOff
- };
-
- toggleSwitchControl.Toggled += ControlToggled;
- this.Element.Toggled += ElementToggled;
-
- this.SetNativeControl(toggleSwitchControl);
- }
-
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- this.Control.Toggled -= this.ControlToggled;
- this.Element.Toggled -= ElementToggled;
- }
-
- base.Dispose(disposing);
- }
-
- private void ElementToggled(object sender, ToggledEventArgs e)
- {
- this.Control.IsOn = this.Element.IsToggled;
- }
-
- private void ControlToggled(object sender, global::Windows.UI.Xaml.RoutedEventArgs e)
- {
- this.Element.IsToggled = this.Control.IsOn;
- }
- }
-}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomTabbedPageRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomTabbedPageRenderer.cs
index 7adfd7a10..1a98782d2 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomTabbedPageRenderer.cs
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/CustomTabbedPageRenderer.cs
@@ -1,7 +1,14 @@
-using eShopOnContainers.Windows.Renderers;
+using eShopOnContainers.Core.Controls;
+using eShopOnContainers.Windows.Controls;
+using eShopOnContainers.Windows.Extensions;
+using eShopOnContainers.Windows.Helpers;
+using eShopOnContainers.Windows.Renderers;
+using System.Diagnostics;
+using System.Linq;
using Xamarin.Forms;
using Xamarin.Forms.Internals;
using Xamarin.Forms.Platform.UWP;
+using Xaml = Windows.UI.Xaml;
[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))]
namespace eShopOnContainers.Windows.Renderers
@@ -9,5 +16,65 @@ namespace eShopOnContainers.Windows.Renderers
[Preserve]
public class CustomTabbedPageRenderer : TabbedPageRenderer
{
+ protected override void OnElementChanged(VisualElementChangedEventArgs e)
+ {
+ base.OnElementChanged(e);
+
+ if (Control == null)
+ {
+ Debug.WriteLine("No FormsPivot found. Badge not added.");
+ return;
+ }
+
+ for (var i = 0; i < Control.Items.Count; i++)
+ {
+ AddTabBadge(i);
+ }
+ }
+
+ private void AddTabBadge(int tabIndex)
+ {
+ var element = Element.Children[tabIndex];
+
+ if (element != null)
+ {
+
+ var dataTemplate = Xaml.Application.Current.Resources["TabbedPageHeaderTemplate"] as
+ Xaml.DataTemplate;
+
+ Control.HeaderTemplate = dataTemplate;
+
+ element.PropertyChanged += OnTabbedPagePropertyChanged;
+ }
+ }
+
+ protected virtual void OnTabbedPagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ var element = sender as Element;
+
+ if (element == null)
+ return;
+
+ var tabItems = Control.GetDescendantsOfType();
+ var tabItem = tabItems.FirstOrDefault(t => t.Label == ((Page)element).Title);
+
+ if(tabItem == null)
+ {
+ return;
+ }
+
+ if (e.PropertyName == CustomTabbedPage.BadgeTextProperty.PropertyName)
+ {
+ tabItem.BadgeText = CustomTabbedPage.GetBadgeText(element);
+ return;
+ }
+
+ if (e.PropertyName == CustomTabbedPage.BadgeColorProperty.PropertyName)
+ {
+ tabItem.BadgeColor = new Xaml.Media.SolidColorBrush(
+ ColorHelper.XamarinFormColorToWindowsColor(
+ CustomTabbedPage.GetBadgeColor(element)));
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/SlideDownMenuPageRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/SlideDownMenuPageRenderer.cs
index df6eca53e..a73405fbb 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/SlideDownMenuPageRenderer.cs
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Renderers/SlideDownMenuPageRenderer.cs
@@ -32,6 +32,5 @@ namespace eShopOnContainers.Windows.Renderers
base.Dispose(disposing);
_handler = null;
}
-
}
}
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj
index fa7a70dcc..0bb6da6ea 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj
@@ -105,12 +105,19 @@
App.xaml
+
+ TabItem.xaml
+
+
+
+
+
+
MainPage.xaml
-
@@ -121,6 +128,7 @@
+
@@ -130,7 +138,10 @@
+
+
+
@@ -145,6 +156,10 @@
MSBuild:Compile
Designer
+
+ Designer
+ MSBuild:Compile
+
MSBuild:Compile
Designer
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/project.json b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/project.json
index b2a9cd2aa..44a6cf685 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/project.json
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/project.json
@@ -2,6 +2,7 @@
"dependencies": {
"Acr.UserDialogs": "6.3.1",
"Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0",
+ "Newtonsoft.Json": "9.0.1",
"SlideOverKit": "2.1.4",
"StyleCop.MSBuild": "5.0.0-alpha01",
"Unity": "4.0.1",
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..4c8d3ff81
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"idiom":"iphone","filename":"Icon-60@2x.png","size":"60x60","scale":"2x"},{"idiom":"ipad","filename":"Icon-76.png","size":"76x76","scale":"1x"},{"idiom":"ipad","filename":"Icon-76@2x.png","size":"76x76","scale":"2x"},{"idiom":"iphone","filename":"Icon-Small.png","size":"29x29","scale":"1x"},{"idiom":"ipad","filename":"Icon-Small.png","size":"29x29","scale":"1x"},{"idiom":"iphone","filename":"Icon-Small@2x.png","size":"29x29","scale":"2x"},{"idiom":"ipad","filename":"Icon-Small@2x.png","size":"29x29","scale":"2x"},{"idiom":"ipad","filename":"Icon-Small-40.png","size":"40x40","scale":"1x"},{"idiom":"iphone","filename":"Icon-Small-40@2x.png","size":"40x40","scale":"2x"},{"idiom":"ipad","filename":"Icon-Small-40@2x.png","size":"40x40","scale":"2x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
new file mode 100644
index 000000000..8fbcfd29d
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-76.png
new file mode 100644
index 000000000..184f82e7e
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-76.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
new file mode 100644
index 000000000..fb7fb25dc
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png
new file mode 100644
index 000000000..357d6837d
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
new file mode 100644
index 000000000..e1d5e8592
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
new file mode 100644
index 000000000..14883f78f
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
new file mode 100644
index 000000000..889a42be9
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 000000000..368ed9879
--- /dev/null
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,178 @@
+{
+ "images": [
+ {
+ "minimum-system-version": "9.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1920x1080",
+ "scale": "1x",
+ "idiom": "tv"
+ },
+ {
+ "minimum-system-version": "8.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default-1242@3x.png",
+ "size": "414x736",
+ "subtype": "736h",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "8.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default-750@2x.png",
+ "size": "375x667",
+ "subtype": "667h",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "8.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "736x414",
+ "subtype": "736h",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default@2x.png",
+ "size": "320x480",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default-568h@2x.png",
+ "size": "320x568",
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default.png",
+ "size": "320x480",
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default@2x.png",
+ "size": "320x480",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "filename": "Default-568h@2x.png",
+ "size": "320x568",
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "to-status-bar",
+ "size": "768x1004",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "to-status-bar",
+ "filename": "Default-Portrait@2x.png",
+ "size": "768x1004",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "to-status-bar",
+ "size": "1024x748",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "to-status-bar",
+ "size": "1024x748",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-1242@3x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-1242@3x.png
new file mode 100644
index 000000000..29c116a3d
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-1242@3x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png
new file mode 100644
index 000000000..88dea20a2
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-750@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-750@2x.png
new file mode 100644
index 000000000..6b1f04a87
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-750@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png
new file mode 100644
index 000000000..75f5affe1
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png
new file mode 100644
index 000000000..93f84020f
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default.png
new file mode 100644
index 000000000..7fdc6b020
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png
new file mode 100644
index 000000000..6183accf3
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Info.plist b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Info.plist
index c8a93be4a..527eb00fd 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Info.plist
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Info.plist
@@ -10,8 +10,7 @@
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
+ UIInterfaceOrientationPortraitUpsideDown
UISupportedInterfaceOrientations~ipad
@@ -28,24 +27,15 @@
com.yourcompany.eShopOnContainers
CFBundleVersion
1.0
- CFBundleIconFiles
-
- Icon-60@2x.png
- Icon-76.png
- Icon-76@2x.png
- Default.png
- Default@2x.png
- Default-568h@2x.png
- Default-Portrait.png
- Default-Portrait@2x.png
- Icon-Small-40.png
- Icon-Small-40@2x.png
- Icon-Small.png
- Icon-Small@2x.png
-
UILaunchStoryboardName
LaunchScreen
CFBundleShortVersionString
+ CFBundleName
+ eShopOnContainers
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+ XSLaunchImageAssets
+ Assets.xcassets/LaunchImage.launchimage
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/CustomSwitchRenderer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/CustomSwitchRenderer.cs
deleted file mode 100644
index 7b3841029..000000000
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/CustomSwitchRenderer.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using eShopOnContainers.Core.Controls;
-using eShopOnContainers.iOS.Renderers;
-using UIKit;
-using Xamarin.Forms;
-using Xamarin.Forms.Platform.iOS;
-
-[assembly: ExportRenderer(typeof(CustomSwitch), typeof(CustomSwitchRenderer))]
-namespace eShopOnContainers.iOS.Renderers
-{
- public class CustomSwitchRenderer : ViewRenderer
- {
- protected override void OnElementChanged(ElementChangedEventArgs e)
- {
- base.OnElementChanged(e);
-
- if (e.OldElement != null)
- {
- this.Element.Toggled -= ElementToggled;
- return;
- }
-
- if (this.Element == null)
- {
- return;
- }
-
- var uiSwitchControl = new UISwitch();
-
- uiSwitchControl.ValueChanged += ControlValueChanged;
- this.Element.Toggled += ElementToggled;
-
- this.SetNativeControl(uiSwitchControl);
- }
-
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- this.Control.ValueChanged -= this.ControlValueChanged;
- this.Element.Toggled -= ElementToggled;
- }
-
- base.Dispose(disposing);
- }
-
- private void ElementToggled(object sender, ToggledEventArgs e)
- {
- this.Control.On = Element.IsToggled;
- }
-
- private void ControlValueChanged(object sender, System.EventArgs e)
- {
- this.Element.IsToggled = this.Control.On;
- }
- }
-}
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@2x.png
index 4b03c4270..8fbcfd29d 100644
Binary files a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@2x.png and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@3x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@3x.png
index b03ca1bbc..374c8233f 100644
Binary files a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@3x.png and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-60@3x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40.png
index 6acff9441..357d6837d 100644
Binary files a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40.png and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@2x.png
index b833aac26..e1d5e8592 100644
Binary files a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@2x.png and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@3x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@3x.png
index ab8654e49..8fbcfd29d 100644
Binary files a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@3x.png and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Icon-Small-40@3x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/LaunchScreen.storyboard b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/LaunchScreen.storyboard
index a639c2f1a..2a0cc5633 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/LaunchScreen.storyboard
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/LaunchScreen.storyboard
@@ -1,4 +1,4 @@
-
+
@@ -16,12 +16,12 @@
-
+
-
+
@@ -34,6 +34,22 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Logo.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Logo.png
new file mode 100644
index 000000000..c4a77fd4c
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/Logo.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings.png
new file mode 100644
index 000000000..70821f788
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings@2x.png
new file mode 100644
index 000000000..9e9265d97
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings@3x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings@3x.png
new file mode 100644
index 000000000..7af149bcb
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/app_settings@3x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/noimage.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/noimage.png
new file mode 100644
index 000000000..ec4ff8cdb
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/noimage.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff.png
new file mode 100644
index 000000000..ba9804e9e
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff@2x.png
new file mode 100644
index 000000000..d6e55997c
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff@3x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff@3x.png
new file mode 100644
index 000000000..8e60f6dee
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOff@3x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn.png
new file mode 100644
index 000000000..94c02a6de
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn@2x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn@2x.png
new file mode 100644
index 000000000..fb825596d
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn@2x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn@3x.png b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn@3x.png
new file mode 100644
index 000000000..94f49dd38
Binary files /dev/null and b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Resources/switchOn@3x.png differ
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/app.config b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/app.config
index de5386a47..c30f9b60d 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/app.config
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/app.config
@@ -4,7 +4,11 @@
-
+
+
+
+
+
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj
index 2f9ed0528..20cd1d73f 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj
@@ -112,7 +112,6 @@
Resources\fonts\SourceSansPro-Regular.ttf
-
@@ -124,20 +123,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -182,8 +169,8 @@
..\..\packages\modernhttpclient.2.4.2\lib\Xamarin.iOS10\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
@@ -296,6 +283,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config
index a3370bce8..891e2dc30 100644
--- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config
+++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config
@@ -4,7 +4,7 @@
-
+
diff --git a/src/Services/Ordering/Ordering.API/Startup.cs b/src/Services/Ordering/Ordering.API/Startup.cs
index 605bcdd59..8e003d8e5 100644
--- a/src/Services/Ordering/Ordering.API/Startup.cs
+++ b/src/Services/Ordering/Ordering.API/Startup.cs
@@ -23,8 +23,15 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
- .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
- .AddEnvironmentVariables();
+ .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
+
+ if (env.IsDevelopment())
+ {
+ builder.AddUserSecrets();
+ }
+
+ builder.AddEnvironmentVariables();
+
Configuration = builder.Build();
}
@@ -37,28 +44,14 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API
// Add framework services.
services.AddMvc();
- //Add EF Core Context (UnitOfWork)
- //SQL LocalDB
- // var connString = @"Server=(localdb)\mssqllocaldb;Database=Microsoft.eShopOnContainers.Services.OrderingDb;Trusted_Connection=True;";
-
- //SQL SERVER on-premises
- //(Integrated Security)
- //var connString = @"Server=CESARDLBOOKVHD;Database=Microsoft.eShopOnContainers.Services.OrderingDb;Trusted_Connection=True;";
-
- //(SQL Server Authentication)
- //var connString = @"Server=10.0.75.1;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;";
-
+
var connString = Configuration["ConnectionString"];
- //(CDLTLL) To use only for EF Migrations
- //connString = @"Server=10.0.75.1;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;";
-
- services.AddDbContext(options => options.UseSqlServer(connString)
- .UseSqlServer(connString, b => b.MigrationsAssembly("Ordering.API"))
- //(CDLTLL) MigrationsAssembly will be Ordering.SqlData, but when supported
- //Standard Library 1.6 by "Microsoft.EntityFrameworkCore.Tools"
- //Version "1.0.0-preview2-final" just supports .NET Core
- );
+ services.AddDbContext(options =>
+ {
+ options.UseSqlServer(connString)
+ .UseSqlServer(connString, b => b.MigrationsAssembly("Ordering.API"));
+ });
services.AddTransient();
services.AddTransient();
@@ -70,9 +63,11 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
- //if (env.IsDevelopment())
+ if (env.IsDevelopment())
+ {
app.UseDeveloperExceptionPage();
-
+ }
+
app.UseMvc();
}
}
diff --git a/src/Services/Ordering/Ordering.API/project.json b/src/Services/Ordering/Ordering.API/project.json
index c330c3657..d5b415b26 100644
--- a/src/Services/Ordering/Ordering.API/project.json
+++ b/src/Services/Ordering/Ordering.API/project.json
@@ -9,6 +9,7 @@
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
+ "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",