diff --git a/bitwarden-mobile.sln b/bitwarden-mobile.sln
index 0ded8d178..c957391e1 100644
--- a/bitwarden-mobile.sln
+++ b/bitwarden-mobile.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.26430.13
+VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "src\Android\Android.csproj", "{04B18ED2-B76D-4947-8474-191F8FD2B5E0}"
EndProject
@@ -29,7 +29,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "google", "google", "{2E3996
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Publisher", "store\google\Publisher\Publisher.csproj", "{428CACAB-CC26-4F41-9062-1E4A9BC82640}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UWP", "src\UWP\UWP.csproj", "{3A2D5669-ED71-4F2B-BA85-2D36BAA05141}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "UWP.Images", "src\UWP.Images\UWP.Images.shproj", "{0BE54BBB-7772-4289-BD51-1FDBB0CC2446}"
+EndProject
Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ src\UWP.Images\UWP.Images.projitems*{0be54bbb-7772-4289-bd51-1fdbb0cc2446}*SharedItemsImports = 13
+ src\UWP.Images\UWP.Images.projitems*{3a2d5669-ed71-4f2b-ba85-2d36baa05141}*SharedItemsImports = 4
+ EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
Ad-Hoc|ARM = Ad-Hoc|ARM
@@ -94,8 +102,6 @@ Global
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x64.Build.0 = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x64.Deploy.0 = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.ActiveCfg = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.Build.0 = Debug|Any CPU
{04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|x86.Deploy.0 = Debug|Any CPU
@@ -136,7 +142,6 @@ Global
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x64.ActiveCfg = Debug|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x64.Build.0 = Debug|iPhone
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.ActiveCfg = Debug|iPhone
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.Build.0 = Debug|iPhone
{1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|Any CPU.ActiveCfg = Release|iPhone
@@ -222,7 +227,6 @@ Global
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x64.Build.0 = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.ActiveCfg = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.Build.0 = Debug|Any CPU
{A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -258,7 +262,6 @@ Global
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x64.ActiveCfg = Debug|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x64.Build.0 = Debug|iPhone
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.ActiveCfg = Debug|iPhone
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.Build.0 = Debug|iPhone
{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|Any CPU.ActiveCfg = Release|iPhone
@@ -300,7 +303,6 @@ Global
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x64.Build.0 = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.ActiveCfg = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.Build.0 = Debug|Any CPU
{B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -394,8 +396,6 @@ Global
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x64.ActiveCfg = Debug|Any CPU
- {FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x64.Build.0 = Debug|Any CPU
- {FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x64.Deploy.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x86.ActiveCfg = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x86.Build.0 = Debug|Any CPU
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE}.Debug|x86.Deploy.0 = Debug|Any CPU
@@ -450,7 +450,6 @@ Global
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Debug|x64.ActiveCfg = Debug|Any CPU
- {428CACAB-CC26-4F41-9062-1E4A9BC82640}.Debug|x64.Build.0 = Debug|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Debug|x86.ActiveCfg = Debug|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Debug|x86.Build.0 = Debug|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -465,6 +464,66 @@ Global
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Release|x64.Build.0 = Release|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Release|x86.ActiveCfg = Release|Any CPU
{428CACAB-CC26-4F41-9062-1E4A9BC82640}.Release|x86.Build.0 = Release|Any CPU
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|Any CPU.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|Any CPU.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|Any CPU.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|ARM.Build.0 = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|ARM.Deploy.0 = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|iPhone.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|iPhone.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|iPhone.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|x64.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|x64.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|x64.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|x86.ActiveCfg = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|x86.Build.0 = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Ad-Hoc|x86.Deploy.0 = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|Any CPU.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|Any CPU.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|Any CPU.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|ARM.ActiveCfg = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|ARM.Build.0 = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|ARM.Deploy.0 = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|iPhone.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|iPhone.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|iPhone.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|iPhoneSimulator.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|iPhoneSimulator.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|iPhoneSimulator.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|x64.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|x64.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|x64.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|x86.ActiveCfg = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|x86.Build.0 = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.AppStore|x86.Deploy.0 = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|ARM.ActiveCfg = Debug|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|ARM.Build.0 = Debug|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|ARM.Deploy.0 = Debug|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|iPhone.ActiveCfg = Debug|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|x64.ActiveCfg = Debug|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|x64.Build.0 = Debug|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|x64.Deploy.0 = Debug|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|x86.ActiveCfg = Debug|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|x86.Build.0 = Debug|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Debug|x86.Deploy.0 = Debug|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|Any CPU.ActiveCfg = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|ARM.ActiveCfg = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|ARM.Build.0 = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|ARM.Deploy.0 = Release|ARM
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|iPhone.ActiveCfg = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|x64.ActiveCfg = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|x64.Build.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|x64.Deploy.0 = Release|x64
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|x86.ActiveCfg = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|x86.Build.0 = Release|x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -480,5 +539,10 @@ Global
{FA507A17-D4E3-46DF-ACD8-D7E6D7D4E3AE} = {0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}
{2E399654-26A2-46F6-B9CA-1B496A3F370A} = {92470CBD-9047-4C3C-8EA3-D972D6622D84}
{428CACAB-CC26-4F41-9062-1E4A9BC82640} = {2E399654-26A2-46F6-B9CA-1B496A3F370A}
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
+ {0BE54BBB-7772-4289-BD51-1FDBB0CC2446} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {318CB2DF-0118-43A3-AC83-56BADCF71CCD}
EndGlobalSection
EndGlobal
diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj
index 9d4879942..01976df2e 100644
--- a/src/Android/Android.csproj
+++ b/src/Android/Android.csproj
@@ -178,8 +178,8 @@
..\..\packages\Splat.1.6.2\lib\monoandroid\Splat.dll
True
-
- ..\..\packages\sqlite-net-pcl.1.4.118\lib\netstandard1.1\SQLite-net.dll
+
+ ..\..\packages\sqlite-net-pcl.1.5.166-beta\lib\netstandard1.1\SQLite-net.dll
..\..\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\MonoAndroid\SQLitePCLRaw.batteries_green.dll
diff --git a/src/Android/packages.config b/src/Android/packages.config
index 539ea5241..3b879d8f7 100644
--- a/src/Android/packages.config
+++ b/src/Android/packages.config
@@ -19,7 +19,7 @@
-
+
diff --git a/src/App/App.csproj b/src/App/App.csproj
index dcde633a5..d939258dc 100644
--- a/src/App/App.csproj
+++ b/src/App/App.csproj
@@ -540,8 +540,8 @@
..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll
True
-
- ..\..\packages\sqlite-net-pcl.1.4.118\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
+
+ ..\..\packages\sqlite-net-pcl.1.5.166-beta\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
..\..\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\portable-net45+netcore45+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLitePCLRaw.batteries_green.dll
diff --git a/src/App/Controls/ExtendedTableView.cs b/src/App/Controls/ExtendedTableView.cs
index 2ecfb00e4..42a954208 100644
--- a/src/App/Controls/ExtendedTableView.cs
+++ b/src/App/Controls/ExtendedTableView.cs
@@ -43,7 +43,7 @@ namespace Bit.App.Controls
protected override SizeRequest OnSizeRequest(double widthConstraint, double heightConstraint)
{
- if(!VerticalOptions.Expands)
+ if(!VerticalOptions.Expands && Device.RuntimePlatform != Device.Windows)
{
var reflectionService = Resolver.Resolve();
var baseBaseOnSizeRequest = reflectionService.GetVisualElementOnSizeRequest(this);
diff --git a/src/App/Pages/EnvironmentPage.cs b/src/App/Pages/EnvironmentPage.cs
index a0995644e..bd39de2a8 100644
--- a/src/App/Pages/EnvironmentPage.cs
+++ b/src/App/Pages/EnvironmentPage.cs
@@ -102,7 +102,7 @@ namespace Bit.App.Pages
var toolbarItem = new ToolbarItem(AppResources.Save, null, async () => await SaveAsync(),
ToolbarItemOrder.Default, 0);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
table.RowHeight = table2.RowHeight = -1;
table.EstimatedRowHeight = table2.EstimatedRowHeight = 70;
diff --git a/src/App/Pages/HomePage.cs b/src/App/Pages/HomePage.cs
index 323731ebc..7e20a6dcd 100644
--- a/src/App/Pages/HomePage.cs
+++ b/src/App/Pages/HomePage.cs
@@ -34,7 +34,7 @@ namespace Bit.App.Pages
var settingsButton = new Button
{
- Image = "cog",
+ Image = "cog.png",
VerticalOptions = LayoutOptions.Start,
HorizontalOptions = LayoutOptions.Start,
WidthRequest = 25,
@@ -46,7 +46,7 @@ namespace Bit.App.Pages
var logo = new CachedImage
{
- Source = "logo",
+ Source = "logo.png",
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.Center,
WidthRequest = 282,
diff --git a/src/App/Pages/Lock/LockFingerprintPage.cs b/src/App/Pages/Lock/LockFingerprintPage.cs
index ef50cadd5..ce9aa2995 100644
--- a/src/App/Pages/Lock/LockFingerprintPage.cs
+++ b/src/App/Pages/Lock/LockFingerprintPage.cs
@@ -32,7 +32,7 @@ namespace Bit.App.Pages
{
var fingerprintIcon = new ExtendedButton
{
- Image = "fingerprint",
+ Image = "fingerprint.png",
BackgroundColor = Color.Transparent,
Command = new Command(async () => await CheckFingerprintAsync()),
VerticalOptions = LayoutOptions.CenterAndExpand,
diff --git a/src/App/Pages/Lock/LockPasswordPage.cs b/src/App/Pages/Lock/LockPasswordPage.cs
index 10c2da7bd..a03d0f0bf 100644
--- a/src/App/Pages/Lock/LockPasswordPage.cs
+++ b/src/App/Pages/Lock/LockPasswordPage.cs
@@ -36,7 +36,7 @@ namespace Bit.App.Pages
WinPhone: new Thickness(15, 20));
PasswordCell = new FormEntryCell(AppResources.MasterPassword, isPassword: true,
- useLabelAsPlaceholder: true, imageSource: "lock", containerPadding: padding);
+ useLabelAsPlaceholder: true, imageSource: "lock.png", containerPadding: padding);
PasswordCell.Entry.ReturnType = Enums.ReturnType.Go;
diff --git a/src/App/Pages/LoginPage.cs b/src/App/Pages/LoginPage.cs
index d49c51b1d..4c996e047 100644
--- a/src/App/Pages/LoginPage.cs
+++ b/src/App/Pages/LoginPage.cs
@@ -103,7 +103,7 @@ namespace Bit.App.Pages
var scrollView = new ScrollView { Content = layout };
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
table.RowHeight = -1;
table.EstimatedRowHeight = 70;
diff --git a/src/App/Pages/MainPage.cs b/src/App/Pages/MainPage.cs
index e6e16d206..5eb4a1c6d 100644
--- a/src/App/Pages/MainPage.cs
+++ b/src/App/Pages/MainPage.cs
@@ -17,16 +17,16 @@ namespace Bit.App.Pages
var toolsNavigation = new ExtendedNavigationPage(new ToolsPage());
favoritesNavigation.Title = AppResources.Favorites;
- favoritesNavigation.Icon = "star";
+ favoritesNavigation.Icon = "star.png";
vaultNavigation.Title = AppResources.MyVault;
- vaultNavigation.Icon = "fa_lock";
+ vaultNavigation.Icon = "fa_lock.png";
toolsNavigation.Title = AppResources.Tools;
- toolsNavigation.Icon = "tools";
+ toolsNavigation.Icon = "tools.png";
settingsNavigation.Title = AppResources.Settings;
- settingsNavigation.Icon = "cogs";
+ settingsNavigation.Icon = "cogs.png";
Children.Add(favoritesNavigation);
Children.Add(vaultNavigation);
diff --git a/src/App/Pages/PasswordHintPage.cs b/src/App/Pages/PasswordHintPage.cs
index 9881556ac..7cf5023af 100644
--- a/src/App/Pages/PasswordHintPage.cs
+++ b/src/App/Pages/PasswordHintPage.cs
@@ -36,7 +36,7 @@ namespace Bit.App.Pages
WinPhone: new Thickness(15, 20));
EmailCell = new FormEntryCell(AppResources.EmailAddress, entryKeyboard: Keyboard.Email,
- useLabelAsPlaceholder: true, imageSource: "envelope", containerPadding: padding);
+ useLabelAsPlaceholder: true, imageSource: "envelope.png", containerPadding: padding);
EmailCell.Entry.ReturnType = Enums.ReturnType.Go;
diff --git a/src/App/Pages/RegisterPage.cs b/src/App/Pages/RegisterPage.cs
index fe625e315..1ace15971 100644
--- a/src/App/Pages/RegisterPage.cs
+++ b/src/App/Pages/RegisterPage.cs
@@ -50,15 +50,15 @@ namespace Bit.App.Pages
WinPhone: new Thickness(15, 20));
PasswordHintCell = new FormEntryCell(AppResources.MasterPasswordHint, useLabelAsPlaceholder: true,
- imageSource: "lightbulb", containerPadding: padding);
+ imageSource: "lightbulb.png", containerPadding: padding);
ConfirmPasswordCell = new FormEntryCell(AppResources.RetypeMasterPassword, isPassword: true,
- nextElement: PasswordHintCell.Entry, useLabelAsPlaceholder: true, imageSource: "lock",
+ nextElement: PasswordHintCell.Entry, useLabelAsPlaceholder: true, imageSource: "lock.png",
containerPadding: padding);
PasswordCell = new FormEntryCell(AppResources.MasterPassword, isPassword: true,
- nextElement: ConfirmPasswordCell.Entry, useLabelAsPlaceholder: true, imageSource: "lock",
+ nextElement: ConfirmPasswordCell.Entry, useLabelAsPlaceholder: true, imageSource: "lock.png",
containerPadding: padding);
EmailCell = new FormEntryCell(AppResources.EmailAddress, nextElement: PasswordCell.Entry,
- entryKeyboard: Keyboard.Email, useLabelAsPlaceholder: true, imageSource: "envelope",
+ entryKeyboard: Keyboard.Email, useLabelAsPlaceholder: true, imageSource: "envelope.png",
containerPadding: padding);
PasswordHintCell.Entry.ReturnType = Enums.ReturnType.Done;
@@ -122,7 +122,7 @@ namespace Bit.App.Pages
await Register();
}, ToolbarItemOrder.Default, 0);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
table.RowHeight = table2.RowHeight = -1;
table.EstimatedRowHeight = table2.EstimatedRowHeight = 70;
diff --git a/src/App/Pages/ScanPage.cs b/src/App/Pages/ScanPage.cs
index d54d022be..a3cd92fda 100644
--- a/src/App/Pages/ScanPage.cs
+++ b/src/App/Pages/ScanPage.cs
@@ -68,7 +68,7 @@ namespace Bit.App.Pages
Children = { _zxing, _overlay }
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Close));
}
diff --git a/src/App/Pages/Settings/SettingsAboutPage.cs b/src/App/Pages/Settings/SettingsAboutPage.cs
index cbb2b61bb..4a7144f7e 100644
--- a/src/App/Pages/Settings/SettingsAboutPage.cs
+++ b/src/App/Pages/Settings/SettingsAboutPage.cs
@@ -24,7 +24,7 @@ namespace Bit.App.Pages
{
var logo = new CachedImage
{
- Source = "logo",
+ Source = "logo.png",
HorizontalOptions = LayoutOptions.Center,
WidthRequest = 282,
HeightRequest = 44
@@ -78,7 +78,7 @@ namespace Bit.App.Pages
Spacing = 0
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Settings/SettingsAddFolderPage.cs b/src/App/Pages/Settings/SettingsAddFolderPage.cs
index 8e6743c40..0b4b10a09 100644
--- a/src/App/Pages/Settings/SettingsAddFolderPage.cs
+++ b/src/App/Pages/Settings/SettingsAddFolderPage.cs
@@ -105,7 +105,7 @@ namespace Bit.App.Pages
Title = AppResources.AddFolder;
Content = table;
ToolbarItems.Add(saveToolBarItem);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Settings/SettingsEditFolderPage.cs b/src/App/Pages/Settings/SettingsEditFolderPage.cs
index b5b01adc3..8daa8dd64 100644
--- a/src/App/Pages/Settings/SettingsEditFolderPage.cs
+++ b/src/App/Pages/Settings/SettingsEditFolderPage.cs
@@ -119,7 +119,7 @@ namespace Bit.App.Pages
Title = AppResources.EditFolder;
Content = mainTable;
ToolbarItems.Add(saveToolBarItem);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Settings/SettingsFeaturesPage.cs b/src/App/Pages/Settings/SettingsFeaturesPage.cs
index 0fc636447..ce2ec90f3 100644
--- a/src/App/Pages/Settings/SettingsFeaturesPage.cs
+++ b/src/App/Pages/Settings/SettingsFeaturesPage.cs
@@ -171,7 +171,7 @@ namespace Bit.App.Pages
Content = StackLayout
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
analyticsTable.RowHeight = -1;
analyticsTable.EstimatedRowHeight = 70;
diff --git a/src/App/Pages/Settings/SettingsHelpPage.cs b/src/App/Pages/Settings/SettingsHelpPage.cs
index a1df0d99d..45c6fb1b1 100644
--- a/src/App/Pages/Settings/SettingsHelpPage.cs
+++ b/src/App/Pages/Settings/SettingsHelpPage.cs
@@ -102,7 +102,7 @@ namespace Bit.App.Pages
Spacing = 0
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Settings/SettingsListFoldersPage.cs b/src/App/Pages/Settings/SettingsListFoldersPage.cs
index 080625d0b..ecb7b35ee 100644
--- a/src/App/Pages/Settings/SettingsListFoldersPage.cs
+++ b/src/App/Pages/Settings/SettingsListFoldersPage.cs
@@ -40,8 +40,8 @@ namespace Bit.App.Pages
ItemsSource = Folders,
ItemTemplate = new DataTemplate(() => new SettingsFolderListViewCell(this))
};
-
- if(Device.RuntimePlatform == Device.iOS)
+
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
@@ -87,7 +87,7 @@ namespace Bit.App.Pages
{
_page = page;
Text = AppResources.Add;
- Icon = "plus";
+ Icon = "plus.png";
ClickAction = () => ClickedItem();
}
diff --git a/src/App/Pages/Settings/SettingsPinPage.cs b/src/App/Pages/Settings/SettingsPinPage.cs
index 0575d27e3..cd827a8fd 100644
--- a/src/App/Pages/Settings/SettingsPinPage.cs
+++ b/src/App/Pages/Settings/SettingsPinPage.cs
@@ -56,7 +56,7 @@ namespace Bit.App.Pages
PinControl.Label.GestureRecognizers.Add(Tgr);
instructionLabel.GestureRecognizers.Add(Tgr);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Settings/SettingsSyncPage.cs b/src/App/Pages/Settings/SettingsSyncPage.cs
index 4fcedc14e..32e368db8 100644
--- a/src/App/Pages/Settings/SettingsSyncPage.cs
+++ b/src/App/Pages/Settings/SettingsSyncPage.cs
@@ -57,7 +57,7 @@ namespace Bit.App.Pages
Padding = new Thickness(15, 0)
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Tools/ToolsAutofillServicePage.cs b/src/App/Pages/Tools/ToolsAutofillServicePage.cs
index f3f3738dc..6490f4b5d 100644
--- a/src/App/Pages/Tools/ToolsAutofillServicePage.cs
+++ b/src/App/Pages/Tools/ToolsAutofillServicePage.cs
@@ -123,7 +123,7 @@ namespace Bit.App.Pages
var tapNotificationImage = new CachedImage
{
- Source = "accessibility_notification",
+ Source = "accessibility_notification.png",
HorizontalOptions = LayoutOptions.Center,
Margin = new Thickness(0, 20, 0, 0),
WidthRequest = 300,
@@ -132,7 +132,7 @@ namespace Bit.App.Pages
var tapNotificationIcon = new CachedImage
{
- Source = "accessibility_notification_icon",
+ Source = "accessibility_notification_icon.png",
HorizontalOptions = LayoutOptions.Center,
Margin = new Thickness(0, 20, 0, 0),
WidthRequest = 300,
diff --git a/src/App/Pages/Tools/ToolsExtensionPage.cs b/src/App/Pages/Tools/ToolsExtensionPage.cs
index b6a5d0a97..245cf99c9 100644
--- a/src/App/Pages/Tools/ToolsExtensionPage.cs
+++ b/src/App/Pages/Tools/ToolsExtensionPage.cs
@@ -205,7 +205,7 @@ namespace Bit.App.Pages
VerticalOptions = LayoutOptions.FillAndExpand
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Close));
}
diff --git a/src/App/Pages/Tools/ToolsPage.cs b/src/App/Pages/Tools/ToolsPage.cs
index 3b88da8c6..8c2dc82fd 100644
--- a/src/App/Pages/Tools/ToolsPage.cs
+++ b/src/App/Pages/Tools/ToolsPage.cs
@@ -33,10 +33,10 @@ namespace Bit.App.Pages
public void Init()
{
GeneratorCell = new ToolsViewCell(AppResources.PasswordGenerator, AppResources.PasswordGeneratorDescription,
- "refresh");
- WebCell = new ToolsViewCell(AppResources.WebVault, AppResources.WebVaultDescription, "globe");
- ShareCell = new ToolsViewCell(AppResources.ShareVault, AppResources.ShareVaultDescription, "share_tools");
- ImportCell = new ToolsViewCell(AppResources.ImportLogins, AppResources.ImportLoginsDescription, "cloudup");
+ "refresh.png");
+ WebCell = new ToolsViewCell(AppResources.WebVault, AppResources.WebVaultDescription, "globe.png");
+ ShareCell = new ToolsViewCell(AppResources.ShareVault, AppResources.ShareVaultDescription, "share_tools.png");
+ ImportCell = new ToolsViewCell(AppResources.ImportLogins, AppResources.ImportLoginsDescription, "cloudup.png");
var section = new TableSection(" ") { GeneratorCell };
@@ -49,7 +49,7 @@ namespace Bit.App.Pages
else
{
AutofillCell = new ToolsViewCell(AppResources.BitwardenAutofillService,
- AppResources.BitwardenAutofillServiceDescription, "upload");
+ AppResources.BitwardenAutofillServiceDescription, "upload.png");
section.Add(AutofillCell);
}
diff --git a/src/App/Pages/Tools/ToolsPasswordGeneratorPage.cs b/src/App/Pages/Tools/ToolsPasswordGeneratorPage.cs
index 445205acf..f52fa5423 100644
--- a/src/App/Pages/Tools/ToolsPasswordGeneratorPage.cs
+++ b/src/App/Pages/Tools/ToolsPasswordGeneratorPage.cs
@@ -87,7 +87,7 @@ namespace Bit.App.Pages
}
};
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
table.RowHeight = -1;
table.EstimatedRowHeight = 44;
diff --git a/src/App/Pages/Vault/VaultAddLoginPage.cs b/src/App/Pages/Vault/VaultAddLoginPage.cs
index 2fa76fcf9..b9b01d2ef 100644
--- a/src/App/Pages/Vault/VaultAddLoginPage.cs
+++ b/src/App/Pages/Vault/VaultAddLoginPage.cs
@@ -223,7 +223,7 @@ namespace Bit.App.Pages
Title = AppResources.AddLogin;
Content = table;
ToolbarItems.Add(saveToolBarItem);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Vault/VaultAttachmentsPage.cs b/src/App/Pages/Vault/VaultAttachmentsPage.cs
index 37227c07b..e352715b1 100644
--- a/src/App/Pages/Vault/VaultAttachmentsPage.cs
+++ b/src/App/Pages/Vault/VaultAttachmentsPage.cs
@@ -192,7 +192,7 @@ namespace Bit.App.Pages
ToolbarItems.Add(saveToolBarItem);
}
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ListView.RowHeight = -1;
NewTable.RowHeight = -1;
diff --git a/src/App/Pages/Vault/VaultCustomFieldsPage.cs b/src/App/Pages/Vault/VaultCustomFieldsPage.cs
index c9d1e9a2a..0b3b43ed3 100644
--- a/src/App/Pages/Vault/VaultCustomFieldsPage.cs
+++ b/src/App/Pages/Vault/VaultCustomFieldsPage.cs
@@ -159,7 +159,7 @@ namespace Bit.App.Pages
{
Content = Table;
ToolbarItems.Add(SaveToolbarItem);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
@@ -216,7 +216,7 @@ namespace Bit.App.Pages
else
{
Content = NoDataLabel;
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Close));
}
diff --git a/src/App/Pages/Vault/VaultEditLoginPage.cs b/src/App/Pages/Vault/VaultEditLoginPage.cs
index 11de6e05d..23104526b 100644
--- a/src/App/Pages/Vault/VaultEditLoginPage.cs
+++ b/src/App/Pages/Vault/VaultEditLoginPage.cs
@@ -250,7 +250,7 @@ namespace Bit.App.Pages
Title = AppResources.EditLogin;
Content = table;
ToolbarItems.Add(saveToolBarItem);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this, AppResources.Cancel));
}
diff --git a/src/App/Pages/Vault/VaultListLoginsPage.cs b/src/App/Pages/Vault/VaultListLoginsPage.cs
index dac332a8a..2114cec49 100644
--- a/src/App/Pages/Vault/VaultListLoginsPage.cs
+++ b/src/App/Pages/Vault/VaultListLoginsPage.cs
@@ -481,7 +481,7 @@ namespace Bit.App.Pages
{
_page = page;
Text = AppResources.Add;
- Icon = "plus";
+ Icon = "plus.png";
}
}
@@ -491,7 +491,7 @@ namespace Bit.App.Pages
{
var image = new CachedImage
{
- Source = "folder",
+ Source = "folder.png",
WidthRequest = 18,
HeightRequest = 18
};
diff --git a/src/App/Pages/Vault/VaultViewLoginPage.cs b/src/App/Pages/Vault/VaultViewLoginPage.cs
index f064c70fd..34e4eb675 100644
--- a/src/App/Pages/Vault/VaultViewLoginPage.cs
+++ b/src/App/Pages/Vault/VaultViewLoginPage.cs
@@ -54,7 +54,7 @@ namespace Bit.App.Pages
{
EditItem = new EditLoginToolBarItem(this, _loginId);
ToolbarItems.Add(EditItem);
- if(Device.RuntimePlatform == Device.iOS)
+ if(Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Windows)
{
ToolbarItems.Add(new DismissModalToolBarItem(this));
}
@@ -399,7 +399,7 @@ namespace Bit.App.Pages
_tapped = tappedAction;
Label.Text = attachment.Name;
Detail.Text = attachment.SizeName;
- Icon.Source = "download";
+ Icon.Source = "download.png";
BackgroundColor = Color.White;
Detail.MinimumWidthRequest = 100;
}
diff --git a/src/App/packages.config b/src/App/packages.config
index b8b202092..c026688e3 100644
--- a/src/App/packages.config
+++ b/src/App/packages.config
@@ -11,7 +11,7 @@
-
+
diff --git a/src/UWP.Images/UWP.Images.projitems b/src/UWP.Images/UWP.Images.projitems
new file mode 100644
index 000000000..5eb620da8
--- /dev/null
+++ b/src/UWP.Images/UWP.Images.projitems
@@ -0,0 +1,50 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ 0be54bbb-7772-4289-bd51-1fdbb0cc2446
+
+
+ UWP.Images
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/UWP.Images/UWP.Images.shproj b/src/UWP.Images/UWP.Images.shproj
new file mode 100644
index 000000000..ec88a8939
--- /dev/null
+++ b/src/UWP.Images/UWP.Images.shproj
@@ -0,0 +1,13 @@
+
+
+
+ 0be54bbb-7772-4289-bd51-1fdbb0cc2446
+ 14.0
+
+
+
+
+
+
+
+
diff --git a/src/UWP.Images/camera.png b/src/UWP.Images/camera.png
new file mode 100644
index 000000000..78202eaa3
Binary files /dev/null and b/src/UWP.Images/camera.png differ
diff --git a/src/UWP.Images/cloudup.png b/src/UWP.Images/cloudup.png
new file mode 100644
index 000000000..f8fd23b8c
Binary files /dev/null and b/src/UWP.Images/cloudup.png differ
diff --git a/src/UWP.Images/cog.png b/src/UWP.Images/cog.png
new file mode 100644
index 000000000..c7b86b95e
Binary files /dev/null and b/src/UWP.Images/cog.png differ
diff --git a/src/UWP.Images/cogs.png b/src/UWP.Images/cogs.png
new file mode 100644
index 000000000..b12b500c0
Binary files /dev/null and b/src/UWP.Images/cogs.png differ
diff --git a/src/UWP.Images/cogs_selected.png b/src/UWP.Images/cogs_selected.png
new file mode 100644
index 000000000..bce1b2939
Binary files /dev/null and b/src/UWP.Images/cogs_selected.png differ
diff --git a/src/UWP.Images/download.png b/src/UWP.Images/download.png
new file mode 100644
index 000000000..631ff3cc0
Binary files /dev/null and b/src/UWP.Images/download.png differ
diff --git a/src/UWP.Images/envelope.png b/src/UWP.Images/envelope.png
new file mode 100644
index 000000000..a026d7e76
Binary files /dev/null and b/src/UWP.Images/envelope.png differ
diff --git a/src/UWP.Images/eye.png b/src/UWP.Images/eye.png
new file mode 100644
index 000000000..9c8fd3734
Binary files /dev/null and b/src/UWP.Images/eye.png differ
diff --git a/src/UWP.Images/eye_slash.png b/src/UWP.Images/eye_slash.png
new file mode 100644
index 000000000..87e0c2a38
Binary files /dev/null and b/src/UWP.Images/eye_slash.png differ
diff --git a/src/UWP.Images/fa_lock.png b/src/UWP.Images/fa_lock.png
new file mode 100644
index 000000000..c7cc70ffb
Binary files /dev/null and b/src/UWP.Images/fa_lock.png differ
diff --git a/src/UWP.Images/fa_lock_selected.png b/src/UWP.Images/fa_lock_selected.png
new file mode 100644
index 000000000..0b550f6e6
Binary files /dev/null and b/src/UWP.Images/fa_lock_selected.png differ
diff --git a/src/UWP.Images/fingerprint.png b/src/UWP.Images/fingerprint.png
new file mode 100644
index 000000000..e6878722d
Binary files /dev/null and b/src/UWP.Images/fingerprint.png differ
diff --git a/src/UWP.Images/folder.png b/src/UWP.Images/folder.png
new file mode 100644
index 000000000..318cc37a1
Binary files /dev/null and b/src/UWP.Images/folder.png differ
diff --git a/src/UWP.Images/globe.png b/src/UWP.Images/globe.png
new file mode 100644
index 000000000..56b1670ae
Binary files /dev/null and b/src/UWP.Images/globe.png differ
diff --git a/src/UWP.Images/icon.png b/src/UWP.Images/icon.png
new file mode 100644
index 000000000..8c066db92
Binary files /dev/null and b/src/UWP.Images/icon.png differ
diff --git a/src/UWP.Images/ion_chevron_right.png b/src/UWP.Images/ion_chevron_right.png
new file mode 100644
index 000000000..f9cde2599
Binary files /dev/null and b/src/UWP.Images/ion_chevron_right.png differ
diff --git a/src/UWP.Images/lightbulb.png b/src/UWP.Images/lightbulb.png
new file mode 100644
index 000000000..8a70cdde4
Binary files /dev/null and b/src/UWP.Images/lightbulb.png differ
diff --git a/src/UWP.Images/lock.png b/src/UWP.Images/lock.png
new file mode 100644
index 000000000..fd1bbb793
Binary files /dev/null and b/src/UWP.Images/lock.png differ
diff --git a/src/UWP.Images/logo.png b/src/UWP.Images/logo.png
new file mode 100644
index 000000000..904731676
Binary files /dev/null and b/src/UWP.Images/logo.png differ
diff --git a/src/UWP.Images/more.png b/src/UWP.Images/more.png
new file mode 100644
index 000000000..af9dcd006
Binary files /dev/null and b/src/UWP.Images/more.png differ
diff --git a/src/UWP.Images/more_selected.png b/src/UWP.Images/more_selected.png
new file mode 100644
index 000000000..414ef723f
Binary files /dev/null and b/src/UWP.Images/more_selected.png differ
diff --git a/src/UWP.Images/notification_sm.png b/src/UWP.Images/notification_sm.png
new file mode 100644
index 000000000..760eff254
Binary files /dev/null and b/src/UWP.Images/notification_sm.png differ
diff --git a/src/UWP.Images/paperclip.png b/src/UWP.Images/paperclip.png
new file mode 100644
index 000000000..5fcf999ae
Binary files /dev/null and b/src/UWP.Images/paperclip.png differ
diff --git a/src/UWP.Images/photo.png b/src/UWP.Images/photo.png
new file mode 100644
index 000000000..484475a34
Binary files /dev/null and b/src/UWP.Images/photo.png differ
diff --git a/src/UWP.Images/plus.png b/src/UWP.Images/plus.png
new file mode 100644
index 000000000..d081b363b
Binary files /dev/null and b/src/UWP.Images/plus.png differ
diff --git a/src/UWP.Images/refresh.png b/src/UWP.Images/refresh.png
new file mode 100644
index 000000000..ecad46609
Binary files /dev/null and b/src/UWP.Images/refresh.png differ
diff --git a/src/UWP.Images/search.png b/src/UWP.Images/search.png
new file mode 100644
index 000000000..c826d6cc2
Binary files /dev/null and b/src/UWP.Images/search.png differ
diff --git a/src/UWP.Images/share.png b/src/UWP.Images/share.png
new file mode 100644
index 000000000..f6ea05419
Binary files /dev/null and b/src/UWP.Images/share.png differ
diff --git a/src/UWP.Images/share_tools.png b/src/UWP.Images/share_tools.png
new file mode 100644
index 000000000..d034c82e2
Binary files /dev/null and b/src/UWP.Images/share_tools.png differ
diff --git a/src/UWP.Images/star.png b/src/UWP.Images/star.png
new file mode 100644
index 000000000..44da06e9e
Binary files /dev/null and b/src/UWP.Images/star.png differ
diff --git a/src/UWP.Images/star_selected.png b/src/UWP.Images/star_selected.png
new file mode 100644
index 000000000..d24d5080a
Binary files /dev/null and b/src/UWP.Images/star_selected.png differ
diff --git a/src/UWP.Images/tools.png b/src/UWP.Images/tools.png
new file mode 100644
index 000000000..4ae8bbe9e
Binary files /dev/null and b/src/UWP.Images/tools.png differ
diff --git a/src/UWP.Images/tools_selected.png b/src/UWP.Images/tools_selected.png
new file mode 100644
index 000000000..44a5d254e
Binary files /dev/null and b/src/UWP.Images/tools_selected.png differ
diff --git a/src/UWP.Images/trash.png b/src/UWP.Images/trash.png
new file mode 100644
index 000000000..97491ec48
Binary files /dev/null and b/src/UWP.Images/trash.png differ
diff --git a/src/UWP.Images/upload.png b/src/UWP.Images/upload.png
new file mode 100644
index 000000000..d192a7ad8
Binary files /dev/null and b/src/UWP.Images/upload.png differ
diff --git a/src/UWP.Images/user.png b/src/UWP.Images/user.png
new file mode 100644
index 000000000..17dfa03fc
Binary files /dev/null and b/src/UWP.Images/user.png differ
diff --git a/src/UWP.Images/yubikey.png b/src/UWP.Images/yubikey.png
new file mode 100644
index 000000000..364c2d06e
Binary files /dev/null and b/src/UWP.Images/yubikey.png differ
diff --git a/src/UWP/App.xaml b/src/UWP/App.xaml
new file mode 100644
index 000000000..561e163f0
--- /dev/null
+++ b/src/UWP/App.xaml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/src/UWP/App.xaml.cs b/src/UWP/App.xaml.cs
new file mode 100644
index 000000000..894c13479
--- /dev/null
+++ b/src/UWP/App.xaml.cs
@@ -0,0 +1,185 @@
+using Acr.UserDialogs;
+using Bit.App.Abstractions;
+using Bit.App.Repositories;
+using Bit.App.Services;
+using Bit.UWP.Services;
+using FFImageLoading.Forms.WinUWP;
+using Plugin.Connectivity;
+using Plugin.Fingerprint;
+using Plugin.Settings.Abstractions;
+using PushNotification.Plugin;
+using SimpleInjector;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.ApplicationModel;
+using Windows.ApplicationModel.Activation;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+using XLabs.Ioc;
+using XLabs.Ioc.SimpleInjectorContainer;
+
+namespace Bit.UWP
+{
+ ///
+ /// Provides application-specific behavior to supplement the default Application class.
+ ///
+ sealed partial class App : Application
+ {
+
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ this.Suspending += OnSuspending;
+ if (!Resolver.IsSet)
+ {
+ SetIoc();
+ }
+
+ }
+
+
+ public ISettings Settings { get; set; }
+
+ ///
+ /// Invoked when the application is launched normally by the end user. Other entry points
+ /// will be used such as when the application is launched to open a specific file.
+ ///
+ /// Details about the launch request and process.
+ protected override void OnLaunched(LaunchActivatedEventArgs e)
+ {
+ Frame rootFrame = Window.Current.Content as Frame;
+
+ // Do not repeat app initialization when the Window already has content,
+ // just ensure that the window is active
+ if (rootFrame == null)
+ {
+ // Create a Frame to act as the navigation context and navigate to the first page
+ rootFrame = new Frame();
+
+ rootFrame.NavigationFailed += OnNavigationFailed;
+
+ Xamarin.Forms.Forms.Init(e);
+
+ if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
+ {
+ //TODO: Load state from previously suspended application
+ }
+
+ // Place the frame in the current Window
+ Window.Current.Content = rootFrame;
+ }
+
+ if (e.PrelaunchActivated == false)
+ {
+ if (rootFrame.Content == null)
+ {
+ // When the navigation stack isn't restored navigate to the first page,
+ // configuring the new page by passing required information as a navigation
+ // parameter
+ rootFrame.Navigate(typeof(MainPage), e.Arguments);
+ }
+ // Ensure the current window is active
+ Window.Current.Activate();
+ }
+ }
+
+ ///
+ /// Invoked when Navigation to a certain page fails
+ ///
+ /// The Frame which failed navigation
+ /// Details about the navigation failure
+ void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
+ {
+ throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
+ }
+
+ ///
+ /// Invoked when application execution is being suspended. Application state is saved
+ /// without knowing whether the application will be terminated or resumed with the contents
+ /// of memory still intact.
+ ///
+ /// The source of the suspend request.
+ /// Details about the suspend request.
+ private void OnSuspending(object sender, SuspendingEventArgs e)
+ {
+ var deferral = e.SuspendingOperation.GetDeferral();
+ //TODO: Save application state and stop any background activity
+ deferral.Complete();
+ }
+
+
+ private void SetIoc()
+ {
+ var container = new Container();
+
+ // Services
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+
+ // Repositories
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+ container.RegisterSingleton();
+
+ // Other
+ container.RegisterSingleton(CrossConnectivity.Current);
+ container.RegisterSingleton(UserDialogs.Instance);
+ container.RegisterSingleton(CrossFingerprint.Current);
+
+ container.RegisterSingleton(Plugin.Settings.CrossSettings.Current);
+
+ // Push
+ var pushListener = new PushNotificationListener();
+ container.RegisterSingleton(pushListener);
+ CrossPushNotification.Initialize(pushListener);
+ container.RegisterSingleton(CrossPushNotification.Current);
+ CachedImageRenderer.Init();
+
+ Resolver.SetResolver(new SimpleInjectorResolver(container));
+ }
+ }
+}
diff --git a/src/UWP/Assets/LockScreenLogo.scale-200.png b/src/UWP/Assets/LockScreenLogo.scale-200.png
new file mode 100644
index 000000000..735f57adb
Binary files /dev/null and b/src/UWP/Assets/LockScreenLogo.scale-200.png differ
diff --git a/src/UWP/Assets/SplashScreen.scale-200.png b/src/UWP/Assets/SplashScreen.scale-200.png
new file mode 100644
index 000000000..023e7f1fe
Binary files /dev/null and b/src/UWP/Assets/SplashScreen.scale-200.png differ
diff --git a/src/UWP/Assets/Square150x150Logo.scale-200.png b/src/UWP/Assets/Square150x150Logo.scale-200.png
new file mode 100644
index 000000000..af49fec1a
Binary files /dev/null and b/src/UWP/Assets/Square150x150Logo.scale-200.png differ
diff --git a/src/UWP/Assets/Square44x44Logo.scale-200.png b/src/UWP/Assets/Square44x44Logo.scale-200.png
new file mode 100644
index 000000000..ce342a2ec
Binary files /dev/null and b/src/UWP/Assets/Square44x44Logo.scale-200.png differ
diff --git a/src/UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/src/UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 000000000..f6c02ce97
Binary files /dev/null and b/src/UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/src/UWP/Assets/StoreLogo.png b/src/UWP/Assets/StoreLogo.png
new file mode 100644
index 000000000..7385b56c0
Binary files /dev/null and b/src/UWP/Assets/StoreLogo.png differ
diff --git a/src/UWP/Assets/Wide310x150Logo.scale-200.png b/src/UWP/Assets/Wide310x150Logo.scale-200.png
new file mode 100644
index 000000000..288995b39
Binary files /dev/null and b/src/UWP/Assets/Wide310x150Logo.scale-200.png differ
diff --git a/src/UWP/MainPage.xaml b/src/UWP/MainPage.xaml
new file mode 100644
index 000000000..2af72d753
--- /dev/null
+++ b/src/UWP/MainPage.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/src/UWP/MainPage.xaml.cs b/src/UWP/MainPage.xaml.cs
new file mode 100644
index 000000000..c887f3d44
--- /dev/null
+++ b/src/UWP/MainPage.xaml.cs
@@ -0,0 +1,52 @@
+using Acr.UserDialogs;
+using Bit.App.Abstractions;
+using Plugin.Connectivity.Abstractions;
+using Plugin.Settings.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+using Xamarin.Forms.Platform.UWP;
+using XLabs.Ioc;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
+
+namespace Bit.UWP
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class MainPage : WindowsPage
+ {
+ public MainPage()
+ {
+ this.InitializeComponent();
+ LoadApplication(new Bit.App.App(
+ null,
+ false,
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve(),
+ Resolver.Resolve()));
+
+ }
+ }
+}
diff --git a/src/UWP/Package.appxmanifest b/src/UWP/Package.appxmanifest
new file mode 100644
index 000000000..9c650da49
--- /dev/null
+++ b/src/UWP/Package.appxmanifest
@@ -0,0 +1,29 @@
+
+
+
+
+
+ UWP
+ Hicham
+ Assets\StoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/UWP/Properties/AssemblyInfo.cs b/src/UWP/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..6a814fbd3
--- /dev/null
+++ b/src/UWP/Properties/AssemblyInfo.cs
@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("UWP")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("UWP")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: ComVisible(false)]
\ No newline at end of file
diff --git a/src/UWP/Properties/Default.rd.xml b/src/UWP/Properties/Default.rd.xml
new file mode 100644
index 000000000..af00722cd
--- /dev/null
+++ b/src/UWP/Properties/Default.rd.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/UWP/Services/AppInfoService.cs b/src/UWP/Services/AppInfoService.cs
new file mode 100644
index 000000000..c7c53a58d
--- /dev/null
+++ b/src/UWP/Services/AppInfoService.cs
@@ -0,0 +1,40 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.ApplicationModel;
+
+namespace Bit.UWP.Services
+{
+ public class AppInfoService : IAppInfoService
+ {
+
+ public string Build
+ {
+ get
+ {
+ Package package = Package.Current;
+ PackageId packageId = package.Id;
+ PackageVersion version = packageId.Version;
+
+ return version.Build.ToString();
+ }
+ }
+
+ public string Version
+ {
+ get
+ {
+ Package package = Package.Current;
+ PackageId packageId = package.Id;
+ PackageVersion version = packageId.Version;
+
+ return $"{version.Major}.{version.Minor}.{version.Build}";
+ }
+ }
+
+ public bool AutofillServiceEnabled => false;
+ }
+}
diff --git a/src/UWP/Services/DeviceActionService.cs b/src/UWP/Services/DeviceActionService.cs
new file mode 100644
index 000000000..dce8c3ece
--- /dev/null
+++ b/src/UWP/Services/DeviceActionService.cs
@@ -0,0 +1,88 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Windows.ApplicationModel.Core;
+using Windows.ApplicationModel.DataTransfer;
+using Windows.Storage;
+using Windows.System;
+using Windows.UI.Core;
+using Xamarin.Forms;
+
+namespace Bit.UWP.Services
+{
+ public class DeviceActionService : IDeviceActionService
+ {
+ public bool CanOpenFile(string fileName)
+ {
+ return true;
+ }
+
+ public void ClearCache()
+ {
+ Task.Run(async () =>
+ {
+ foreach (var item in await ApplicationData.Current.LocalCacheFolder.GetItemsAsync())
+ {
+ await item.DeleteAsync();
+ }
+ }).Wait();
+ }
+
+ public void CopyToClipboard(string text)
+ {
+ DataPackage dataPackage = new DataPackage();
+ dataPackage.RequestedOperation = DataPackageOperation.Copy;
+ dataPackage.SetText(text);
+
+ Clipboard.SetContent(dataPackage);
+ }
+
+ public bool OpenFile(byte[] fileData, string id, string fileName)
+ {
+ try
+ {
+ //the method is synchronous in the interface, so the async method are run synchronously here
+ var storageFolder = ApplicationData.Current.LocalCacheFolder;
+ var file = storageFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting).AsTask().Result;
+ FileIO.WriteBytesAsync(file, fileData).AsTask().Wait();
+ Launcher.LaunchFileAsync(file, new LauncherOptions { DisplayApplicationPicker = true }).AsTask().Wait();
+
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ public Task SelectFileAsync()
+ {
+ var picker = new Windows.Storage.Pickers.FileOpenPicker
+ {
+ ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail,
+ SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary,
+ FileTypeFilter = { "*" }
+ };
+
+ return CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
+ {
+ var file = await picker.PickSingleFileAsync();
+ if (file != null)
+ await SelectFileResult(file);
+ }).AsTask();
+ }
+
+ private async Task SelectFileResult(StorageFile file)
+ {
+ var buffer = await FileIO.ReadBufferAsync(file);
+
+ MessagingCenter.Send(Xamarin.Forms.Application.Current, "SelectFileResult",
+ new Tuple(buffer.ToArray(), file.Name));
+ }
+ }
+}
diff --git a/src/UWP/Services/DeviceInfoService.cs b/src/UWP/Services/DeviceInfoService.cs
new file mode 100644
index 000000000..05418facf
--- /dev/null
+++ b/src/UWP/Services/DeviceInfoService.cs
@@ -0,0 +1,43 @@
+using Bit.App.Abstractions;
+using Microsoft.Toolkit.Uwp.Helpers;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.Graphics.Display;
+using Windows.Devices.SmartCards;
+using Windows.Devices.Enumeration;
+
+namespace Bit.UWP.Services
+{
+ public class DeviceInfoService : IDeviceInfoService
+ {
+ public string Model => SystemInformation.DeviceModel;
+
+ public int Version => SystemInformation.OperatingSystemVersion.Build;
+
+ public float Scale => (float)DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
+
+ public bool NfcEnabled
+ {
+ get
+ {
+ if (!Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.SmartCards.SmartCardEmulator"))
+ return false;
+
+ return Task.Run(async () => await SmartCardEmulator.GetDefaultAsync()).Result != null;
+ }
+ }
+
+ public bool HasCamera
+ {
+ get
+ {
+ var cameraList = Task.Run(async () => await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)).Result;
+
+ return cameraList?.Any() ?? false;
+ }
+ }
+ }
+}
diff --git a/src/UWP/Services/GoogleAnalyticsService.cs b/src/UWP/Services/GoogleAnalyticsService.cs
new file mode 100644
index 000000000..0dcf991c7
--- /dev/null
+++ b/src/UWP/Services/GoogleAnalyticsService.cs
@@ -0,0 +1,45 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Bit.UWP.Services
+{
+ public class GoogleAnalyticsService : IGoogleAnalyticsService
+ {
+ public void Dispatch(Action completionHandler = null)
+ {
+
+ }
+
+ public void SetAppOptOut(bool optOut)
+ {
+
+ }
+
+ public void TrackAppEvent(string eventName, string label = null)
+ {
+
+ }
+
+ public void TrackEvent(string category, string eventName, string label = null)
+ {
+
+ }
+
+ public void TrackException(string message, bool fatal)
+ {
+ }
+
+ public void TrackExtensionEvent(string eventName, string label = null)
+ {
+
+ }
+
+ public void TrackPage(string pageName)
+ {
+ }
+ }
+}
diff --git a/src/UWP/Services/HttpService.cs b/src/UWP/Services/HttpService.cs
new file mode 100644
index 000000000..5b70569b5
--- /dev/null
+++ b/src/UWP/Services/HttpService.cs
@@ -0,0 +1,16 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Bit.App;
+
+namespace Bit.UWP.Services
+{
+ public class HttpService : IHttpService
+ {
+ public ApiHttpClient ApiClient => new ApiHttpClient();
+ public IdentityHttpClient IdentityClient => new IdentityHttpClient();
+ }
+}
diff --git a/src/UWP/Services/KeyDerivationService.cs b/src/UWP/Services/KeyDerivationService.cs
new file mode 100644
index 000000000..98b7a6b96
--- /dev/null
+++ b/src/UWP/Services/KeyDerivationService.cs
@@ -0,0 +1,37 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.WindowsRuntime;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.Security.Cryptography;
+using Windows.Security.Cryptography.Core;
+using Windows.Storage.Streams;
+
+namespace Bit.UWP.Services
+{
+ public class KeyDerivationService : IKeyDerivationService
+ {
+ private const int KeyLength = 32; // 32 bytes
+
+ public byte[] DeriveKey(byte[] password, byte[] salt, uint rounds)
+ {
+ IBuffer buffSalt = salt.AsBuffer();
+ IBuffer buffPassword = password.AsBuffer();
+ KeyDerivationAlgorithmProvider provider = KeyDerivationAlgorithmProvider.OpenAlgorithm(KeyDerivationAlgorithmNames.Pbkdf2Sha256);
+ KeyDerivationParameters pbkdf2Params = KeyDerivationParameters.BuildForPbkdf2(buffSalt, rounds);
+ CryptographicKey keyOriginal = provider.CreateKey(buffPassword);
+
+ IBuffer keyDerived = CryptographicEngine.DeriveKeyMaterial(
+ keyOriginal,
+ pbkdf2Params,
+ KeyLength
+ );
+
+ return keyDerived.ToArray();
+ }
+ }
+}
diff --git a/src/UWP/Services/LocalizeService.cs b/src/UWP/Services/LocalizeService.cs
new file mode 100644
index 000000000..98c86066d
--- /dev/null
+++ b/src/UWP/Services/LocalizeService.cs
@@ -0,0 +1,30 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Globalization;
+using Windows.Globalization;
+
+namespace Bit.UWP.Services
+{
+ public class LocalizeService : ILocalizeService
+ {
+ public CultureInfo GetCurrentCultureInfo()
+ {
+ return CultureInfo.CurrentCulture;
+ }
+
+ public void SetLocale(CultureInfo locale)
+ {
+ CultureInfo.CurrentCulture = locale;
+ CultureInfo.CurrentUICulture = locale;
+ CultureInfo.DefaultThreadCurrentCulture = locale;
+ CultureInfo.DefaultThreadCurrentUICulture = locale;
+
+ ApplicationLanguages.PrimaryLanguageOverride = locale.TwoLetterISOLanguageName;
+
+ }
+ }
+}
diff --git a/src/UWP/Services/LogService.cs b/src/UWP/Services/LogService.cs
new file mode 100644
index 000000000..d4e59906b
--- /dev/null
+++ b/src/UWP/Services/LogService.cs
@@ -0,0 +1,18 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Bit.UWP.Services
+{
+ public class LogService : ILogService
+ {
+ public void WriteLine(string message)
+ {
+ Debug.WriteLine(message);
+ }
+ }
+}
diff --git a/src/UWP/Services/ReflectionService.cs b/src/UWP/Services/ReflectionService.cs
new file mode 100644
index 000000000..896daf9be
--- /dev/null
+++ b/src/UWP/Services/ReflectionService.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Reflection;
+using Bit.App.Abstractions;
+using Bit.App.Controls;
+using Xamarin.Forms;
+
+namespace Bit.UWP.Services
+{
+ public class ReflectionService : IReflectionService
+ {
+ public Func GetVisualElementOnSizeRequest(ExtendedTableView tableView)
+ {
+ //todo
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/UWP/Services/SecureStorageService.cs b/src/UWP/Services/SecureStorageService.cs
new file mode 100644
index 000000000..8f432a2fd
--- /dev/null
+++ b/src/UWP/Services/SecureStorageService.cs
@@ -0,0 +1,58 @@
+using Bit.App.Abstractions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.Security.Credentials;
+
+namespace Bit.UWP.Services
+{
+ public class SecureStorageService : ISecureStorageService
+ {
+ private const string ResourceName = "bitwarden";
+ private PasswordVault _vault = new PasswordVault();
+
+ public bool Contains(string key)
+ {
+ try
+ {
+ var entry = _vault.Retrieve(ResourceName, key);
+ return entry != null;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ public void Delete(string key)
+ {
+ var entry = _vault.Retrieve(ResourceName, key);
+ if (entry != null)
+ _vault.Remove(entry);
+ }
+
+ public byte[] Retrieve(string key)
+ {
+ try
+ {
+ var entry = _vault.Retrieve(ResourceName, key);
+ if (entry != null)
+ return Convert.FromBase64String(entry.Password);
+ else
+ return null;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public void Store(string key, byte[] dataBytes)
+ {
+ var data = Convert.ToBase64String(dataBytes);
+ _vault.Add(new PasswordCredential(ResourceName, key, data));
+ }
+ }
+}
diff --git a/src/UWP/Services/SqlService.cs b/src/UWP/Services/SqlService.cs
new file mode 100644
index 000000000..a9ba7c59d
--- /dev/null
+++ b/src/UWP/Services/SqlService.cs
@@ -0,0 +1,22 @@
+using Bit.App.Abstractions;
+using SQLite;
+using System;
+using System.IO;
+using Windows.ApplicationModel;
+using Windows.Storage;
+
+namespace Bit.UWP.Services
+{
+ public class SqlService : ISqlService
+ {
+ public SQLiteConnection GetConnection()
+ {
+ var sqliteFilename = "bitwarden.db3";
+
+ string path = Path.Combine(ApplicationData.Current.LocalFolder.Path, sqliteFilename);
+ var conn = new SQLite.SQLiteConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.FullMutex | SQLiteOpenFlags.SharedCache);
+ // Return the database connection
+ return conn;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/UWP/UWP.csproj b/src/UWP/UWP.csproj
new file mode 100644
index 000000000..27897badd
--- /dev/null
+++ b/src/UWP/UWP.csproj
@@ -0,0 +1,210 @@
+
+
+
+
+ Debug
+ x86
+ {3A2D5669-ED71-4F2B-BA85-2D36BAA05141}
+ AppContainerExe
+ Properties
+ Bit.UWP
+ Bit.UWP
+ en-US
+ UAP
+ 10.0.15063.0
+ 10.0.10586.0
+ 14
+ 512
+ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ true
+ UWP_TemporaryKey.pfx
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ x86
+ false
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ x86
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\ARM\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ ARM
+ false
+ prompt
+ true
+
+
+ bin\ARM\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ ARM
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ x64
+ false
+ prompt
+ true
+
+
+ bin\x64\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ x64
+ false
+ prompt
+ true
+ true
+
+
+ PackageReference
+
+
+
+ App.xaml
+
+
+ MainPage.xaml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+ 6.3.10
+
+
+ 5.4.0
+
+
+ 2.0.0
+
+
+ 9.0.1
+
+
+ 2.0.147
+
+
+ 1.4.5
+
+
+ 4.0.8
+
+
+ 1.5.166-beta
+
+
+ 3.0.2
+
+
+ 1.2.4
+
+
+ 3.0.1
+
+
+ 2.2.9
+
+
+ 2.3.4.267
+
+
+ 2.0.5782
+
+
+ 2.0.5782
+
+
+
+
+ {b490c5da-639e-4994-abd2-54222b8a348e}
+ App
+
+
+
+
+ Windows Mobile Extensions for the UWP
+
+
+
+
+ 14.0
+
+
+
+
\ No newline at end of file
diff --git a/src/iOS.Core/iOS.Core.csproj b/src/iOS.Core/iOS.Core.csproj
index bdd403ebd..a2cc68663 100644
--- a/src/iOS.Core/iOS.Core.csproj
+++ b/src/iOS.Core/iOS.Core.csproj
@@ -53,8 +53,8 @@
..\..\packages\Xam.Plugins.Settings.3.0.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll
-
- ..\..\packages\sqlite-net-pcl.1.4.118\lib\netstandard1.1\SQLite-net.dll
+
+ ..\..\packages\sqlite-net-pcl.1.5.166-beta\lib\netstandard1.1\SQLite-net.dll
..\..\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\Xamarin.iOS10\SQLitePCLRaw.batteries_green.dll
diff --git a/src/iOS.Core/packages.config b/src/iOS.Core/packages.config
index 701fb3fbe..212e96a10 100644
--- a/src/iOS.Core/packages.config
+++ b/src/iOS.Core/packages.config
@@ -2,7 +2,7 @@
-
+
diff --git a/src/iOS.Extension/iOS.Extension.csproj b/src/iOS.Extension/iOS.Extension.csproj
index 7cce6e14d..7903e7f5f 100644
--- a/src/iOS.Extension/iOS.Extension.csproj
+++ b/src/iOS.Extension/iOS.Extension.csproj
@@ -321,8 +321,8 @@
..\..\packages\SimpleInjector.4.0.8\lib\netstandard1.3\SimpleInjector.dll
-
- ..\..\packages\sqlite-net-pcl.1.4.118\lib\netstandard1.1\SQLite-net.dll
+
+ ..\..\packages\sqlite-net-pcl.1.5.166-beta\lib\netstandard1.1\SQLite-net.dll
..\..\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\Xamarin.iOS10\SQLitePCLRaw.batteries_green.dll
diff --git a/src/iOS.Extension/packages.config b/src/iOS.Extension/packages.config
index 53f123031..b0f081f22 100644
--- a/src/iOS.Extension/packages.config
+++ b/src/iOS.Extension/packages.config
@@ -14,7 +14,7 @@
-
+
diff --git a/src/iOS/iOS.csproj b/src/iOS/iOS.csproj
index 2caed6351..e6d460c00 100644
--- a/src/iOS/iOS.csproj
+++ b/src/iOS/iOS.csproj
@@ -335,8 +335,8 @@
..\..\packages\SimpleInjector.4.0.8\lib\netstandard1.3\SimpleInjector.dll
-
- ..\..\packages\sqlite-net-pcl.1.4.118\lib\netstandard1.1\SQLite-net.dll
+
+ ..\..\packages\sqlite-net-pcl.1.5.166-beta\lib\netstandard1.1\SQLite-net.dll
..\..\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\Xamarin.iOS10\SQLitePCLRaw.batteries_green.dll
diff --git a/src/iOS/packages.config b/src/iOS/packages.config
index 0f5c044ff..27e476071 100644
--- a/src/iOS/packages.config
+++ b/src/iOS/packages.config
@@ -17,7 +17,7 @@
-
+