diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 0841a3c86..000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-#init:
-# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
-#on_finish:
-# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
-#install:
-# - choco install cloc --no-progress
-# - "cloc --vcs git --exclude-dir Resources,store,test,UWP,Properties --include-lang C#,JavaScript,TypeScript,PowerShell"
-# - appveyor DownloadFile https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
-# - appveyor DownloadFile https://aka.ms/vs/15/release/vs_community.exe
-# - vs_community.exe update --wait --quiet --norestart --installPath "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community"
-# - ps: .\src\Android\update-android.ps1
-before_build:
- - nuget restore
- - IF DEFINED keystore_dec_secret nuget install secure-file -ExcludeVersion
- - IF DEFINED google_services_dec_secret secure-file\tools\secure-file -decrypt src\Android\google-services.json.enc -secret %google_services_dec_secret%
-after_build:
- - ps: IF($env:keystore_dec_secret) { .\src\Android\ci-build-apks.ps1 }
-on_success:
- - IF DEFINED play_dec_secret secure-file\tools\secure-file -decrypt store\google\Publisher\play_creds.json.enc -secret %play_dec_secret%
- - IF DEFINED play_dec_secret dotnet store\google\Publisher\bin\Release\netcoreapp2.0\Publisher.dll %APPVEYOR_BUILD_FOLDER%\store\google\Publisher\play_creds.json %APPVEYOR_BUILD_FOLDER%\com.x8bit.bitwarden-%APPVEYOR_BUILD_NUMBER%.apk alpha
-artifacts:
- - path: com.x8bit.bitwarden-%APPVEYOR_BUILD_NUMBER%.apk
- - path: com.x8bit.bitwarden-fdroid-%APPVEYOR_BUILD_NUMBER%.apk
-branches:
- except:
- - l10n_master
-skip_tags: true
-configuration: Release
-image: Visual Studio 2017
diff --git a/bitwarden-mobile.sln b/bitwarden-mobile.sln
deleted file mode 100644
index 417cf1c94..000000000
--- a/bitwarden-mobile.sln
+++ /dev/null
@@ -1,523 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27130.2010
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "src\Android\Android.csproj", "{04B18ED2-B76D-4947-8474-191F8FD2B5E0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS", "src\iOS\iOS.csproj", "{1F78403F-9A28-405B-9289-B9DBEB55F074}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EC730FD9-F623-4B6C-B503-95CDCFBCF277}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App.Test", "test\App.Test\App.Test.csproj", "{A300DCE1-8D10-4267-B96A-CB01AEB7C220}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Extension", "src\iOS.Extension\iOS.Extension.csproj", "{32F5A2D6-F54D-4DA1-AE26-0A980D48F422}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Core", "src\iOS.Core\iOS.Core.csproj", "{B2538ADA-B605-4D6F-ACD2-62A409680F84}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "store", "store", "{92470CBD-9047-4C3C-8EA3-D972D6622D84}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "google", "google", "{2E399654-26A2-46F6-B9CA-1B496A3F370A}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "src\App\App.csproj", "{8A279EE4-4537-4656-9C93-44945E594556}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Publisher", "store\google\Publisher\Publisher.csproj", "{D5D91152-CB01-4F24-A503-304D3A94408B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F0E2E596-C3DB-474A-9C88-7824662894FA}"
- ProjectSection(SolutionItems) = preProject
- .gitignore = .gitignore
- appveyor.yml = appveyor.yml
- crowdin.yml = crowdin.yml
- README.md = README.md
- SECURITY.md = SECURITY.md
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Autofill", "src\iOS.Autofill\iOS.Autofill.csproj", "{C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
- Ad-Hoc|ARM = Ad-Hoc|ARM
- Ad-Hoc|iPhone = Ad-Hoc|iPhone
- Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
- Ad-Hoc|x64 = Ad-Hoc|x64
- Ad-Hoc|x86 = Ad-Hoc|x86
- AppStore|Any CPU = AppStore|Any CPU
- AppStore|ARM = AppStore|ARM
- AppStore|iPhone = AppStore|iPhone
- AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
- AppStore|x64 = AppStore|x64
- AppStore|x86 = AppStore|x86
- Debug|Any CPU = Debug|Any CPU
- Debug|ARM = Debug|ARM
- Debug|iPhone = Debug|iPhone
- Debug|iPhoneSimulator = Debug|iPhoneSimulator
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- FDroid|Any CPU = FDroid|Any CPU
- FDroid|ARM = FDroid|ARM
- FDroid|iPhone = FDroid|iPhone
- FDroid|iPhoneSimulator = FDroid|iPhoneSimulator
- FDroid|x64 = FDroid|x64
- FDroid|x86 = FDroid|x86
- Release|Any CPU = Release|Any CPU
- Release|ARM = Release|ARM
- Release|iPhone = Release|iPhone
- Release|iPhoneSimulator = Release|iPhoneSimulator
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x64.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x86.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|ARM.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|ARM.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|ARM.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x64.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x64.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x64.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x86.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x86.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.AppStore|x86.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|ARM.Build.0 = Debug|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Debug|ARM.Deploy.0 = Debug|Any CPU
- {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|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
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|Any CPU.Deploy.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|ARM.ActiveCfg = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|ARM.Build.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|ARM.Deploy.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhone.Build.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhone.Deploy.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|iPhoneSimulator.Deploy.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x64.ActiveCfg = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x64.Build.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x64.Deploy.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x86.ActiveCfg = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x86.Build.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.FDroid|x86.Deploy.0 = FDroid|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|Any CPU.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|ARM.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|ARM.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|ARM.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|iPhone.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x64.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x64.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x64.Deploy.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x86.ActiveCfg = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x86.Build.0 = Release|Any CPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}.Release|x86.Deploy.0 = Release|Any CPU
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|ARM.ActiveCfg = AppStore|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhone.Build.0 = AppStore|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|x64.ActiveCfg = AppStore|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.AppStore|x86.ActiveCfg = AppStore|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|Any CPU.ActiveCfg = Debug|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|ARM.ActiveCfg = Debug|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|iPhone.Build.0 = Debug|iPhone
- {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|x86.ActiveCfg = Debug|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Debug|x86.Build.0 = Debug|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|Any CPU.ActiveCfg = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|Any CPU.Build.0 = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|ARM.ActiveCfg = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|ARM.Build.0 = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhone.ActiveCfg = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhone.Build.0 = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x64.ActiveCfg = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x64.Build.0 = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x86.ActiveCfg = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.FDroid|x86.Build.0 = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|Any CPU.ActiveCfg = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|ARM.ActiveCfg = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhone.ActiveCfg = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhone.Build.0 = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|x64.ActiveCfg = Release|iPhone
- {1F78403F-9A28-405B-9289-B9DBEB55F074}.Release|x86.ActiveCfg = Release|iPhone
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x64.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Ad-Hoc|x86.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|ARM.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|ARM.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x64.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x64.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x86.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.AppStore|x86.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|ARM.Build.0 = Debug|Any CPU
- {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|x86.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Debug|x86.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|Any CPU.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|Any CPU.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|ARM.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|ARM.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhone.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhone.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|iPhoneSimulator.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x64.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x64.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x86.ActiveCfg = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.FDroid|x86.Build.0 = Debug|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|Any CPU.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|ARM.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|ARM.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|iPhone.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x64.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x64.Build.0 = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x86.ActiveCfg = Release|Any CPU
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220}.Release|x86.Build.0 = Release|Any CPU
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|ARM.ActiveCfg = AppStore|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhone.Build.0 = AppStore|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|x64.ActiveCfg = AppStore|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.AppStore|x86.ActiveCfg = AppStore|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|Any CPU.ActiveCfg = Debug|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|ARM.ActiveCfg = Debug|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|iPhone.Build.0 = Debug|iPhone
- {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|x86.ActiveCfg = Debug|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Debug|x86.Build.0 = Debug|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|Any CPU.ActiveCfg = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|Any CPU.Build.0 = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|ARM.ActiveCfg = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|ARM.Build.0 = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhone.ActiveCfg = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhone.Build.0 = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x64.ActiveCfg = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x64.Build.0 = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x86.ActiveCfg = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.FDroid|x86.Build.0 = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|Any CPU.ActiveCfg = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|ARM.ActiveCfg = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhone.ActiveCfg = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhone.Build.0 = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|x64.ActiveCfg = Release|iPhone
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422}.Release|x86.ActiveCfg = Release|iPhone
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x64.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Ad-Hoc|x86.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|ARM.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|ARM.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhone.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x64.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x64.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x86.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.AppStore|x86.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|iPhone.Build.0 = Debug|Any CPU
- {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|x86.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Debug|x86.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|Any CPU.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|Any CPU.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|ARM.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|ARM.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhone.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhone.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|iPhoneSimulator.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x64.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x64.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x86.ActiveCfg = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.FDroid|x86.Build.0 = Debug|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|ARM.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhone.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhone.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x64.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x64.Build.0 = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x86.ActiveCfg = Release|Any CPU
- {B2538ADA-B605-4D6F-ACD2-62A409680F84}.Release|x86.Build.0 = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|Any CPU.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|ARM.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|ARM.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhone.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x64.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x64.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.AppStore|x86.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|ARM.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhone.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x64.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x64.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x86.ActiveCfg = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Debug|x86.Build.0 = Debug|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|Any CPU.ActiveCfg = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|Any CPU.Build.0 = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|ARM.ActiveCfg = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|ARM.Build.0 = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhone.ActiveCfg = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhone.Build.0 = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhoneSimulator.ActiveCfg = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|iPhoneSimulator.Build.0 = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x64.ActiveCfg = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x64.Build.0 = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x86.ActiveCfg = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.FDroid|x86.Build.0 = FDroid|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|Any CPU.Build.0 = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|ARM.ActiveCfg = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|ARM.Build.0 = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhone.ActiveCfg = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhone.Build.0 = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|x64.ActiveCfg = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|x64.Build.0 = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|x86.ActiveCfg = Release|Any CPU
- {8A279EE4-4537-4656-9C93-44945E594556}.Release|x86.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|Any CPU.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|ARM.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|ARM.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhone.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x64.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x64.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.AppStore|x86.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|ARM.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhone.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x64.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Debug|x86.Build.0 = Debug|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|Any CPU.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|Any CPU.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|ARM.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|ARM.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhone.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhone.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|iPhoneSimulator.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x64.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x64.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x86.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.FDroid|x86.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|Any CPU.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|ARM.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|ARM.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhone.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhone.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x64.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x64.Build.0 = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x86.ActiveCfg = Release|Any CPU
- {D5D91152-CB01-4F24-A503-304D3A94408B}.Release|x86.Build.0 = Release|Any CPU
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|ARM.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhone.Build.0 = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|x64.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.AppStore|x86.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|Any CPU.ActiveCfg = Debug|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|ARM.ActiveCfg = Debug|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhone.Build.0 = Debug|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|x64.ActiveCfg = Debug|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Debug|x86.ActiveCfg = Debug|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|Any CPU.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|Any CPU.Build.0 = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|ARM.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|ARM.Build.0 = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhone.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhone.Build.0 = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x64.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x64.Build.0 = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x86.ActiveCfg = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.FDroid|x86.Build.0 = AppStore|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|Any CPU.ActiveCfg = Release|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|ARM.ActiveCfg = Release|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhone.ActiveCfg = Release|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhone.Build.0 = Release|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|x64.ActiveCfg = Release|iPhone
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F}.Release|x86.ActiveCfg = Release|iPhone
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
- {1F78403F-9A28-405B-9289-B9DBEB55F074} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
- {A300DCE1-8D10-4267-B96A-CB01AEB7C220} = {0D790714-ECF8-4A83-BE4A-E9C84DD1BB5D}
- {32F5A2D6-F54D-4DA1-AE26-0A980D48F422} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
- {B2538ADA-B605-4D6F-ACD2-62A409680F84} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
- {2E399654-26A2-46F6-B9CA-1B496A3F370A} = {92470CBD-9047-4C3C-8EA3-D972D6622D84}
- {8A279EE4-4537-4656-9C93-44945E594556} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
- {D5D91152-CB01-4F24-A503-304D3A94408B} = {2E399654-26A2-46F6-B9CA-1B496A3F370A}
- {C2B7ADCA-5964-43C5-A7C8-D3B6F8023F4F} = {EC730FD9-F623-4B6C-B503-95CDCFBCF277}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {318CB2DF-0118-43A3-AC83-56BADCF71CCD}
- EndGlobalSection
-EndGlobal
diff --git a/src/Android/8bit.keystore.enc b/src/Android/8bit.keystore.enc
deleted file mode 100644
index 0318720af..000000000
Binary files a/src/Android/8bit.keystore.enc and /dev/null differ
diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj
deleted file mode 100644
index c1246e57a..000000000
--- a/src/Android/Android.csproj
+++ /dev/null
@@ -1,1025 +0,0 @@
-
-
-
- Debug
- AnyCPU
- {04B18ED2-B76D-4947-8474-191F8FD2B5E0}
- {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- Library
- Properties
- Bit.Android
- BitwardenAndroid
- 512
- true
- Resources\Resource.Designer.cs
- Off
- Properties\AndroidManifest.xml
- false
- v9.0
- armeabi,armeabi-v7a,x86
- Xamarin.Android.Net.AndroidClientHandler
-
-
-
-
-
-
-
-
- True
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
- True
- None
- PushNotification.Plugin;PushNotification.Plugin.Abstractions;Xamarin.GooglePlayServices.Base;Xamarin.GooglePlayServices.Basement;Xamarin.GooglePlayServices.Measurement;Xamarin.GooglePlayServices.Gcm;BitwardenAndroid;BitwardenApp;SQLite-net;Xamarin.Android.Net
- True
- False
- False
- Xamarin
- False
- 1G
- Xamarin.Android.Net.AndroidClientHandler
- False
- False
- False
- btls
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
- False
- Full
- True
- False
- False
- Xamarin
- False
- False
- False
- False
- False
- 1G
- PushNotification.Plugin;PushNotification.Plugin.Abstractions;Xamarin.GooglePlayServices.Base;Xamarin.GooglePlayServices.Basement;Xamarin.GooglePlayServices.Measurement;Xamarin.GooglePlayServices.Gcm;BitwardenAndroid;BitwardenApp;SQLite-net;Xamarin.Android.Net
- Xamarin.Android.Net.AndroidClientHandler
- armeabi;armeabi-v7a;x86;x86_64;arm64-v8a
- btls
- SHA1withRSA
-
-
- bin\FDroid\
- TRACE;FDROID
- true
- pdbonly
- AnyCPU
- Off
- prompt
- MinimumRecommendedRules.ruleset
- false
- true
- Full
- BitwardenAndroid;BitwardenApp;SQLite-net;Xamarin.Android.Net
- btls
- armeabi;armeabi-v7a;x86;x86_64;arm64-v8a
- 1G
- SHA1withRSA
-
-
-
-
-
- False
- .\Naxam.Ittianyu.BottomNavExtension.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Designer
-
-
- AndroidResource
-
-
- AndroidResource
-
-
- AndroidResource
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {8a279ee4-4537-4656-9c93-44945e594556}
- App
-
-
-
-
- 60.1142.1
-
-
- 4.4.0
-
-
- 27.0.2.1
-
-
- 27.0.2.1
-
-
- 27.0.2.1
-
-
- 27.0.2.1
-
-
- 27.0.2.1
-
-
- 60.1142.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Android/Assets/AboutAssets.txt b/src/Android/Assets/AboutAssets.txt
deleted file mode 100644
index 5ddf08729..000000000
--- a/src/Android/Assets/AboutAssets.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Any raw assets you want to be deployed with your application can be placed in
-this directory (and child directories) and given a Build Action of "AndroidAsset".
-
-These files will be deployed with you package and will be accessible using Android's
-AssetManager, like this:
-
-public class ReadAsset : Activity
-{
- protected override void OnCreate (Bundle bundle)
- {
- base.OnCreate (bundle);
-
- InputStream input = Assets.Open ("my_asset.txt");
- }
-}
-
-Additionally, some Android functions will automatically load asset files:
-
-Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/src/Android/Autofill/AutofillHelpers.cs b/src/Android/Autofill/AutofillHelpers.cs
deleted file mode 100644
index 792a56a71..000000000
--- a/src/Android/Autofill/AutofillHelpers.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Android.Content;
-using Android.Service.Autofill;
-using Android.Widget;
-using System.Linq;
-using Android.App;
-using Bit.App.Abstractions;
-using System.Threading.Tasks;
-using Bit.App.Resources;
-using Bit.App.Enums;
-using Android.Views.Autofill;
-
-namespace Bit.Android.Autofill
-{
- public static class AutofillHelpers
- {
- private static int _pendingIntentId = 0;
-
- // These browser work natively with the autofill framework
- public static HashSet TrustedBrowsers = new HashSet
- {
- "org.mozilla.focus","org.mozilla.klar","com.duckduckgo.mobile.android"
- };
-
- // These browsers work using the compatibility shim for the autofill framework
- public static HashSet CompatBrowsers = new HashSet
- {
- "org.mozilla.firefox","org.mozilla.firefox_beta","com.microsoft.emmx","com.android.chrome",
- "com.chrome.beta","com.android.browser","com.brave.browser","com.opera.browser",
- "com.opera.browser.beta","com.opera.mini.native","com.chrome.dev","com.chrome.canary",
- "com.google.android.apps.chrome","com.google.android.apps.chrome_dev","com.yandex.browser",
- "com.sec.android.app.sbrowser","com.sec.android.app.sbrowser.beta","org.codeaurora.swe.browser",
- "com.amazon.cloud9","mark.via.gp","org.bromite.bromite","org.chromium.chrome","com.kiwibrowser.browser",
- "com.ecosia.android","com.opera.mini.native.beta","org.mozilla.fennec_aurora","com.qwant.liberty",
- "com.opera.touch"
- };
-
- // The URLs are blacklisted from autofilling
- public static HashSet BlacklistedUris = new HashSet
- {
- "androidapp://android", "androidapp://com.x8bit.bitwarden", "androidapp://com.oneplus.applocker"
- };
-
- public static async Task> GetFillItemsAsync(Parser parser, ICipherService service)
- {
- var items = new List();
-
- if(parser.FieldCollection.FillableForLogin)
- {
- var ciphers = await service.GetAllAsync(parser.Uri);
- if(ciphers.Item1.Any() || ciphers.Item2.Any())
- {
- var allCiphers = ciphers.Item1.ToList();
- allCiphers.AddRange(ciphers.Item2.ToList());
- foreach(var cipher in allCiphers)
- {
- items.Add(new FilledItem(cipher));
- }
- }
- }
- else if(parser.FieldCollection.FillableForCard)
- {
- var ciphers = await service.GetAllAsync();
- foreach(var cipher in ciphers.Where(c => c.Type == CipherType.Card))
- {
- items.Add(new FilledItem(cipher));
- }
- }
-
- return items;
- }
-
- public static FillResponse BuildFillResponse(Context context, Parser parser, List items, bool locked)
- {
- var responseBuilder = new FillResponse.Builder();
- if(items != null && items.Count > 0)
- {
- foreach(var item in items)
- {
- var dataset = BuildDataset(context, parser.FieldCollection, item);
- if(dataset != null)
- {
- responseBuilder.AddDataset(dataset);
- }
- }
- }
-
- responseBuilder.AddDataset(BuildVaultDataset(context, parser.FieldCollection, parser.Uri, locked));
- AddSaveInfo(parser, responseBuilder, parser.FieldCollection);
- responseBuilder.SetIgnoredIds(parser.FieldCollection.IgnoreAutofillIds.ToArray());
- return responseBuilder.Build();
- }
-
- public static Dataset BuildDataset(Context context, FieldCollection fields, FilledItem filledItem)
- {
- var datasetBuilder = new Dataset.Builder(
- BuildListView(context.PackageName, filledItem.Name, filledItem.Subtitle, filledItem.Icon));
- if(filledItem.ApplyToFields(fields, datasetBuilder))
- {
- return datasetBuilder.Build();
- }
- return null;
- }
-
- public static Dataset BuildVaultDataset(Context context, FieldCollection fields, string uri, bool locked)
- {
- var intent = new Intent(context, typeof(MainActivity));
- intent.PutExtra("autofillFramework", true);
- if(fields.FillableForLogin)
- {
- intent.PutExtra("autofillFrameworkFillType", (int)CipherType.Login);
- }
- else if(fields.FillableForCard)
- {
- intent.PutExtra("autofillFrameworkFillType", (int)CipherType.Card);
- }
- else if(fields.FillableForIdentity)
- {
- intent.PutExtra("autofillFrameworkFillType", (int)CipherType.Identity);
- }
- else
- {
- return null;
- }
- intent.PutExtra("autofillFrameworkUri", uri);
- var pendingIntent = PendingIntent.GetActivity(context, ++_pendingIntentId, intent,
- PendingIntentFlags.CancelCurrent);
-
- var view = BuildListView(context.PackageName, AppResources.AutofillWithBitwarden,
- locked ? AppResources.VaultIsLocked : AppResources.GoToMyVault, Resource.Drawable.icon);
-
- var datasetBuilder = new Dataset.Builder(view);
- datasetBuilder.SetAuthentication(pendingIntent.IntentSender);
-
- // Dataset must have a value set. We will reset this in the main activity when the real item is chosen.
- foreach(var autofillId in fields.AutofillIds)
- {
- datasetBuilder.SetValue(autofillId, AutofillValue.ForText("PLACEHOLDER"));
- }
-
- return datasetBuilder.Build();
- }
-
- public static RemoteViews BuildListView(string packageName, string text, string subtext, int iconId)
- {
- var view = new RemoteViews(packageName, Resource.Layout.autofill_listitem);
- view.SetTextViewText(Resource.Id.text, text);
- view.SetTextViewText(Resource.Id.text2, subtext);
- view.SetImageViewResource(Resource.Id.icon, iconId);
- return view;
- }
-
- public static void AddSaveInfo(Parser parser, FillResponse.Builder responseBuilder, FieldCollection fields)
- {
- // Docs state that password fields cannot be reliably saved in Compat mode since they will show as
- // masked values.
- var compatBrowser = CompatBrowsers.Contains(parser.PackageName);
- if(compatBrowser && fields.SaveType == SaveDataType.Password)
- {
- return;
- }
-
- var requiredIds = fields.GetRequiredSaveFields();
- if(fields.SaveType == SaveDataType.Generic || requiredIds.Length == 0)
- {
- return;
- }
-
- var saveBuilder = new SaveInfo.Builder(fields.SaveType, requiredIds);
- var optionalIds = fields.GetOptionalSaveIds();
- if(optionalIds.Length > 0)
- {
- saveBuilder.SetOptionalIds(optionalIds);
- }
- if(compatBrowser)
- {
- saveBuilder.SetFlags(SaveFlags.SaveOnAllViewsInvisible);
- }
- responseBuilder.SetSaveInfo(saveBuilder.Build());
- }
- }
-}
\ No newline at end of file
diff --git a/src/Android/Autofill/AutofillService.cs b/src/Android/Autofill/AutofillService.cs
deleted file mode 100644
index cd0b05430..000000000
--- a/src/Android/Autofill/AutofillService.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using Android;
-using Android.App;
-using Android.Content;
-using Android.OS;
-using Android.Runtime;
-using Android.Service.Autofill;
-using Android.Widget;
-using Bit.App;
-using Bit.App.Abstractions;
-using Bit.App.Enums;
-using System.Collections.Generic;
-using System.Linq;
-using XLabs.Ioc;
-
-namespace Bit.Android.Autofill
-{
- [Service(Permission = Manifest.Permission.BindAutofillService, Label = "Bitwarden")]
- [IntentFilter(new string[] { "android.service.autofill.AutofillService" })]
- [MetaData("android.autofill", Resource = "@xml/autofillservice")]
- [Register("com.x8bit.bitwarden.Autofill.AutofillService")]
- public class AutofillService : global::Android.Service.Autofill.AutofillService
- {
- private ICipherService _cipherService;
- private ILockService _lockService;
-
- public async override void OnFillRequest(FillRequest request, CancellationSignal cancellationSignal, FillCallback callback)
- {
- var structure = request.FillContexts?.LastOrDefault()?.Structure;
- if(structure == null)
- {
- return;
- }
-
- var parser = new Parser(structure);
- parser.Parse();
-
- if(!parser.ShouldAutofill)
- {
- return;
- }
-
- if(_lockService == null)
- {
- _lockService = Resolver.Resolve();
- }
-
- List items = null;
- var locked = (await _lockService.GetLockTypeAsync(false)) != LockType.None;
- if(!locked)
- {
- if(_cipherService == null)
- {
- _cipherService = Resolver.Resolve();
- }
-
- items = await AutofillHelpers.GetFillItemsAsync(parser, _cipherService);
- }
-
- // build response
- var response = AutofillHelpers.BuildFillResponse(this, parser, items, locked);
- callback.OnSuccess(response);
- }
-
- public override void OnSaveRequest(SaveRequest request, SaveCallback callback)
- {
- var structure = request.FillContexts?.LastOrDefault()?.Structure;
- if(structure == null)
- {
- return;
- }
-
- var parser = new Parser(structure);
- parser.Parse();
-
- var savedItem = parser.FieldCollection.GetSavedItem();
- if(savedItem == null)
- {
- Toast.MakeText(this, "Unable to save this form.", ToastLength.Short).Show();
- return;
- }
-
- var intent = new Intent(this, typeof(MainActivity));
- intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTop);
- intent.PutExtra("autofillFramework", true);
- intent.PutExtra("autofillFrameworkSave", true);
- intent.PutExtra("autofillFrameworkType", (int)savedItem.Type);
- switch(savedItem.Type)
- {
- case CipherType.Login:
- intent.PutExtra("autofillFrameworkName", parser.Uri
- .Replace(Constants.AndroidAppProtocol, string.Empty)
- .Replace("https://", string.Empty)
- .Replace("http://", string.Empty));
- intent.PutExtra("autofillFrameworkUri", parser.Uri);
- intent.PutExtra("autofillFrameworkUsername", savedItem.Login.Username);
- intent.PutExtra("autofillFrameworkPassword", savedItem.Login.Password);
- break;
- case CipherType.Card:
- intent.PutExtra("autofillFrameworkCardName", savedItem.Card.Name);
- intent.PutExtra("autofillFrameworkCardNumber", savedItem.Card.Number);
- intent.PutExtra("autofillFrameworkCardExpMonth", savedItem.Card.ExpMonth);
- intent.PutExtra("autofillFrameworkCardExpYear", savedItem.Card.ExpYear);
- intent.PutExtra("autofillFrameworkCardCode", savedItem.Card.Code);
- break;
- default:
- Toast.MakeText(this, "Unable to save this type of form.", ToastLength.Short).Show();
- return;
- }
- StartActivity(intent);
- }
- }
-}
diff --git a/src/Android/Autofill/Field.cs b/src/Android/Autofill/Field.cs
deleted file mode 100644
index 36d18de20..000000000
--- a/src/Android/Autofill/Field.cs
+++ /dev/null
@@ -1,199 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using Android.Service.Autofill;
-using Android.Views;
-using Android.Views.Autofill;
-using static Android.App.Assist.AssistStructure;
-using Android.Text;
-using static Android.Views.ViewStructure;
-
-namespace Bit.Android.Autofill
-{
- public class Field
- {
- private List _hints;
-
- public Field(ViewNode node)
- {
- Id = node.Id;
- TrackingId = $"{node.Id}_{node.GetHashCode()}";
- IdEntry = node.IdEntry;
- AutofillId = node.AutofillId;
- AutofillType = node.AutofillType;
- InputType = node.InputType;
- Focused = node.IsFocused;
- Selected = node.IsSelected;
- Clickable = node.IsClickable;
- Visible = node.Visibility == ViewStates.Visible;
- Hints = FilterForSupportedHints(node.GetAutofillHints());
- Hint = node.Hint;
- AutofillOptions = node.GetAutofillOptions()?.ToList();
- HtmlInfo = node.HtmlInfo;
- Node = node;
-
- if(node.AutofillValue != null)
- {
- if(node.AutofillValue.IsList)
- {
- var autofillOptions = node.GetAutofillOptions();
- if(autofillOptions != null && autofillOptions.Length > 0)
- {
- ListValue = node.AutofillValue.ListValue;
- TextValue = autofillOptions[node.AutofillValue.ListValue];
- }
- }
- else if(node.AutofillValue.IsDate)
- {
- DateValue = node.AutofillValue.DateValue;
- }
- else if(node.AutofillValue.IsText)
- {
- TextValue = node.AutofillValue.TextValue;
- }
- else if(node.AutofillValue.IsToggle)
- {
- ToggleValue = node.AutofillValue.ToggleValue;
- }
- }
- }
-
- public SaveDataType SaveType { get; set; } = SaveDataType.Generic;
- public List Hints
- {
- get => _hints;
- set
- {
- _hints = value;
- UpdateSaveTypeFromHints();
- }
- }
- public string Hint { get; set; }
- public int Id { get; private set; }
- public string TrackingId { get; private set; }
- public string IdEntry { get; set; }
- public AutofillId AutofillId { get; private set; }
- public AutofillType AutofillType { get; private set; }
- public InputTypes InputType { get; private set; }
- public bool Focused { get; private set; }
- public bool Selected { get; private set; }
- public bool Clickable { get; private set; }
- public bool Visible { get; private set; }
- public List AutofillOptions { get; set; }
- public string TextValue { get; set; }
- public long? DateValue { get; set; }
- public int? ListValue { get; set; }
- public bool? ToggleValue { get; set; }
- public HtmlInfo HtmlInfo { get; private set; }
- public ViewNode Node { get; private set; }
-
- private void UpdateSaveTypeFromHints()
- {
- SaveType = SaveDataType.Generic;
- if(_hints == null)
- {
- return;
- }
-
- foreach(var hint in _hints)
- {
- switch(hint)
- {
- case View.AutofillHintCreditCardExpirationDate:
- case View.AutofillHintCreditCardExpirationDay:
- case View.AutofillHintCreditCardExpirationMonth:
- case View.AutofillHintCreditCardExpirationYear:
- case View.AutofillHintCreditCardNumber:
- case View.AutofillHintCreditCardSecurityCode:
- SaveType |= SaveDataType.CreditCard;
- break;
- case View.AutofillHintEmailAddress:
- SaveType |= SaveDataType.EmailAddress;
- break;
- case View.AutofillHintPhone:
- case View.AutofillHintName:
- SaveType |= SaveDataType.Generic;
- break;
- case View.AutofillHintPassword:
- SaveType |= SaveDataType.Password;
- SaveType &= ~SaveDataType.EmailAddress;
- SaveType &= ~SaveDataType.Username;
- break;
- case View.AutofillHintPostalAddress:
- case View.AutofillHintPostalCode:
- SaveType |= SaveDataType.Address;
- break;
- case View.AutofillHintUsername:
- SaveType |= SaveDataType.Username;
- break;
- }
- }
- }
-
- public bool ValueIsNull()
- {
- return TextValue == null && DateValue == null && ToggleValue == null;
- }
-
- public override bool Equals(object obj)
- {
- if(this == obj)
- {
- return true;
- }
-
- if(obj == null || GetType() != obj.GetType())
- {
- return false;
- }
-
- var field = obj as Field;
- if(TextValue != null ? !TextValue.Equals(field.TextValue) : field.TextValue != null)
- {
- return false;
- }
-
- if(DateValue != null ? !DateValue.Equals(field.DateValue) : field.DateValue != null)
- {
- return false;
- }
-
- return ToggleValue != null ? ToggleValue.Equals(field.ToggleValue) : field.ToggleValue == null;
- }
-
- public override int GetHashCode()
- {
- var result = TextValue != null ? TextValue.GetHashCode() : 0;
- result = 31 * result + (DateValue != null ? DateValue.GetHashCode() : 0);
- result = 31 * result + (ToggleValue != null ? ToggleValue.GetHashCode() : 0);
- return result;
- }
-
- private static List FilterForSupportedHints(string[] hints)
- {
- return hints?.Where(h => IsValidHint(h)).ToList() ?? new List();
- }
-
- private static bool IsValidHint(string hint)
- {
- switch(hint)
- {
- case View.AutofillHintCreditCardExpirationDate:
- case View.AutofillHintCreditCardExpirationDay:
- case View.AutofillHintCreditCardExpirationMonth:
- case View.AutofillHintCreditCardExpirationYear:
- case View.AutofillHintCreditCardNumber:
- case View.AutofillHintCreditCardSecurityCode:
- case View.AutofillHintEmailAddress:
- case View.AutofillHintPhone:
- case View.AutofillHintName:
- case View.AutofillHintPassword:
- case View.AutofillHintPostalAddress:
- case View.AutofillHintPostalCode:
- case View.AutofillHintUsername:
- return true;
- default:
- return false;
- }
- }
- }
-}
diff --git a/src/Android/Autofill/FieldCollection.cs b/src/Android/Autofill/FieldCollection.cs
deleted file mode 100644
index 05210073a..000000000
--- a/src/Android/Autofill/FieldCollection.cs
+++ /dev/null
@@ -1,348 +0,0 @@
-using System.Collections.Generic;
-using Android.Service.Autofill;
-using Android.Views.Autofill;
-using System.Linq;
-using Android.Text;
-using Android.Views;
-
-namespace Bit.Android.Autofill
-{
- public class FieldCollection
- {
- private List _passwordFields = null;
- private List _usernameFields = null;
- private HashSet _ignoreSearchTerms = new HashSet { "search", "find", "recipient", "edit" };
- private HashSet _passwordTerms = new HashSet { "password", "pswd" };
-
- public List AutofillIds { get; private set; } = new List();
- public SaveDataType SaveType
- {
- get
- {
- if(FillableForLogin)
- {
- return SaveDataType.Password;
- }
- else if(FillableForCard)
- {
- return SaveDataType.CreditCard;
- }
-
- return SaveDataType.Generic;
- }
- }
- public HashSet Hints { get; private set; } = new HashSet();
- public HashSet FocusedHints { get; private set; } = new HashSet();
- public HashSet FieldTrackingIds { get; private set; } = new HashSet();
- public List Fields { get; private set; } = new List();
- public IDictionary> HintToFieldsMap { get; private set; } =
- new Dictionary>();
- public List IgnoreAutofillIds { get; private set; } = new List();
-
- public List PasswordFields
- {
- get
- {
- if(_passwordFields != null)
- {
- return _passwordFields;
- }
-
- if(Hints.Any())
- {
- _passwordFields = new List();
- if(HintToFieldsMap.ContainsKey(View.AutofillHintPassword))
- {
- _passwordFields.AddRange(HintToFieldsMap[View.AutofillHintPassword]);
- }
- }
- else
- {
- _passwordFields = Fields.Where(f => FieldIsPassword(f)).ToList();
- if(!_passwordFields.Any())
- {
- _passwordFields = Fields.Where(f => FieldHasPasswordTerms(f)).ToList();
- }
- }
-
- return _passwordFields;
- }
- }
-
- public List UsernameFields
- {
- get
- {
- if(_usernameFields != null)
- {
- return _usernameFields;
- }
-
- _usernameFields = new List();
- if(Hints.Any())
- {
- if(HintToFieldsMap.ContainsKey(View.AutofillHintEmailAddress))
- {
- _usernameFields.AddRange(HintToFieldsMap[View.AutofillHintEmailAddress]);
- }
- if(HintToFieldsMap.ContainsKey(View.AutofillHintUsername))
- {
- _usernameFields.AddRange(HintToFieldsMap[View.AutofillHintUsername]);
- }
- }
- else
- {
- foreach(var passwordField in PasswordFields)
- {
- var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId)
- .LastOrDefault();
- if(usernameField != null)
- {
- _usernameFields.Add(usernameField);
- }
- }
- }
-
- return _usernameFields;
- }
- }
-
- public bool FillableForLogin => FocusedHintsContain(
- new string[] { View.AutofillHintUsername, View.AutofillHintEmailAddress, View.AutofillHintPassword }) ||
- UsernameFields.Any(f => f.Focused) || PasswordFields.Any(f => f.Focused);
- public bool FillableForCard => FocusedHintsContain(
- new string[] { View.AutofillHintCreditCardNumber, View.AutofillHintCreditCardExpirationMonth,
- View.AutofillHintCreditCardExpirationYear, View.AutofillHintCreditCardSecurityCode});
- public bool FillableForIdentity => FocusedHintsContain(
- new string[] { View.AutofillHintName, View.AutofillHintPhone, View.AutofillHintPostalAddress,
- View.AutofillHintPostalCode });
-
- public bool Fillable => FillableForLogin || FillableForCard || FillableForIdentity;
-
- public void Add(Field field)
- {
- if(field == null || FieldTrackingIds.Contains(field.TrackingId))
- {
- return;
- }
-
- _passwordFields = _usernameFields = null;
-
- FieldTrackingIds.Add(field.TrackingId);
- Fields.Add(field);
- AutofillIds.Add(field.AutofillId);
-
- if(field.Hints != null)
- {
- foreach(var hint in field.Hints)
- {
- Hints.Add(hint);
- if(field.Focused)
- {
- FocusedHints.Add(hint);
- }
-
- if(!HintToFieldsMap.ContainsKey(hint))
- {
- HintToFieldsMap.Add(hint, new List());
- }
-
- HintToFieldsMap[hint].Add(field);
- }
- }
- }
-
- public SavedItem GetSavedItem()
- {
- if(SaveType == SaveDataType.Password)
- {
- var passwordField = PasswordFields.FirstOrDefault(f => !string.IsNullOrWhiteSpace(f.TextValue));
- if(passwordField == null)
- {
- return null;
- }
-
- var savedItem = new SavedItem
- {
- Type = App.Enums.CipherType.Login,
- Login = new SavedItem.LoginItem
- {
- Password = GetFieldValue(passwordField)
- }
- };
-
- var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId).LastOrDefault();
- savedItem.Login.Username = GetFieldValue(usernameField);
-
- return savedItem;
- }
- else if(SaveType == SaveDataType.CreditCard)
- {
- var savedItem = new SavedItem
- {
- Type = App.Enums.CipherType.Card,
- Card = new SavedItem.CardItem
- {
- Number = GetFieldValue(View.AutofillHintCreditCardNumber),
- Name = GetFieldValue(View.AutofillHintName),
- ExpMonth = GetFieldValue(View.AutofillHintCreditCardExpirationMonth, true),
- ExpYear = GetFieldValue(View.AutofillHintCreditCardExpirationYear),
- Code = GetFieldValue(View.AutofillHintCreditCardSecurityCode)
- }
- };
-
- return savedItem;
- }
-
- return null;
- }
-
- public AutofillId[] GetOptionalSaveIds()
- {
- if(SaveType == SaveDataType.Password)
- {
- return UsernameFields.Select(f => f.AutofillId).ToArray();
- }
- else if(SaveType == SaveDataType.CreditCard)
- {
- var fieldList = new List();
- if(HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardSecurityCode))
- {
- fieldList.AddRange(HintToFieldsMap[View.AutofillHintCreditCardSecurityCode]);
- }
- if(HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardExpirationYear))
- {
- fieldList.AddRange(HintToFieldsMap[View.AutofillHintCreditCardExpirationYear]);
- }
- if(HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardExpirationMonth))
- {
- fieldList.AddRange(HintToFieldsMap[View.AutofillHintCreditCardExpirationMonth]);
- }
- if(HintToFieldsMap.ContainsKey(View.AutofillHintName))
- {
- fieldList.AddRange(HintToFieldsMap[View.AutofillHintName]);
- }
- return fieldList.Select(f => f.AutofillId).ToArray();
- }
-
- return new AutofillId[0];
- }
-
- public AutofillId[] GetRequiredSaveFields()
- {
- if(SaveType == SaveDataType.Password)
- {
- return PasswordFields.Select(f => f.AutofillId).ToArray();
- }
- else if(SaveType == SaveDataType.CreditCard && HintToFieldsMap.ContainsKey(View.AutofillHintCreditCardNumber))
- {
- return HintToFieldsMap[View.AutofillHintCreditCardNumber].Select(f => f.AutofillId).ToArray();
- }
-
- return new AutofillId[0];
- }
-
- private bool FocusedHintsContain(IEnumerable hints)
- {
- return hints.Any(h => FocusedHints.Contains(h));
- }
-
- private string GetFieldValue(string hint, bool monthValue = false)
- {
- if(HintToFieldsMap.ContainsKey(hint))
- {
- foreach(var field in HintToFieldsMap[hint])
- {
- var val = GetFieldValue(field, monthValue);
- if(!string.IsNullOrWhiteSpace(val))
- {
- return val;
- }
- }
- }
-
- return null;
- }
-
- private string GetFieldValue(Field field, bool monthValue = false)
- {
- if(field == null)
- {
- return null;
- }
-
- if(!string.IsNullOrWhiteSpace(field.TextValue))
- {
- if(field.AutofillType == AutofillType.List && field.ListValue.HasValue && monthValue)
- {
- if(field.AutofillOptions.Count == 13)
- {
- return field.ListValue.ToString();
- }
- else if(field.AutofillOptions.Count == 12)
- {
- return (field.ListValue + 1).ToString();
- }
- }
- return field.TextValue;
- }
- else if(field.DateValue.HasValue)
- {
- return field.DateValue.Value.ToString();
- }
- else if(field.ToggleValue.HasValue)
- {
- return field.ToggleValue.Value.ToString();
- }
-
- return null;
- }
-
- private bool FieldIsPassword(Field f)
- {
- var inputTypePassword = f.InputType.HasFlag(InputTypes.TextVariationPassword) ||
- f.InputType.HasFlag(InputTypes.TextVariationVisiblePassword) ||
- f.InputType.HasFlag(InputTypes.TextVariationWebPassword);
-
- // For whatever reason, multi-line input types are coming through with TextVariationPassword flags
- if(inputTypePassword && f.InputType.HasFlag(InputTypes.TextVariationPassword) &&
- f.InputType.HasFlag(InputTypes.TextFlagMultiLine))
- {
- inputTypePassword = false;
- }
-
- if(!inputTypePassword && f.HtmlInfo != null && f.HtmlInfo.Tag == "input" &&
- (f.HtmlInfo.Attributes?.Any() ?? false))
- {
- foreach(var a in f.HtmlInfo.Attributes)
- {
- var key = a.First as Java.Lang.String;
- var val = a.Second as Java.Lang.String;
- if(key != null && val != null && key.ToString() == "type" && val.ToString() == "password")
- {
- return true;
- }
- }
- }
-
- return inputTypePassword && !ValueContainsAnyTerms(f.IdEntry, _ignoreSearchTerms) &&
- !ValueContainsAnyTerms(f.Hint, _ignoreSearchTerms);
- }
-
- private bool FieldHasPasswordTerms(Field f)
- {
- return ValueContainsAnyTerms(f.IdEntry, _passwordTerms) || ValueContainsAnyTerms(f.Hint, _passwordTerms);
- }
-
- private bool ValueContainsAnyTerms(string value, HashSet terms)
- {
- if(string.IsNullOrWhiteSpace(value))
- {
- return false;
- }
-
- var lowerValue = value.ToLowerInvariant();
- return terms.Any(t => lowerValue.Contains(t));
- }
- }
-}
\ No newline at end of file
diff --git a/src/Android/Autofill/FilledItem.cs b/src/Android/Autofill/FilledItem.cs
deleted file mode 100644
index 854b4531d..000000000
--- a/src/Android/Autofill/FilledItem.cs
+++ /dev/null
@@ -1,273 +0,0 @@
-using System;
-using Android.Service.Autofill;
-using Android.Views.Autofill;
-using System.Linq;
-using Bit.App.Models;
-using Bit.App.Enums;
-using Android.Views;
-
-namespace Bit.Android.Autofill
-{
- public class FilledItem
- {
- private Lazy _password;
- private Lazy _cardName;
- private string _cardNumber;
- private Lazy _cardExpMonth;
- private Lazy _cardExpYear;
- private Lazy _cardCode;
- private Lazy _idPhone;
- private Lazy _idEmail;
- private Lazy _idUsername;
- private Lazy _idAddress;
- private Lazy _idPostalCode;
-
- public FilledItem(Cipher cipher)
- {
- Name = cipher.Name?.Decrypt(cipher.OrganizationId) ?? "--";
- Type = cipher.Type;
-
- switch(Type)
- {
- case CipherType.Login:
- Subtitle = cipher.Login.Username?.Decrypt(cipher.OrganizationId) ?? string.Empty;
- Icon = Resource.Drawable.login;
- _password = new Lazy(() => cipher.Login.Password?.Decrypt(cipher.OrganizationId));
- break;
- case CipherType.Card:
- Subtitle = cipher.Card.Brand?.Decrypt(cipher.OrganizationId);
- _cardNumber = cipher.Card.Number?.Decrypt(cipher.OrganizationId);
- if(!string.IsNullOrWhiteSpace(_cardNumber) && _cardNumber.Length >= 4)
- {
- if(!string.IsNullOrWhiteSpace(_cardNumber))
- {
- Subtitle += ", ";
- }
- Subtitle += ("*" + _cardNumber.Substring(_cardNumber.Length - 4));
- }
- Icon = Resource.Drawable.card;
- _cardName = new Lazy(() => cipher.Card.CardholderName?.Decrypt(cipher.OrganizationId));
- _cardCode = new Lazy(() => cipher.Card.Code?.Decrypt(cipher.OrganizationId));
- _cardExpMonth = new Lazy(() => cipher.Card.ExpMonth?.Decrypt(cipher.OrganizationId));
- _cardExpYear = new Lazy(() => cipher.Card.ExpYear?.Decrypt(cipher.OrganizationId));
- break;
- case CipherType.Identity:
- var firstName = cipher.Identity?.FirstName?.Decrypt(cipher.OrganizationId) ?? " ";
- var lastName = cipher.Identity?.LastName?.Decrypt(cipher.OrganizationId) ?? " ";
- Subtitle = " ";
- if(!string.IsNullOrWhiteSpace(firstName))
- {
- Subtitle = firstName;
- }
- if(!string.IsNullOrWhiteSpace(lastName))
- {
- if(!string.IsNullOrWhiteSpace(Subtitle))
- {
- Subtitle += " ";
- }
- Subtitle += lastName;
- }
- Icon = Resource.Drawable.id;
- _idPhone = new Lazy(() => cipher.Identity.Phone?.Decrypt(cipher.OrganizationId));
- _idEmail = new Lazy(() => cipher.Identity.Email?.Decrypt(cipher.OrganizationId));
- _idUsername = new Lazy(() => cipher.Identity.Username?.Decrypt(cipher.OrganizationId));
- _idAddress = new Lazy(() =>
- {
- var address = cipher.Identity.Address1?.Decrypt(cipher.OrganizationId);
-
- var address2 = cipher.Identity.Address2?.Decrypt(cipher.OrganizationId);
- if(!string.IsNullOrWhiteSpace(address2))
- {
- if(!string.IsNullOrWhiteSpace(address))
- {
- address += ", ";
- }
-
- address += address2;
- }
-
- var address3 = cipher.Identity.Address3?.Decrypt(cipher.OrganizationId);
- if(!string.IsNullOrWhiteSpace(address3))
- {
- if(!string.IsNullOrWhiteSpace(address))
- {
- address += ", ";
- }
-
- address += address3;
- }
-
- return address;
- });
- _idPostalCode = new Lazy(() => cipher.Identity.PostalCode?.Decrypt(cipher.OrganizationId));
- break;
- default:
- break;
- }
- }
-
- public string Name { get; set; }
- public string Subtitle { get; set; } = string.Empty;
- public int Icon { get; set; } = Resource.Drawable.login;
- public CipherType Type { get; set; }
-
- public bool ApplyToFields(FieldCollection fieldCollection, Dataset.Builder datasetBuilder)
- {
- if(!fieldCollection?.Fields.Any() ?? true)
- {
- return false;
- }
-
- var setValues = false;
- if(Type == CipherType.Login)
- {
- if(fieldCollection.PasswordFields.Any() && !string.IsNullOrWhiteSpace(_password.Value))
- {
- foreach(var f in fieldCollection.PasswordFields)
- {
- var val = ApplyValue(f, _password.Value);
- if(val != null)
- {
- setValues = true;
- datasetBuilder.SetValue(f.AutofillId, val);
- }
- }
- }
-
- if(fieldCollection.UsernameFields.Any() && !string.IsNullOrWhiteSpace(Subtitle))
- {
- foreach(var f in fieldCollection.UsernameFields)
- {
- var val = ApplyValue(f, Subtitle);
- if(val != null)
- {
- setValues = true;
- datasetBuilder.SetValue(f.AutofillId, val);
- }
- }
- }
- }
- else if(Type == CipherType.Card)
- {
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardNumber,
- new Lazy(() => _cardNumber)))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardSecurityCode, _cardCode))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardExpirationMonth, _cardExpMonth, true))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintCreditCardExpirationYear, _cardExpYear))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintName, _cardName))
- {
- setValues = true;
- }
- }
- else if(Type == CipherType.Identity)
- {
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintPhone, _idPhone))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintEmailAddress, _idEmail))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintUsername, _idUsername))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintPostalAddress, _idAddress))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintPostalCode, _idPostalCode))
- {
- setValues = true;
- }
- if(ApplyValue(datasetBuilder, fieldCollection, View.AutofillHintName, new Lazy(() => Subtitle)))
- {
- setValues = true;
- }
- }
-
- return setValues;
- }
-
- private static bool ApplyValue(Dataset.Builder builder, FieldCollection fieldCollection,
- string hint, Lazy value, bool monthValue = false)
- {
- bool setValues = false;
- if(fieldCollection.HintToFieldsMap.ContainsKey(hint) && !string.IsNullOrWhiteSpace(value.Value))
- {
- foreach(var f in fieldCollection.HintToFieldsMap[hint])
- {
- var val = ApplyValue(f, value.Value, monthValue);
- if(val != null)
- {
- setValues = true;
- builder.SetValue(f.AutofillId, val);
- }
- }
- }
- return setValues;
- }
-
- private static AutofillValue ApplyValue(Field field, string value, bool monthValue = false)
- {
- switch(field.AutofillType)
- {
- case AutofillType.Date:
- if(long.TryParse(value, out long dateValue))
- {
- return AutofillValue.ForDate(dateValue);
- }
- break;
- case AutofillType.List:
- if(field.AutofillOptions != null)
- {
- if(monthValue && int.TryParse(value, out int monthIndex))
- {
- if(field.AutofillOptions.Count == 13)
- {
- return AutofillValue.ForList(monthIndex);
- }
- else if(field.AutofillOptions.Count >= monthIndex)
- {
- return AutofillValue.ForList(monthIndex - 1);
- }
- }
-
- for(var i = 0; i < field.AutofillOptions.Count; i++)
- {
- if(field.AutofillOptions[i].Equals(value))
- {
- return AutofillValue.ForList(i);
- }
- }
- }
- break;
- case AutofillType.Text:
- return AutofillValue.ForText(value);
- case AutofillType.Toggle:
- if(bool.TryParse(value, out bool toggleValue))
- {
- return AutofillValue.ForToggle(toggleValue);
- }
- break;
- default:
- break;
- }
-
- return null;
- }
- }
-}
\ No newline at end of file
diff --git a/src/Android/Autofill/Parser.cs b/src/Android/Autofill/Parser.cs
deleted file mode 100644
index 92d80c9b7..000000000
--- a/src/Android/Autofill/Parser.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using static Android.App.Assist.AssistStructure;
-using Android.App.Assist;
-using Bit.App;
-using System.Collections.Generic;
-
-namespace Bit.Android.Autofill
-{
- public class Parser
- {
-
- public static HashSet ExcludedPackageIds = new HashSet
- {
- "android"
- };
-
- private readonly AssistStructure _structure;
- private string _uri;
- private string _packageName;
- private string _webDomain;
-
- public Parser(AssistStructure structure)
- {
- _structure = structure;
- }
-
- public FieldCollection FieldCollection { get; private set; } = new FieldCollection();
- public string Uri
- {
- get
- {
- if(!string.IsNullOrWhiteSpace(_uri))
- {
- return _uri;
- }
-
- if(string.IsNullOrWhiteSpace(WebDomain) && string.IsNullOrWhiteSpace(PackageName))
- {
- _uri = null;
- }
- else if(!string.IsNullOrWhiteSpace(WebDomain))
- {
- _uri = string.Concat("http://", WebDomain);
- }
- else
- {
- _uri = string.Concat(Constants.AndroidAppProtocol, PackageName);
- }
-
- return _uri;
- }
- }
- public string PackageName
- {
- get => _packageName;
- set
- {
- if(string.IsNullOrWhiteSpace(value))
- {
- _packageName = _uri = null;
- }
-
- _packageName = value;
- }
- }
- public string WebDomain
- {
- get => _webDomain;
- set
- {
- if(string.IsNullOrWhiteSpace(value))
- {
- _webDomain = _uri = null;
- }
-
- _webDomain = value;
- }
- }
-
- public bool ShouldAutofill
- {
- get
- {
- return !string.IsNullOrWhiteSpace(Uri) && !AutofillHelpers.BlacklistedUris.Contains(Uri) &&
- FieldCollection != null && FieldCollection.Fillable;
- }
- }
-
- public void Parse()
- {
- for(var i = 0; i < _structure.WindowNodeCount; i++)
- {
- var node = _structure.GetWindowNodeAt(i);
- ParseNode(node.RootViewNode);
- }
-
- if(!AutofillHelpers.TrustedBrowsers.Contains(PackageName) &&
- !AutofillHelpers.CompatBrowsers.Contains(PackageName))
- {
- WebDomain = null;
- }
- }
-
- private void ParseNode(ViewNode node)
- {
- SetPackageAndDomain(node);
- var hints = node.GetAutofillHints();
- var isEditText = node.ClassName == "android.widget.EditText" || node?.HtmlInfo?.Tag == "input";
- if(isEditText || (hints?.Length ?? 0) > 0)
- {
- FieldCollection.Add(new Field(node));
- }
- else
- {
- FieldCollection.IgnoreAutofillIds.Add(node.AutofillId);
- }
-
- for(var i = 0; i < node.ChildCount; i++)
- {
- ParseNode(node.GetChildAt(i));
- }
- }
-
- private void SetPackageAndDomain(ViewNode node)
- {
- if(string.IsNullOrWhiteSpace(PackageName) && !string.IsNullOrWhiteSpace(node.IdPackage) &&
- !ExcludedPackageIds.Contains(node.IdPackage))
- {
- PackageName = node.IdPackage;
- }
- if(string.IsNullOrWhiteSpace(WebDomain) && !string.IsNullOrWhiteSpace(node.WebDomain))
- {
- WebDomain = node.WebDomain;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/Android/Autofill/SavedItem.cs b/src/Android/Autofill/SavedItem.cs
deleted file mode 100644
index 280335199..000000000
--- a/src/Android/Autofill/SavedItem.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using Bit.App.Enums;
-
-namespace Bit.Android.Autofill
-{
- public class SavedItem
- {
- public CipherType Type { get; set; }
- public LoginItem Login { get; set; }
- public CardItem Card { get; set; }
-
- public class LoginItem
- {
- public string Username { get; set; }
- public string Password { get; set; }
- }
-
- public class CardItem
- {
- public string Name { get; set; }
- public string Number { get; set; }
- public string ExpMonth { get; set; }
- public string ExpYear { get; set; }
- public string Code { get; set; }
- }
- }
-}
\ No newline at end of file
diff --git a/src/Android/AutofillActivity.cs b/src/Android/AutofillActivity.cs
deleted file mode 100644
index fac004836..000000000
--- a/src/Android/AutofillActivity.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-using Android.App;
-using Android.Content;
-using Android.OS;
-using Android.Runtime;
-using Android.Views;
-using System;
-
-namespace Bit.Android
-{
- [Activity(Theme = "@style/BitwardenTheme.Splash", WindowSoftInputMode = SoftInput.StateHidden)]
- public class AutofillActivity : Activity
- {
- private DateTime? _lastLaunch = null;
- private string _lastQueriedUri;
-
- public static AutofillCredentials LastCredentials { get; set; }
-
- protected override void OnCreate(Bundle bundle)
- {
- base.OnCreate(bundle);
- LaunchMainActivity(Intent, 932473);
- }
-
- protected override void OnNewIntent(Intent intent)
- {
- base.OnNewIntent(intent);
- LaunchMainActivity(intent, 489729);
- }
-
- protected override void OnDestroy()
- {
- base.OnDestroy();
- }
-
- protected override void OnResume()
- {
- base.OnResume();
- if(!Intent.HasExtra("uri"))
- {
- Finish();
- return;
- }
-
- Intent.RemoveExtra("uri");
- }
-
- protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
- {
- base.OnActivityResult(requestCode, resultCode, data);
- if(data == null)
- {
- LastCredentials = null;
- }
- else
- {
- try
- {
- if(data.GetStringExtra("canceled") != null)
- {
- LastCredentials = null;
- }
- else
- {
- var uri = data.GetStringExtra("uri");
- var username = data.GetStringExtra("username");
- var password = data.GetStringExtra("password");
-
- LastCredentials = new AutofillCredentials
- {
- Username = username,
- Password = password,
- Uri = uri,
- LastUri = _lastQueriedUri
- };
- }
- }
- catch
- {
- LastCredentials = null;
- }
- }
-
- Finish();
- }
-
- private void LaunchMainActivity(Intent callingIntent, int requestCode)
- {
- _lastQueriedUri = callingIntent?.GetStringExtra("uri");
- if(_lastQueriedUri == null)
- {
- Finish();
- return;
- }
-
- var now = DateTime.UtcNow;
- if(_lastLaunch.HasValue && (now - _lastLaunch.Value <= TimeSpan.FromSeconds(2)))
- {
- return;
- }
-
- _lastLaunch = now;
- var intent = new Intent(this, typeof(MainActivity));
- if(!callingIntent.Flags.HasFlag(ActivityFlags.LaunchedFromHistory))
- {
- intent.PutExtra("uri", _lastQueriedUri);
- }
- StartActivityForResult(intent, requestCode);
- }
- }
-}
diff --git a/src/Android/AutofillCredentials.cs b/src/Android/AutofillCredentials.cs
deleted file mode 100644
index 8ee4647ac..000000000
--- a/src/Android/AutofillCredentials.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Bit.Android
-{
- public class AutofillCredentials
- {
- public string Username { get; set; }
- public string Password { get; set; }
- public string Uri { get; set; }
- public string LastUri { get; set; }
- }
-}
diff --git a/src/Android/AutofillService.cs b/src/Android/AutofillService.cs
deleted file mode 100644
index 9ffc31625..000000000
--- a/src/Android/AutofillService.cs
+++ /dev/null
@@ -1,546 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Android.AccessibilityServices;
-using Android.App;
-using Android.Content;
-using Android.OS;
-using Android.Views.Accessibility;
-using Bit.App.Abstractions;
-using XLabs.Ioc;
-using Bit.App.Resources;
-
-namespace Bit.Android
-{
- [Service(Permission = global::Android.Manifest.Permission.BindAccessibilityService, Label = "Bitwarden")]
- [IntentFilter(new string[] { "android.accessibilityservice.AccessibilityService" })]
- [MetaData("android.accessibilityservice", Resource = "@xml/accessibilityservice")]
- public class AutofillService : AccessibilityService
- {
- private NotificationChannel _notificationChannel;
-
- private const string BitwardenTag = "bw_access";
- private const int AutoFillNotificationId = 34573;
- private const string SystemUiPackage = "com.android.systemui";
- private const string BitwardenPackage = "com.x8bit.bitwarden";
- private const string BitwardenWebsite = "vault.bitwarden.com";
-
- private static Dictionary SupportedBrowsers => new List
- {
- new Browser("com.android.chrome", "url_bar"),
- new Browser("com.chrome.beta", "url_bar"),
- new Browser("org.chromium.chrome", "url_bar"),
- new Browser("com.android.browser", "url"),
- new Browser("com.brave.browser", "url_bar"),
- new Browser("com.opera.browser", "url_field"),
- new Browser("com.opera.browser.beta", "url_field"),
- new Browser("com.opera.mini.native", "url_field"),
- new Browser("com.opera.touch", "addressbarEdit"),
- new Browser("com.chrome.dev", "url_bar"),
- new Browser("com.chrome.canary", "url_bar"),
- new Browser("com.google.android.apps.chrome", "url_bar"),
- new Browser("com.google.android.apps.chrome_dev", "url_bar"),
- new Browser("org.codeaurora.swe.browser", "url_bar"),
- new Browser("org.iron.srware", "url_bar"),
- new Browser("com.sec.android.app.sbrowser", "location_bar_edit_text"),
- new Browser("com.sec.android.app.sbrowser.beta", "location_bar_edit_text"),
- new Browser("com.yandex.browser", "bro_omnibar_address_title_text",
- (s) => s.Split(new char[]{' ', ''}).FirstOrDefault()), // 0 = Regular Space, 1 = No-break space (00A0)
- new Browser("org.mozilla.firefox", "url_bar_title"),
- new Browser("org.mozilla.firefox_beta", "url_bar_title"),
- new Browser("org.mozilla.fennec_aurora", "url_bar_title"),
- new Browser("org.mozilla.focus", "display_url"),
- new Browser("org.mozilla.klar", "display_url"),
- new Browser("com.ghostery.android.ghostery", "search_field"),
- new Browser("org.adblockplus.browser", "url_bar_title"),
- new Browser("com.htc.sense.browser", "title"),
- new Browser("com.amazon.cloud9", "url"),
- new Browser("mobi.mgeek.TunnyBrowser", "title"),
- new Browser("com.nubelacorp.javelin", "enterUrl"),
- new Browser("com.jerky.browser2", "enterUrl"),
- new Browser("com.mx.browser", "address_editor_with_progress"),
- new Browser("com.mx.browser.tablet", "address_editor_with_progress"),
- new Browser("com.linkbubble.playstore", "url_text"),
- new Browser("com.ksmobile.cb", "address_bar_edit_text"),
- new Browser("acr.browser.lightning", "search"),
- new Browser("acr.browser.barebones", "search"),
- new Browser("com.microsoft.emmx", "url_bar"),
- new Browser("com.duckduckgo.mobile.android", "omnibarTextInput"),
- new Browser("mark.via.gp", "aw"),
- new Browser("org.bromite.bromite", "url_bar"),
- new Browser("com.kiwibrowser.browser", "url_bar"),
- new Browser("com.ecosia.android", "url_bar"),
- new Browser("com.qwant.liberty", "url_bar_title"),
- }.ToDictionary(n => n.PackageName);
-
- // Known packages to skip
- private static HashSet FilteredPackageNames => new HashSet
- {
- SystemUiPackage,
- "com.google.android.googlequicksearchbox",
- "com.google.android.apps.nexuslauncher",
- "com.google.android.launcher",
- "com.computer.desktop.ui.launcher",
- "com.launcher.notelauncher",
- "com.anddoes.launcher",
- "com.actionlauncher.playstore",
- "ch.deletescape.lawnchair.plah",
- "com.microsoft.launcher",
- "com.teslacoilsw.launcher",
- "com.teslacoilsw.launcher.prime",
- "is.shortcut",
- "me.craftsapp.nlauncher",
- "com.ss.squarehome2"
- };
-
- private readonly IAppSettingsService _appSettings;
- private long _lastNotificationTime = 0;
- private string _lastNotificationUri = null;
- private HashSet _launcherPackageNames = null;
- private DateTime? _lastLauncherSetBuilt = null;
- private TimeSpan _rebuildLauncherSpan = TimeSpan.FromHours(1);
-
- public AutofillService()
- {
- _appSettings = Resolver.Resolve();
- }
-
- public override void OnAccessibilityEvent(AccessibilityEvent e)
- {
- try
- {
- var powerManager = (PowerManager)GetSystemService(PowerService);
- if(Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch && !powerManager.IsInteractive)
- {
- return;
- }
- else if(Build.VERSION.SdkInt < BuildVersionCodes.Lollipop && !powerManager.IsScreenOn)
- {
- return;
- }
-
- if(SkipPackage(e?.PackageName))
- {
- return;
- }
-
- var root = RootInActiveWindow;
- if(root == null || root.PackageName != e.PackageName)
- {
- return;
- }
-
- // var testNodes = GetWindowNodes(root, e, n => n.ViewIdResourceName != null && n.Text != null, false);
- // var testNodesData = testNodes.Select(n => new { id = n.ViewIdResourceName, text = n.Text });
-
- var notificationManager = (NotificationManager)GetSystemService(NotificationService);
- var cancelNotification = true;
-
- switch(e.EventType)
- {
- case EventTypes.ViewFocused:
- if(e.Source == null || !e.Source.Password || !_appSettings.AutofillPasswordField)
- {
- break;
- }
-
- if(e.PackageName == BitwardenPackage)
- {
- CancelNotification(notificationManager);
- break;
- }
-
- if(ScanAndAutofill(root, e, notificationManager, cancelNotification))
- {
- CancelNotification(notificationManager);
- }
- break;
- case EventTypes.WindowContentChanged:
- case EventTypes.WindowStateChanged:
- if(_appSettings.AutofillPasswordField && e.Source.Password)
- {
- break;
- }
- else if(_appSettings.AutofillPasswordField && AutofillActivity.LastCredentials == null)
- {
- if(string.IsNullOrWhiteSpace(_lastNotificationUri))
- {
- CancelNotification(notificationManager);
- break;
- }
-
- var uri = GetUri(root);
- if(uri != _lastNotificationUri)
- {
- CancelNotification(notificationManager);
- }
- else if(uri.StartsWith(App.Constants.AndroidAppProtocol))
- {
- CancelNotification(notificationManager, 30000);
- }
-
- break;
- }
-
- if(e.PackageName == BitwardenPackage)
- {
- CancelNotification(notificationManager);
- break;
- }
-
- if(_appSettings.AutofillPersistNotification)
- {
- var uri = GetUri(root);
- if(uri != null && !uri.Contains(BitwardenWebsite))
- {
- var needToFill = NeedToAutofill(AutofillActivity.LastCredentials, uri);
- if(needToFill)
- {
- var passwordNodes = GetWindowNodes(root, e, n => n.Password, false);
- needToFill = passwordNodes.Any();
- if(needToFill)
- {
- var allEditTexts = GetWindowNodes(root, e, n => EditText(n), false);
- var usernameEditText = allEditTexts.TakeWhile(n => !n.Password).LastOrDefault();
- FillCredentials(usernameEditText, passwordNodes);
-
- allEditTexts.Dispose();
- usernameEditText.Dispose();
- }
- passwordNodes.Dispose();
- }
-
- if(!needToFill)
- {
- NotifyToAutofill(uri, notificationManager);
- cancelNotification = false;
- }
- }
-
- AutofillActivity.LastCredentials = null;
- }
- else
- {
- cancelNotification = ScanAndAutofill(root, e, notificationManager, cancelNotification);
- }
-
- if(cancelNotification)
- {
- CancelNotification(notificationManager);
- }
- break;
- default:
- break;
- }
-
- notificationManager?.Dispose();
- root.Dispose();
- e.Dispose();
- }
- // Suppress exceptions so that service doesn't crash
- catch { }
- }
-
- public override void OnInterrupt()
- {
-
- }
-
- public bool ScanAndAutofill(AccessibilityNodeInfo root, AccessibilityEvent e,
- NotificationManager notificationManager, bool cancelNotification)
- {
- var passwordNodes = GetWindowNodes(root, e, n => n.Password, false);
- if(passwordNodes.Count > 0)
- {
- var uri = GetUri(root);
- if(uri != null && !uri.Contains(BitwardenWebsite))
- {
- if(NeedToAutofill(AutofillActivity.LastCredentials, uri))
- {
- var allEditTexts = GetWindowNodes(root, e, n => EditText(n), false);
- var usernameEditText = allEditTexts.TakeWhile(n => !n.Password).LastOrDefault();
- FillCredentials(usernameEditText, passwordNodes);
-
- allEditTexts.Dispose();
- usernameEditText.Dispose();
- }
- else
- {
- NotifyToAutofill(uri, notificationManager);
- cancelNotification = false;
- }
- }
-
- AutofillActivity.LastCredentials = null;
- }
- else if(AutofillActivity.LastCredentials != null)
- {
- System.Threading.Tasks.Task.Run(async () =>
- {
- await System.Threading.Tasks.Task.Delay(1000);
- AutofillActivity.LastCredentials = null;
- });
- }
-
- passwordNodes.Dispose();
- return cancelNotification;
- }
-
- public void CancelNotification(NotificationManager notificationManager, long limit = 250)
- {
- if(Java.Lang.JavaSystem.CurrentTimeMillis() - _lastNotificationTime < limit)
- {
- return;
- }
-
- _lastNotificationUri = null;
- notificationManager?.Cancel(AutoFillNotificationId);
- }
-
- private string GetUri(AccessibilityNodeInfo root)
- {
- var uri = string.Concat(App.Constants.AndroidAppProtocol, root.PackageName);
- if(SupportedBrowsers.ContainsKey(root.PackageName))
- {
- var addressNode = root.FindAccessibilityNodeInfosByViewId(
- $"{root.PackageName}:id/{SupportedBrowsers[root.PackageName].UriViewId}").FirstOrDefault();
- if(addressNode != null)
- {
- uri = ExtractUri(uri, addressNode, SupportedBrowsers[root.PackageName]);
- addressNode.Dispose();
- }
- }
-
- return uri;
- }
-
- private string ExtractUri(string uri, AccessibilityNodeInfo addressNode, Browser browser)
- {
- if(addressNode?.Text != null)
- {
- uri = browser.GetUriFunction(addressNode.Text)?.Trim();
- if(uri != null && uri.Contains("."))
- {
- if(!uri.Contains("://") && !uri.Contains(" "))
- {
- uri = string.Concat("http://", uri);
- }
- else if(Build.VERSION.SdkInt <= BuildVersionCodes.KitkatWatch)
- {
- var parts = uri.Split(new string[] { ". " }, StringSplitOptions.None);
- if(parts.Length > 1)
- {
- var urlPart = parts.FirstOrDefault(p => p.StartsWith("http"));
- if(urlPart != null)
- {
- uri = urlPart.Trim();
- }
- }
- }
- }
- }
-
- return uri;
- }
-
- ///
- /// Check to make sure it is ok to autofill still on the current screen
- ///
- private bool NeedToAutofill(AutofillCredentials creds, string currentUriString)
- {
- if(creds == null)
- {
- return false;
- }
-
- Uri lastUri, currentUri;
- if(Uri.TryCreate(creds.LastUri, UriKind.Absolute, out lastUri) &&
- Uri.TryCreate(currentUriString, UriKind.Absolute, out currentUri) &&
- lastUri.Host == currentUri.Host)
- {
- return true;
- }
-
- return false;
- }
-
- private static bool EditText(AccessibilityNodeInfo n)
- {
- return n?.ClassName?.Contains("EditText") ?? false;
- }
-
- private void NotifyToAutofill(string uri, NotificationManager notificationManager)
- {
- if(notificationManager == null || string.IsNullOrWhiteSpace(uri))
- {
- return;
- }
-
- var now = Java.Lang.JavaSystem.CurrentTimeMillis();
- var intent = new Intent(this, typeof(AutofillActivity));
- intent.PutExtra("uri", uri);
- intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
- var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.UpdateCurrent);
-
- var notificationContent = Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch ?
- AppResources.BitwardenAutofillServiceNotificationContent :
- AppResources.BitwardenAutofillServiceNotificationContentOld;
-
- var builder = new Notification.Builder(this);
- builder.SetSmallIcon(Resource.Drawable.notification_sm)
- .SetContentTitle(AppResources.BitwardenAutofillService)
- .SetContentText(notificationContent)
- .SetTicker(notificationContent)
- .SetWhen(now)
- .SetContentIntent(pendingIntent);
-
- if(Build.VERSION.SdkInt > BuildVersionCodes.KitkatWatch)
- {
- builder.SetVisibility(NotificationVisibility.Secret)
- .SetColor(global::Android.Support.V4.Content.ContextCompat.GetColor(ApplicationContext,
- Resource.Color.primary));
- }
-
- if(Build.VERSION.SdkInt >= BuildVersionCodes.O)
- {
- if(_notificationChannel == null)
- {
- _notificationChannel = new NotificationChannel("bitwarden_autofill_service",
- AppResources.AutofillService, NotificationImportance.Low);
- notificationManager.CreateNotificationChannel(_notificationChannel);
- }
- builder.SetChannelId(_notificationChannel.Id);
- }
-
- if(/*Build.VERSION.SdkInt <= BuildVersionCodes.N && */_appSettings.AutofillPersistNotification)
- {
- builder.SetPriority(-2);
- }
-
- _lastNotificationTime = now;
- _lastNotificationUri = uri;
- notificationManager.Notify(AutoFillNotificationId, builder.Build());
-
- builder.Dispose();
- }
-
- private void FillCredentials(AccessibilityNodeInfo usernameNode, IEnumerable passwordNodes)
- {
- FillEditText(usernameNode, AutofillActivity.LastCredentials?.Username);
- foreach(var n in passwordNodes)
- {
- FillEditText(n, AutofillActivity.LastCredentials?.Password);
- }
- }
-
- private static void FillEditText(AccessibilityNodeInfo editTextNode, string value)
- {
- if(editTextNode == null || value == null)
- {
- return;
- }
-
- var bundle = new Bundle();
- bundle.PutString(AccessibilityNodeInfo.ActionArgumentSetTextCharsequence, value);
- editTextNode.PerformAction(global::Android.Views.Accessibility.Action.SetText, bundle);
- }
-
- private NodeList GetWindowNodes(AccessibilityNodeInfo n, AccessibilityEvent e,
- Func condition, bool disposeIfUnused, NodeList nodes = null,
- int recursionDepth = 0)
- {
- if(nodes == null)
- {
- nodes = new NodeList();
- }
-
- var dispose = disposeIfUnused;
- if(n != null && recursionDepth < 50)
- {
- if(n.WindowId == e.WindowId && !(n.ViewIdResourceName?.StartsWith(SystemUiPackage) ?? false) && condition(n))
- {
- dispose = false;
- nodes.Add(n);
- }
-
- for(var i = 0; i < n.ChildCount; i++)
- {
- var childNode = n.GetChild(i);
- if(i > 100)
- {
- global::Android.Util.Log.Info(BitwardenTag, "Too many child iterations.");
- break;
- }
- else if(childNode.GetHashCode() == n.GetHashCode())
- {
- global::Android.Util.Log.Info(BitwardenTag,
- "Child node is the same as parent for some reason.");
- }
- else
- {
- GetWindowNodes(childNode, e, condition, true, nodes, recursionDepth++);
- }
- }
- }
-
- if(dispose)
- {
- n?.Dispose();
- }
-
- return nodes;
- }
-
- private bool SkipPackage(string eventPackageName)
- {
- if(string.IsNullOrWhiteSpace(eventPackageName) || FilteredPackageNames.Contains(eventPackageName)
- || eventPackageName.Contains("launcher"))
- {
- return true;
- }
-
- if(_launcherPackageNames == null || _lastLauncherSetBuilt == null ||
- (DateTime.Now - _lastLauncherSetBuilt.Value) > _rebuildLauncherSpan)
- {
- // refresh launcher list every now and then
- _lastLauncherSetBuilt = DateTime.Now;
- var intent = new Intent(Intent.ActionMain);
- intent.AddCategory(Intent.CategoryHome);
- var resolveInfo = PackageManager.QueryIntentActivities(intent, 0);
- _launcherPackageNames = resolveInfo.Select(ri => ri.ActivityInfo.PackageName).ToHashSet();
- }
-
- return _launcherPackageNames.Contains(eventPackageName);
- }
-
- public class Browser
- {
- public Browser(string packageName, string uriViewId)
- {
- PackageName = packageName;
- UriViewId = uriViewId;
- }
-
- public Browser(string packageName, string uriViewId, Func getUriFunction)
- : this(packageName, uriViewId)
- {
- GetUriFunction = getUriFunction;
- }
-
- public string PackageName { get; set; }
- public string UriViewId { get; set; }
- public Func GetUriFunction { get; set; } = (s) => s;
- }
-
- public class NodeList : List, IDisposable
- {
- public void Dispose()
- {
- foreach(var item in this)
- {
- item.Dispose();
- }
- }
- }
- }
-}
diff --git a/src/Android/Controls/CustomButtonRenderer.cs b/src/Android/Controls/CustomButtonRenderer.cs
deleted file mode 100644
index 18b681662..000000000
--- a/src/Android/Controls/CustomButtonRenderer.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-using System.ComponentModel;
-using Android.Content;
-using Bit.Android.Controls;
-using Xamarin.Forms;
-using Xamarin.Forms.Platform.Android;
-
-[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))]
-namespace Bit.Android.Controls
-{
- public class CustomButtonRenderer : ButtonRenderer
- {
- public CustomButtonRenderer(Context context)
- : base(context)
- { }
-
- protected override void OnElementChanged(ElementChangedEventArgs